[java] 토큰 기반 인증과 JWT
개요
토큰 기반 인증은 웹 애플리케이션의 인증과 권한 부여를 처리하기 위한 자주 사용되는 방법입니다. 이 기술은 사용자가 로그인 인증 후에 발급된 토큰을 사용하여 액세스를 인증하고 권한을 확인합니다. 그 중에서도 JWT (JSON Web Token)는 토큰 기반 인증에서 널리 사용되는 표준화된 방식입니다.
JWT란?
JWT는 클레임 (Claims) 기반의 토큰으로, 정보를 JSON 객체 형식으로 안전하게 전송하는 것을 목적으로 합니다. 이 토큰은 사용자 인증 정보와 추가적인 메타데이터를 포함하고 있으며, 서버와 클라이언트가 통신할 때 토큰을 사용하여 인증과 권한을 검증합니다.
JWT는 세 부분으로 구성됩니다:
- Header: 토큰의 유형 (typ)과 사용된 암호화 알고리즘 (alg) 등의 메타데이터 정보를 JSON 형식으로 포함합니다.
- Payload: 클레임 정보를 담고 있으며 사용자의 식별자, 권한, 만료 시간 등을 포함합니다.
- 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를 사용할 수 있습니다.
참고 문헌: