로그인을 성공하면 Access Token 을 발급해준다.
내 코드는 Access Token 을 1시간 만료기간을 두었고, 1시간 이후에는 다시 클라이언트가 직접 로그인을 해주어야 한다. 이 단순한 로직이 보안상으로 취약하다고 느껴 Refresh Token 기능을 공부하여 이를 정리해보고자 한다.
{
"isSuccess": true,
"code": 200,
"message": "OK",
"data": "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImFjZWtkaGg4IiwiaWF0IjoxNzAwOTc3jE3MDA5ODA2ODF9.DlhQuHxNsg8lhzdsXU5OcoIfUcZ"
}
Access Token 으로만 로그인 구현을 할 시 문제가 2개정도 생긴다.
서버측 리소스에 접근할 때는 클라이언트 본인임을 인증할 수 있는 Access Token이 필요하다. JWT 는 statless 방식을 취하기 때문에 Access Token을 보낸 클라이언트가 본인임을 궁금해하지 않는다. 즉, 공격자가 Access Token을 탈취하기만 하면 해당 만료시간 동안 진짜 행세를 할 수 있다는 것이다. 이를 방지하기 위해 Refresh Token 을 도입하여 Access Token 만료기간을 짧게 가져가는 것이다.
Access Token 을 OTP 인증처럼 사용하는 것이다.
Access Token 이 만료되었다면, 유효기간이 긴 Refresh Token을 서버에 전송하여 다시 로그인 할 필요없이 재생성된 Access Token 을 발급받을 수 있다.
보통의 경우
Access Token 만료기간 : 30분 ~ 1시간
Refresh Token 만료기간 : 3일 ~ 1달으로 설정하는 듯 하다.
나는 Access Token은 30분, Refresh Token은 14일로 지정할 예정이다.
https://velog.io/@jkijki12/Jwt-Refresh-Token-%EC%A0%81%EC%9A%A9%EA%B8%B0
https://velog.io/@sun1203/Spring-Boot-Security-Jwt-Token-Refresh-Token