JWT Refresh Token 적용

HUNI·2023년 11월 26일

INTRO

로그인을 성공하면 Access Token 을 발급해준다.
내 코드는 Access Token 을 1시간 만료기간을 두었고, 1시간 이후에는 다시 클라이언트가 직접 로그인을 해주어야 한다. 이 단순한 로직이 보안상으로 취약하다고 느껴 Refresh Token 기능을 공부하여 이를 정리해보고자 한다.

{
    "isSuccess": true,
    "code": 200,
    "message": "OK",
    "data": "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImFjZWtkaGg4IiwiaWF0IjoxNzAwOTc3jE3MDA5ODA2ODF9.DlhQuHxNsg8lhzdsXU5OcoIfUcZ"
}

Refresh 토큰을 이용하여 보안이 강화되는 과정

  • Access Token의 유효 기간을 짧게 설정한다.
  • Refresh Token의 유효 기간은 길게 설정한다.
  • 사용자는 Access Token과 Refresh Token을 둘 다 서버에 전송하여 전자로 인증하고 만료됐을 시 후자로 새로운 Access Token을 발급받는다.
  • 공격자는 Access Token을 탈취하더라도 짧은 유효 기간이 지나면 사용할 수 없다.
  • 정상적인 클라이언트는 유효 기간이 지나더라도 Refresh Token을 사용하여 새로운 Access Token을 생성, 사용할 수 있음.

Refresh Token 이 왜 필요한가

Access Token 으로만 로그인 구현을 할 시 문제가 2개정도 생긴다.

1. Access Token 탈취

서버측 리소스에 접근할 때는 클라이언트 본인임을 인증할 수 있는 Access Token이 필요하다. JWT 는 statless 방식을 취하기 때문에 Access Token을 보낸 클라이언트가 본인임을 궁금해하지 않는다. 즉, 공격자가 Access Token을 탈취하기만 하면 해당 만료시간 동안 진짜 행세를 할 수 있다는 것이다. 이를 방지하기 위해 Refresh Token 을 도입하여 Access Token 만료기간을 짧게 가져가는 것이다.
Access Token 을 OTP 인증처럼 사용하는 것이다.

2. Access Token 만료될 때마다 클라이언트가 직접 로그인 해주어야 함

Access Token 이 만료되었다면, 유효기간이 긴 Refresh Token을 서버에 전송하여 다시 로그인 할 필요없이 재생성된 Access Token 을 발급받을 수 있다.


Refresh 토큰 설정

보통의 경우
Access Token 만료기간 : 30분 ~ 1시간
Refresh Token 만료기간 : 3일 ~ 1달으로 설정하는 듯 하다.

나는 Access Token은 30분, Refresh Token은 14일로 지정할 예정이다.

참고

https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80

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

profile
어려운 문제에 대해 고민하고 분석하는 과정을 좋아합니다.

0개의 댓글