Programing/Spring Security

JWT Access Token, Refresh Token 사용 방식 정리, 장단점, 보안

리커니 2023. 11. 22.
반응형

 JWT 에 대한 설명과 설정 방식은 아래의 링크를 확인하세요.

Link : https://aljjabaegi.tistory.com/659

 

SpringBoot + JWT + Security + JPA 인증 구현, JWT란?

해당 포스팅은 인프런의 무료강의를 참고하여 작성되었습니다. Link: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-jwt/dashboard 이해하기 쉽게 설명되어 있으니 참고하시면 좋을 것 같

aljjabaegi.tistory.com

 

 이번 포스팅에서는 개인적으로 생각하는 Access, Refresh Token 사용 방법에 대해 정리를 해보겠습니다.

 

 

JWT 의 장점

 JWT의 가장 큰 장점은 세션과의 차이에서 알 수 있는데, 세션과 다르게 접근에 대한 상태정보를 서버에서 관리하지 않기 때문에 서버의 부하를 상대적으로 줄일 수 있습니다. 이를 Stateless 하다고 표현 합니다.

 

JWT 의 단점

 하지만 이러한 상태정보를 서버에서 관리하지 않기 때문에 Access Token이 탈취 되었을 때 Token이 만료되기 전까지는 탈취된 Token에 대해서 어떠한 조치를 취할 수가 없습니다. 그래서 Access Token의 만료 시간을 짧게 설정을 하게 됩니다.

 

Refresh Token 의 사용 이유

Access Token의 만료 시간을 짧게 설정하게 되면 사용자는 그만큼 자주 로그인이라는 과정을 거쳐야 합니다. 자주 사용하는 사이트인데 계속 로그아웃 처리가 된다면 사용자는 엄청 불편해 하겠죠. 그래서 만료 시간이 긴 Refresh Token을 사용하게 됩니다. Access Token이 만료 되었을 때 로그인 시 받은 Refresh Token으로 Token의 갱신을 요청하고, 갱신된 토큰으로 이전에 요청한 API를 다시 요청하는 것이죠.

 

Access, Refresh Token의 만료 기한

일반적으로 Access Token은 1분 ~ 30분 정도, Refresh Token은 1주 or 그 이상 정도의 만료시간을 설정합니다.

보안 정책에 따라 다르게 설정합니다. 보안이 중요한 사이트의 경우 만료기한을 짧게 설정합니다. 은행 같은 경우 로그인 한 후 잠깐 다른 작업 하다 다시 들어가면 로그아웃된 것을 보실 수 있을꺼에요.

 

Token 방식의 문제점

1.  Access Token 을 바로 만료 시길 방법이 없다.

아무리 짧게 설정한다고 해도 그 기간동안의 악용을 막을 방법이 없습니다. Token 방식의 한계인 것 같습니다. 최대한 짧게 설정해서 보완하는 방법 뿐이네요.

 

2. Refresh Token 의 탈취

 만료 시간이 긴 Refresh Token 이 탈취되면 만료 전 까지는 보안상의 문제가 발생 할 것 입니다. Refresh Token의 경우에도 Stateless 하기 때문에 Access Token과 마찮가지로 탈취 되었을 때 서버에서는 어떠한 조치를 취할 수 없습니다.

 로그인 시 발행 된 Refresh Token 을 저장매체(DB)에 저장하여 탈취 확인 시 저장된 Refresh Token을 변경하므로써 갱신을 막을 순 있겠지만, 이도 탈취를 확인했을 때에 한하여 가능한 대책입니다.

 여기에 RTR (Refresh Token Rotation) 을 적용할 수도 있습니다. Refresh Token을 활용하여 갱신을 한 번만 할 수 있게 설정하는 방식인데요. Refresh Token으로 Access Token을 갱신할 때 Refresh Token도 갱신하여 저장매체(DB)에 저장, 이전 Refresh Token으로 갱신 요청 시 탈취된 것으로 판단하여 저장 매체(DB) Refresh Token 초기화하는 방법입니다.

 

 

이렇게 설정을 하여도 유효한 Access Token 이나 Refresh Token을 탈취 당하면 끝입니다. 막을 방법이 없죠.

최대한 탈취 당하지 않도록 하는 방법 뿐입니다. 이에 따른 보안 대책은 아래와 같습니다.

 

  • 통신 중에 Token이 탈취되거나 조작되지 않도록 HTTPS 사용.
  • Token의 만료기간을 짧게 설정.
  • CSRF(Cross-Site Request Forgery) 방지, security 적용.

 

 세션 방식보다 Token 방식을 선호하는 이유는 확장성과 경제성 입니다. 서비스가 확장되어도 토큰의 유효성만 검증하면 되고, 서버의 부하가 상대적으로 적기 때문에 하드웨어에 드는 비용도 줄일 수 있을 것 입니다.

 최대한 보안적인 조치들을 취함으로써 안전하게 JWT 를 사용할 수 있도록 하는 것이 중요합니다.

 

기타

Access Token 자동 갱신

 Access Token 만료 시 로직은 위에서 설명한 것과 같이 인증 시 받은 Refresh Token 으로 갱신 API 를 요청해야 합니다.

 

 토큰 갱신 과정을 좀 줄 일 수 있는 방법을 고민하다가 API 요청 시 Access Token과 Refresh Token을 같이 전송하는 방법이 제일 간단할 것 같다는 생각을 하였습니다. 물론 보안상 문제가 됩니다! 불특정 다수가 활용하는 오픈된 서비스에서는 적용하시면 안됩니다! 필요하신 분만 참고하세요.

 

Token 생성 시 Token의 Claim에 Refresh Token을 생성하여 전달하였습니다. Claim은 Token이 만료되어도 접근이 가능합니다. 

 

반응형

댓글

💲 추천 글