로그인, 로그아웃기능을 구현하기위해 redis를 사용해서 refreshToken을 발급하려고 하는중에 에러를 만났다.
public static String createToken(Subject subject, String key) throws JsonProcessingException {
log.info("\nHere is createToken // subject = {}\n", subject.getUserName());
String subjectStr = objectMapper.writeValueAsString(subject);
Claims claims = Jwts.claims().setSubject(subjectStr); //일종의 map
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRE_TIME))
.signWith(SignatureAlgorithm.HS256,key)
.compact()
;
}
분명 log를 통해 subject에 값이 있는것을 확인했지만, objectMapper.writeValueAsString()를 하니 null 값이나와 에러가 발생한 것이다...
어디서부터 시작인걸까...
그 이유는 Subject는 Json이 아니기 때문이다.
objectMapper의 사용 목적을 정확히 배울 수 있던것 같다.
아래와 같이 고쳐주니 오류는 해결되었다.
public static String createToken(Subject subject, String key) throws JsonProcessingException {
log.info("\nHere is createToken // subject = {}\n", subject.getUserName());
String subjectStr = String.valueOf(subject);
Claims claims = Jwts.claims().setSubject(subjectStr); //일종의 map
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRE_TIME))
.signWith(SignatureAlgorithm.HS256,key)
.compact()
;
}
하지만 이렇게하면 Claims에는 String이 들어가게된다.
Claims는 Map형태로 되어있기때문에 key와 value를 넣어야 한다.
아래코드처럼 Subject의 값들을 key,value형식으로 넣어주어서 오류를 해결하였다.
public static String createToken(Subject subject, String key, Long expiredTime) throws JsonProcessingException {
Claims claims = Jwts.claims(); //일종의 map
claims.put("userName", subject.getUserName());
claims.put("accountId", subject.getAccountId());
claims.put("type", subject.getType());
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expiredTime))
.signWith(SignatureAlgorithm.HS256,key)
.compact()
;
}
글로보면 간단해 보이지만, 엄청 오래걸렸던 오류 해결이였다