반응형
자바에서 JWT를 다루는 라이브러리 중 JJWT 가 있다.
https://github.com/jwtk/jjwt?tab=readme-ov-file#jws-example
기존 프로젝트에서 0.11.5 버전을 쓰고 있었는데, 이번에 개인 프로젝트에서 0.12.5 버전으로 올리면서 바뀐 부분을 다뤄보려고 한다.
우선 Key 부분이 SecretKey와 PublicKey 로 나뉘었다.
또 jwtParser 부분도 parserBuilder 가 parse로 바뀌면서 setSigningKey 도 verifyWith 로 메서드가 변경되었다.
// 0.11.5
@Value("${jwt.secret.key}")
private String secretKey;
private Key key;
private JwtParser jwtParser;
@PostConstruct
public void init() {
byte[] bytes = Base64.getDecoder().decode(secretKey);
key = Keys.hmacShaKeyFor(bytes);
jwtParser = Jwts.parserBuilder().setSigningKey(key).build();
}
// 0.12.5
@Value("${jwt.secret.key}")
private String secretKey; // JWT 생성 및 검증에 사용할 비밀키 (Base 64로 Encode)
private SecretKey key; // JWT 생성 및 검증에 사용할 Key 인터페이스를 구현한 객체
private JwtParser jwtParser; // JWT 검증을 위한 JwtParser 객체 (유효성 검사 및 Payload 추출)
@PostConstruct
public void init() {
byte[] bytes = Base64.getDecoder().decode(secretKey); // secretKey -> Base64 디코딩하여 byte 배열로 저장
key = Keys.hmacShaKeyFor(bytes);
jwtParser = Jwts.parser().verifyWith(key).build();
}
또 Jwt 생성 시에도, set-필드가 그냥 필드이름으로 메서드명이 변경되었고,
SignatureAlgorithm.HS512 부분도 Jwts.SIG.HS512 로 변경되었다.
// 0.11.5
public String createAccessToken(String loginId, String role) {
Date now = new Date();
return Jwts.builder()
.setSubject(loginId) // 사용자 식별자값(ID)
.claim(AUTHORIZATION_KEY, role) // 사용자 권한
.setExpiration(new Date(now.getTime() + ACCESS_TOKEN_TIME)) // 만료 시간
.setIssuedAt(now) // 발급일
.signWith(key, SignatureAlgorithm.HS256) // 암호화 알고리즘 (HS256)
.compact();
}
// 0.12.5
private String createToken(String nickname, String role, long expiration) {
Date now = new Date();
return Jwts.builder()
.subject(nickname)
.claim(AUTHORIZATION_KEY, role)
.expiration(new Date(now.getTime() + expiration))
.issuedAt(now)
.signWith(key, SIG.HS512)
.compact();
}
또, jwtParser 가 변경됨에 따라 토큰의 시간 만료 시 발생하는 예외가 유효하지 않는 예외로 흡수되어서 만료 여부를 확인할 수 없다...
지금 계속 찾아보고 있는데 안 나온다...
0.11.5 버전에서 파싱 시 발생하는 예외 목록
0.12.5 버전에서 파싱 시 발생하는 예외 목록. 토큰 만료 예외가 JwtException 으로 흡수됐다..
찾았다!!
JwtException을 상속하는 하위 예외 목록 중 찾을 수 있었다.
checked 예외가 아니라서 몰랐던 것...
반응형
'TIL ✍️' 카테고리의 다른 글
24년 6월 20일(목요일) - 84번째 TIL : JPA 에서 SoftDelete 처리 (0) | 2024.06.20 |
---|---|
24년 6월 18일(화요일) - 83번째 TIL : Access token, Refresh token 응답 및 저장 방식 (1) | 2024.06.18 |
24년 6월 16일(일요일) - 81번째 TIL : Failed to Connect to MySQL at 127.0.0.1 with user root (0) | 2024.06.16 |
24년 4월 9일(화요일) 80번째 TIL : JUnit 조건에 따른 테스트 (0) | 2024.04.09 |
24년 1월 30일(화요일) - 79번째 TIL :레디스(2) : 복제 & 센티널 (1) | 2024.01.31 |