토큰은 크게 3가지로 나누어져 있다
토큰타입과 암호화 알고리즘이 포함되어야 한다.
Map<String, Object>
토큰에 담을 내용이 포함되는 곳이다.
데이터, 토큰 발급대상, 토큰 만료기간, 토큰 수령자등등
Map<String, Object>
서명을 하는 부분이다.
Jwts.builder()
의 sighwith()
메소드를 사용한다.
첫번째 매개변수로 해시 알고리즘, 두번째 매개변수로 jwt 복호화에 사용할 key의 바이트를 기입한다 (.getBytes())
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
JWT를 사용하기 위해 jjwt
를 사용
...
@Value("${secret.jwt.key}")
private String secretKey;
public String generateToken(String email) {
// Header
Map<String, Object> headers = new HashMap<>();
headers.put("typ", "JWT");
headers.put("alg", "HS256");
// Payload
Map<String, Object> payloads = new HashMap<>();
payloads.put("data", email);
Date currentDate = new Date();
Date expirationDate = new Date(currentDate.getTime() + expiration);
return Jwts.builder()
.setHeader(headers)
.setClaims(payloads)
.setIssuedAt(currentDate)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) // Signature
.compact();
}
...
Map<String, Object>를 사용해 Header와 Payload를 담았다.
Jwts.builder()를 통해 Header, Claim, Signature를 세팅하고 compact()로 토큰 생성
public String getMemberEmailFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey.getBytes())
.parseClaimsJws(token)
.getBody();
String email = claims.get("data", String.class);
}
서명했던 secretKey로 set하고, parseClaimsJws()를 통해 토큰을 Jws로 파싱 후, getBody()를 사용해 'data'로 저장했던 email를 꺼낸다.