[java] 토큰 기반 인증과 JWT

개요

토큰 기반 인증은 웹 애플리케이션의 인증과 권한 부여를 처리하기 위한 자주 사용되는 방법입니다. 이 기술은 사용자가 로그인 인증 후에 발급된 토큰을 사용하여 액세스를 인증하고 권한을 확인합니다. 그 중에서도 JWT (JSON Web Token)는 토큰 기반 인증에서 널리 사용되는 표준화된 방식입니다.

JWT란?

JWT는 클레임 (Claims) 기반의 토큰으로, 정보를 JSON 객체 형식으로 안전하게 전송하는 것을 목적으로 합니다. 이 토큰은 사용자 인증 정보와 추가적인 메타데이터를 포함하고 있으며, 서버와 클라이언트가 통신할 때 토큰을 사용하여 인증과 권한을 검증합니다.

JWT는 세 부분으로 구성됩니다:

  1. Header: 토큰의 유형 (typ)과 사용된 암호화 알고리즘 (alg) 등의 메타데이터 정보를 JSON 형식으로 포함합니다.
  2. Payload: 클레임 정보를 담고 있으며 사용자의 식별자, 권한, 만료 시간 등을 포함합니다.
  3. Signature: 토큰의 유효성을 검증하기 위한 서명입니다. 이는 헤더와 페이로드, 비밀 키 (secret key)를 사용하여 생성됩니다.

JWT의 장점

JWT의 주요 장점은 다음과 같습니다:

JWT 사용 예시

JWT를 사용하여 인증 및 권한 부여를 구현하는 예제 코드입니다:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

// 토큰 생성
public String generateToken(UserDetails userDetails) {
    Map<String, Object> claims = new HashMap<>();
    claims.put("sub", userDetails.getUsername());
    claims.put("exp", new Date(System.currentTimeMillis() + 1000 * 60 * 60));

    return Jwts.builder()
            .setClaims(claims)
            .setSubject(userDetails.getUsername())
            .setIssuedAt(new Date(System.currentTimeMillis()))
            .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
}

// 토큰 유효성 검증
public Boolean validateToken(String token) {
    try {
        Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
        return true;
    } catch (Exception e) {
        return false;
    }
}

// 토큰에서 사용자 정보 얻기
public String getUsernameFromToken(String token) {
    Claims claims = Jwts.parser()
            .setSigningKey(secretKey)
            .parseClaimsJws(token)
            .getBody();

    return claims.getSubject();
}

위의 예시 코드에서는 io.jsonwebtoken 패키지를 사용하여 JWT를 생성, 유효성 검증 및 클레임 정보를 추출하는 방법을 보여줍니다.

결론

토큰 기반 인증과 JWT는 모던 웹 애플리케이션에서 인증과 권한 부여를 처리하는 데 널리 사용되는 방법입니다. JWT는 토큰의 안전한 전송과 편리한 검증을 위해 JSON 형식을 사용하는 간단하고 효과적인 방법입니다. 애플리케이션의 보안 및 사용자 경험을 향상시키기 위해 JWT를 사용할 수 있습니다.


참고 문헌: