먼저 JWT(JSON Web Token)를 생성하고 검증하는 역할을 수행하는 클래스를 정의하고 JWT 생성 메서드를 추가해 보겠습니다.
package com.springboot.auth;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.Map;
public class JwtTokenizer {
// (1)
public String encodeBase64SecretKey(String secretKey) {
return Encoders.BASE64.encode(secretKey.getBytes(StandardCharsets.UTF_8));
}
// (2)
public String generateAccessToken(Map<String, Object> claims,
String subject,
Date expiration,
String base64EncodedSecretKey) {
Key key = getKeyFromBase64EncodedKey(base64EncodedSecretKey); // (2-1)
return Jwts.builder()
.setClaims(claims) // (2-2)
.setSubject(subject) // (2-3)
.setIssuedAt(Calendar.getInstance().getTime()) // (2-4)
.setExpiration(expiration) // (2-5)
.signWith(key) // (2-6)
.compact(); // (2-7)
}
// (3)
public String generateRefreshToken(String subject, Date expiration, String base64EncodedSecretKey) {
Key key = getKeyFromBase64EncodedKey(base64EncodedSecretKey);
return Jwts.builder()
.setSubject(subject)
.setIssuedAt(Calendar.getInstance().getTime())
.setExpiration(expiration)
.signWith(key)
.compact();
}
...
...
// (4)
private Key getKeyFromBase64EncodedKey(String base64EncodedSecretKey) {
byte[] keyBytes = Decoders.BASE64.decode(base64EncodedSecretKey); // (4-1)
Key key = Keys.hmacShaKeyFor(keyBytes); // (4-2)
return key;
}
}
encodeBase64SecretKey() 메서드는 Plain Text 형태인 Secret Key의 byte[]를 Base64 형식의 문자열로 인코딩해
Plian Text 자체를 Secret Key로 사용하는 것을 권장하지 않습니다.generateAccessToken()은 인증된 사용자에게 JWT를 최초로 발급해 주기 위한 JWT 생성 메서드
java.security.Key)객체를 얻음.setClaims()에는 JWT에 포함시킬 Custom Claims를 추가합니다. Custom Claims에는 주로 인증된 사용자와 관련된 정보를 추가합니다.setSubject() 에는 JWT에 대한 제목을 추가.setIssuedAt()에는 JWT의 발행 일자를 설정하는데 파라미터 타입은 java.util.Date 타입.setExpiration() 에는 JWT의 만료일시를 지정. 파라미터 타입은 java.util.Date 타입.signWith()에 서명을 위한 Key(java.security.Key)객체를 설정함.generateRefreshToken()메서드는 Access Toekn이 만료되었을 경우, Access Token을 새로 생성할 수 있게 해주는 Refresh Token을 생성하는 메서드.
Refresh Token은 Access Token을 새로 발급해 주는 역할을 하는 Token이기 때문에 별도의 Custom Claims는 추가할 필요 없음.getKeyFromBase64EncodedKey()메서드는 JWT의 서명에 사용할 Secret Key를 생성해 줌.
Decoders.BASE64.decode() 메서드는 Base64 형식으로 인코딩 된 Secret Key를 디코딩한 후, byte array를 반환함.Keys.hmacShakeyFor()메서드는 key byte array를 기반으로 적절한 HMAC 알고리즘을 적용한 Key(java.security.Key) 객체를 생성함.