진짜 간단하게라도 TIL로 학습기록을 남겨보려고합니다. 하루동안의 학습이든 키워드이든 삽질이든 슥슥슥 적어서 메모로 남기는 식으로 적어보겠습니다. 틀린 내용이 많을 예정입니다 ㅎㅎ
https://opentutorials.org/course/3405
https://www.ietf.org/rfc/rfc6749.txt
코드를 쳐보면서 flow를 익혀보려고 했다. flow는 사실 간단하다.
token은 server가 설정한 secret key와 암호화 알고리즘을 활용해서 encoding되고, decoding 하게되면 json data가 담겨있는 것을 확인할 수 있다.
client가 server로 부터 전달받은 token은 HTTP HEADER에 담기게 되며, client는 요청을 보낼 때 마다 token을 HEADER에 담아 보낼 수 있다.
토큰을 활용할 때, 토큰이 탈취당한다면 어떻게 될까? 토큰을 탈취할 수 있다면, 아이디와 비밀번호를 모르고서도 탈취한 토큰의 유저에 로그인한 것과 같이 요청을 할 수 있다.
이러한 문제 때문에, 토큰에는 expiration
, 만료되는 시간이 포함되어있다. 토큰이 만료되는 시간은 서버가 각자의 기준을 정할 수 있지만, 토큰의 탈취에 대한 위험때문에 짧게 설정하는 것이 좋다.
하지만 이렇게 토큰의 유효기간이 짧게 된다면, 토큰이 만료되었을 때마다 유저는 다시 로그인 요청해서 토큰을 새롭게 발급받아야 한다.
그래서 필요한 것이 Refresh-token
이다. 앞서 발급해주었던 토큰은 Access-Token
으로 불린다.
리프레쉬 토큰을 사용한다면 로그인 시 client에게 엑세스 토큰과 리프레쉬 토큰(엑세스 토큰보다 유효기간을 더 길게해서)을 같이 발급한다. 서버에서는 refresh-token을 DB에 저장해둔다. 그리고 엑세스 토큰이 만료되었다면, 클라이언트에게서 받은 리프레쉬 토큰을 확인해서 새롭게 엑세스 토큰을 발급해준다.
구현마다 다르겠지만 리프레쉬 토큰도 탈취당할 위험이 있기 때문에, 새롭게 엑세스 토큰을 발급할 때, 리프레쉬 토큰도 새롭게 발급해준다.
작성한 코드와 claim
과 관련해서는 코드를 조금 더 정리하고 적용해본 뒤 더 자세히 정리해봐야겠다.
// gradle dependency
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
public boolean isValidToken(String token) {
try {
Jws<Claims> claimsJws = Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token);
String subject = claimsJws.getBody().getSubject();
log.info("subject : {}", subject);
} catch (ExpiredJwtException expiredJwtException) {
log.info("token is expired");
return false;
} catch (MalformedJwtException malformedJwtException) {
log.info("token is Malformed");
return false;
} catch (SignatureException signatureException) {
log.info("token is wrong signature");
return false;
}
return true;
}
signatureException
을 뱉어냈고, 토큰의 유효기간이 다되었다면 expiredJwtException
을 뱉어냈다. malformedException
은 아직 테스트해보지는 못했으나, 들어있어야할 calim, 즉 data를 가지고 있지 않은 상황에 발생할 것 같다??google
, github
과 같은 서버에서 처리해주는 것이라고 생각하면 될 것 같다. +--------+ +---------------+
| |--(A)------- Authorization Grant --------->| |
| | | |
| |<-(B)----------- Access Token -------------| |
| | & Refresh Token | |
| | | |
| | +----------+ | |
| |--(C)---- Access Token ---->| | | |
| | | | | |
| |<-(D)- Protected Resource --| Resource | | Authorization |
| Client | | Server | | Server |
| |--(E)---- Access Token ---->| | | |
| | | | | |
| |<-(F)- Invalid Token Error -| | | |
| | +----------+ | |
| | | |
| |--(G)----------- Refresh Token ----------->| |
| | | |
| |<-(H)----------- Access Token -------------| |
+--------+ & Optional Refresh Token +---------------+