JWTUtil 클래스는 JWT 토큰을 생성하고, 서명하며, 검증하는 기능을 제공한다.
Spring Security 필터와 함께 사용하면, JWT 기반 인증 시스템을 구현이 가능하다.
package com.team29.ArtifactV2.global.security.jwt;
import ...
@Component
public class JWTUtil {
private final SecretKey secretKey;
public JWTUtil(@Value("${spring.jwt.secret}") String secret) {
secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8),
Jwts.SIG.HS256.key().build().getAlgorithm());
}
public String getUsername(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.get("username", String.class);
}
public String getRole(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.get("role", String.class);
}
public Boolean isExpired(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.getExpiration()
.before(new Date());
}
public String createJwt(String category, String username, String role, Long expiredMs) {
return Jwts.builder()
.claim("category", category)
.claim("username", username)
.claim("role", role)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(secretKey)
.compact();
}
public String getCategory(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.get("category", String.class);
}
}
클래스 필드 및 생성자
private final SecretKey secretKey;
public JWTUtil(@Value("${spring.jwt.secret}") String secret) {
secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8),
Jwts.SIG.HS256.key().build().getAlgorithm());
}
getUsername(String token)
public String getUsername(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.get("username", String.class);
}
getRole(String token)
public String getRole(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.get("role", String.class);
}
isExpired(String token)
public Boolean isExpired(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.getExpiration()
.before(new Date());
}
createJwt()
public String createJwt(String category, String username, String role, Long expiredMs) {
return Jwts.builder()
.claim("category", category)
.claim("username", username)
.claim("role", role)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(secretKey)
.compact();
}
category
, username
, role
과 같은 사용자 정보를 클레임으로 설정하여 JWT 토큰을 만든다.issuedAt
: 토큰의 발급 시간을 설정한다.expiration
: 토큰 만료 시간을 설정한다.expiredMs
는 토큰 발급 시점으로부터 몇 밀리초 후에 만료되는지를 설정한다.signWith(secretKey)
: 토큰을 서명하여, 이후 토큰 검증 시에 서명이 유효한지 확인할 수 있게 한다.compact()
를 통해 완성된 JWT 토큰 문자열을 생성하여 반환한다.getCategory(String token)
public String getCategory(String token) {
return Jwts.parser().verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload()
.get("category", String.class);
}