티스토리 뷰

Refresh Token이란 ? 

사용자의 인증을 위한 토큰이 아닌 새로운 에세스 토큰을 생성하는 용도로 사용한다. 

사용자의 인증은 access 토큰으로 하되, access 토큰의 만료시간이 끝나면 refresh 토큰으로 다시 access토큰을 생성해준다. 

나는 여기서 궁금한 점이 3가지 있었다. 

 

  • 왜 만료시간을 정해둘까 ?
  • refresh Token을 사용하는 이유는 뭘까 ?
  • refresh Token도 만료시간이 있을텐데, 이 이슈는 어떻게 처리할까 ?

 

하나하나씩 알아보자. 

 

 

토큰 만료시간을 정해두는 이유

이유는 간단하다. 토큰을 빼앗기면 사용자의 정보가 다 털리기 때문이다. 

이 때 토큰의 만료시간을 정해두면 토큰을 빼앗아가도 만료시간이 다 되면 더 이상 토큰이 아닌 아무 의미가 없는 문자열이 되기 때문에 토큰의 만료시간을 정해둔다. 여기서 refreshToken을 사용하는 이유가 나온다. 

 

 

refresh Token을 사용하는 이유

우리는 위에서 토큰 만료시간을 정해두는 이유를 알았다. 이유는 토큰을 빼앗겨도 크게 손해보지 않기 위함인데, 크게 손해보지 않기 위해선 만료시간을 엄청 짧게 해서 훔쳐간 것을 소용없게 만들어야 한다. 그래서 대부분 1시간, 좀 더 보안을 강하게 하려면 30분으로 정한다. 

하지만 이렇게 짧게 정하면, 30분마다 로그인을 다시 해야하는 상황이 발생한다. 즉 토큰을 사용하는 의미가 없어지게 되는 것이다. 

그래서 우리는 리프래쉬 토큰을 사용한다. 

 

원래 로그인을 하면 토큰을 발급해주었다. 이 토큰을 access Token이라고 부른다. 

access Token은 탈취당할 위험이 있어 만료시간을 30분으로 해두었다. 하지만 이렇게 만료시간을 짧게 하면 30분 후 로그인을 해야하는 상황이 발생한다. 그래서  access Token을 다시 발급해줌으로써 만료시간 이슈를 처리할 수 있다. 

Access Token을 다시 발급해주는 역할이 Refresh Token이 하는 일이다. 

 

 

 

refresh Token 만료시간 이슈 해결

그럼 refresh Token도 분명 만료시간이 있을텐데, refresh Token도 만료시간이 다 되었을때는 어떻게 처리할까 ?

별 다른 해결방안 없이 그때는 로그인을 다시 해야한다.

 

 

동작원리

 

위 사진은 토큰을 발급하고 만료하는 동작의 흐름을 나타냈다. 

나는 여기에 조금 보태서 회원가입 내용을 추가해서 설명해보겠다. 

 

1. 사용자가 회원가입을 한다. 

2. 유효한 데이터라면 사용자의 정보(회원가입한 데이터)가 DB에 저장된다. (회원가입 성공)

3. 사용자가 로그인을 한다. 

4. DB에서 정보가 일치하는지 확인한다. 

5. 정보가 일치하다면 Access Token과 Refresh Token을 발급한다. (로그인 성공)

6. 이 때 Refresh Token은 DB에 저장된다. 

7. 이제 요청을 할 때마다 헤더에 Access Token 값을 넣어 같이 보낸다. 

8. 서버에서는 Access Token의 유효성을 검사한다. 

9. 유효한 토큰이라면 기대하는 응답을 보낸다. 

10. 만약 Access Token의 만료시간이 다 되었다고 가정해보자.

(하지만 클라이언트는 만료시간이 다 되었는지 모른다)

11. 요청할 때 역시 헤더에 Access Token 값을 넣어 같이 보낸다. 

12. 서버에서는 유효성을 검사할 때 만료시간이 다 되었다는 것을 확인한다.

13. 서버에서 "토큰이 만료되었으니 Refresh Token을 보내세요" 라고 응답한다. 

14. 클라이언트에서 만료된 Access Token과 Refresh Token을 전송한다. 

15. Refresh Token의 유효성을 확인한다. (만료기간이 지났는지 확인, 6번에서 DB에 저장했던 토큰과 비교)

16. 유효하다면 Access Token을 재발급해준다.

17. 만약 Refresh Token도 만료기간이 지났다면 다시 로그인을 해줘야 한다. 

 

 

유효 동작 흐름은 다음과 같다.

 

 

코드적으로 생각해보기

  • 먼저 Refresh Token을 발급하는 메서드 만듬 (JwtTokenProvider)
  • 로그인 로직 변경
    • 반환값을 Access Token, Refresh Token 두개라서 따로 응답 DTO를 만들어야 됨
    • Refresh Token 엔티티와 레파지토리를 만들어줌 (DB에 저장하기 위함)
    • Refresh Token을 발급하고 저장시킨 다음 Access Token과 함께 반환
  • Access Token이 만료되었을 때 확인해야 하는 것들
    • Access Token이 만료되었나
    • Refresh Token은 유효한가
    • DB에 저장해두었던 Refresh Token과 일치한가
    • 그럼 Access Token 재발급
  • Refresh Token이 만료되었을 때
    • 로그인을 해주세요

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday