[ 개인과제 ]
5단계 : JWT > JwtUtil
1. 초기설정
- Header KEY값
- 사용자 권한의 KEY
- Token 식별자
- 토큰 만료 시간
// Header KEY 값
public static final String AUTHORIZATION_HEADER = "Authorization"; // cookie의 name 값
// 사용자 권한 값의 KEY
public static final String AUTHORIZATION_KEY = "auth"; // 권한을 가져오기 위한 key값
// Token 식별자
public static final String BEARER_PREFIX = "Bearer "; // 우리가 만들 토큰 앞에 붙이는 것 [규칙 : "bearer "이 붙어있으면 토큰이라는 의미]
// 토큰 만료시간
private final long TOKEN_TIME = 60 * 60 * 1000L; // 60분
@Value("${jwt.secret.key}") // Base64 Encode 한 SecretKey
private String secretKey; // application.porperties에 설정한 secretKey
private Key key; // secret key를 관리하는 방법 : secret key를 담을 객체
private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 로그 설정 : 로깅(동작정보를 시간순으로 기록)
public static final Logger logger = LoggerFactory.getLogger("JWT 관련 로그");
@PostConstruct
public void init() {
byte[] bytes = Base64.getDecoder().decode(secretKey);
key = Keys.hmacShaKeyFor(bytes);
}
2. JWT 생성
- bearer, id, 사용자 권한, 만료시간, 발급일 등을 포함하여 토큰 생성
public String createToken(String username, UserRoleEnum role) {
Date date = new Date();
return BEARER_PREFIX +
Jwts.builder()
.setSubject(username) // 사용자 식별자값(ID)
.claim(AUTHORIZATION_KEY, role) // 사용자 권한 : key, value
.setExpiration(new Date(date.getTime() + TOKEN_TIME)) // 만료 시간
.setIssuedAt(date) // 발급일
.signWith(key, signatureAlgorithm) // 암호화 알고리즘
.compact();
}
3. JWT 검증
- 유효한 signature인지
- 기한이 만료되지 않았는지 등등
public boolean validateToken(String token) {
try {
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (SecurityException | MalformedJwtException | SignatureException e) {
logger.error("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.");
} catch (ExpiredJwtException e) {
logger.error("Expired JWT token, 만료된 JWT token 입니다.");
} catch (UnsupportedJwtException e) {
logger.error("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.");
} catch (IllegalArgumentException e) {
logger.error("JWT claims is empty, 잘못된 JWT 토큰 입니다.");
}
return false;
}
4. JWT에서 사용자 정보 가져오기
public Claims getUserInfoFromToken(String token) {
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
}
'스파르타 내배캠' 카테고리의 다른 글
[TIL] #29. JWT (0) | 2024.06.03 |
---|---|
[TIL] #28. 인증/인가 (0) | 2024.05.30 |
[TIL] #26. entity 연결 (0) | 2024.05.28 |
[TIL] #25. HTTP 응답 상태 반환 (0) | 2024.05.28 |
[TIL] #24. JWT (0) | 2024.05.24 |