처음부터 차근차근

[JWT] Access Token & Refresh Token 본문

CS/인증 및 인가

[JWT] Access Token & Refresh Token

HangJu_95 2023. 12. 8. 16:28
728x90

JWT에도 한계점은 있다?

쿠키와 서버의 단점을 보완해주는 JWT에서도 크나큰 단점이 존재합니다. 바로

토큰이 탈취당하면 만료될 때까지 대처가 불가능하다.

 

세션은 탈취당한다고 판단이 되었을 때 세션 저장소를 끊어서 탈취당한 세션 ID가 있더라도 세션 저장소에 그 값을 지워 탈취된 후의 상황을 보완할 수 있었습니다. 

그러나 이건 서버에서 클라이언트의 상태를 저장하는 Stateful한 상황이고, 토큰은 Stateless 상태입니다.

즉, 토큰을 발급하면 관리는 클라이언트에서 하기 때문에, 탈취를 당했다고 서버에서 판단할 수가 없습니다.(탈취 당하면 답이 없는 상태)

만료시간을 짧게 가져가자

JWT는 발급한 후 서버에서 삭제가 불가능하기 때문에, 접근에 관여하는 토큰에 유효시간을 부여하는 식으로 탈취 문제에 대응했습니다.

30분이나 1시간 정도로 짧은 토큰을 저장한다면, 만약 토큰이 탈취되어서 서버가 이를 강제로 끊지는 못하겠지만 유효시간이 짧기 때문에 최소한의 보안성을 보장받을 수 있습니다.

 

하지만, 예시로 네이버 메일을 이용하는데 30분이 초과되어서 다시 로그인을 해야한다??

30분마다 다시 로그인을 하면 정말 불편한 경험이 될 것 같습니다.

이 짧은 유효시간을 보완할 방법은 어떤 것이 있을까요??

짧은 JWT 유효시간을 보완하는 방법들

서버가 JWT의 만료되기 직전의 유효시간을 보고 재발급을 어떤 방식으로 하느냐에 갈립니다.

대표적인 두 가지 방법이 존재합니다.

 

1. Sliding Session

특정한 서비스를 계속 사용하고 있는 특정 유저에 대해 만료 시간을 연장시켜주는 방법입니다.

Sliding 세션을 사용하게 된다면, 글쓰기, 결제 등과 같은 특정 action을 유저가 행동하였을 때 새롭게 만료시간을 늘린 JWT를 다시 제공함으로써 만료시간을 연장하여 보완하는 방법입니다.

 

단점으로는, 접속이 단발성으로 일어난다면 Sliding Session으로 연장시켜줄 수 없는 상황이 생기고, 너무 긴 만료시간을 발급시켜준 상황이라면 Sliding Session 때문에 무한정 사용하는 상황이 발생할 수 있습니다.

 

2. Refresh Token

가장 많이 사용되는 방법으로써, JWT를 처음 발급할 때 Access Token과 함께 Refresh Token이라는 토큰을 발급하여 짧은 만료시간을 해결하는 방법입니다.

짧은 시간이 아닌 비교적 긴 시간 (7일, 30일 등)의 만료시간을 가진 Refresh Token은 말 그대로 Access Token을 Refresh 해주는 것을 보장하는 토큰입니다. 만약 클라이언트가 Access Token이 만료됨을 본인이 인지하거나, 서버로부터 만료됨을 확인받았다면 Refresh Token으로 서버에게 새로운 Access Token을 발급하도록 요청하여 발급받는 방식입니다.

Access Token

  • 사용자의 권한이 확인(ex:로그인)되었을 경우 해당 사용자를 인증하는 용도로 발급합니다.
  • 우리가 일반적으로 JWT를 발급받고 설정한 Expires 기간이 지날 때 인증이 만료되게 하는 이것을 Access Token이라고 부를 수 있습니다.
  • Access Token은 그 자체로도 사용자를 인증하는 모든 정보를 가지고 있습니다. 그렇기 때문에 토큰의 만료 시간이 길어질수록 탈취되었을 때는 피해가 더욱 커집니다.

Refresh Token

특정한 사용자가 Access Token을 발급받기 위한 용도로만 사용된다.

 

  • Refresh Token은 Access Token과 똑같은 형태의 JWT이다. 단지 Access Token을 재발급하는데 관여하는 토큰이므로 행하는 역할이 다릅니다.
  • 서버에 Refresh Token이 저장되어 있기 때문에, 사용의 인증 여부를 언제든지 제어가 가능하다는 장점이 있습니다.

Access / Refresh Token 재발급 원리

1. 기본적으로 로그인 같은 과정을 하면 Access Token과 Refresh Token을 모두 발급합니다.

이때, Refresh Token만 서버측의 DB에 저장하며, Refresh Token과 Access Token을 쿠키 혹은 웹스토리지에 저장합니다.

 

2. 사용자가 인증이 필요한 API에 접근하고자 하면, 가장 먼저 토큰을 검사한다.

이때, 토큰을 검사함과 동시에 각 경우에 대해서 토큰의 유효기간을 확인하여 재발급 여부를 결정합니다.

  • case1 : access token과 refresh token 모두가 만료된 경우  에러 발생 (재 로그인하여 둘다 새로 발급)
  • case2 : access token은 만료됐지만, refresh token은 유효한 경우  refresh token을 검증하여 access token 재발급
  • case3 : access token은 유효하지만, refresh token은 만료된 경우  access token을 검증하여 refresh token 재발급
  • case4 : access token과 refresh token 모두가 유효한 경우  정상 처리

[refresh token을 검증하여 access token 재발급]

클라이언트(쿠키, 웹스토리지)에 저장되어있는 refresh token과 서버 DB에 저장되어있는 refresh token 일치성을 확인한 뒤 access token 재발급합니다.

 

[access token을 검증하여 refresh token 재발급]

access token이 유효하다라는 것은 이미 인증된 것과 마찬가지니 바로 Refresh token 재발급합니다.

Refresh Token 인증 과정

1. 사용자가 ID , PW를 통해 로그인.

2. 서버에서는 회원 DB에서 값을 비교

3~4. 로그인이 완료되면 Access Token, Refresh Token을 발급한다. 이때 회원DB에도 Refresh Token을 저장해둔다.

5. 사용자는 Refresh Token은 안전한 저장소에 저장 후, Access Token을 헤더에 실어 요청을 보낸다.

6~7. Access Token을 검증하여 이에 맞는 데이터를 보낸다.

8. 시간이 지나 Access Token이 만료됐다.

9. 사용자는 이전과 동일하게 Access Token을 헤더에 실어 요청을 보낸다.

10~11. 서버는 Access Token이 만료됨을 확인하고 권한없음을 신호로 보낸다.

Access Token 만료가 될 때마다 계속 과정 9~11을 거칠 필요는 없다.
사용자(프론트엔드)에서 Access Token의 Payload를 통해 유효기간을 알 수 있다.
따라서 프론트엔드 단에서 API 요청 전에 토큰이 만료됐다면 곧바로 재발급 요청을 할 수도 있다.

 

12. 사용자는 Refresh Token과 Access Token을 함께 서버로 보낸다.

13. 서버는 받은 Access Token이 조작되지 않았는지 확인한후, Refresh Token과 사용자의 DB에 저장되어 있던 Refresh Token을 비교한다. Token이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 발급해준다.

14. 서버는 새로운 Access Token을 헤더에 실어 다시 API 요청 응답을 진행한다.

Refresh Token의 장단점

기존의 Access Token만 사용하는 인증보다는 보안성이 향상되었지만, 단점도 존재합니다.

  1. 구현이 복잡. 검증 프로세스가 길기 때문에 자연스레 구현하기 힘들어진다. (프론트엔드, 서버 모두)
  2. Access Token이 만료될 때마다 새롭게 발급하는 과정에서 생기는 HTTP 요청 횟수가 많다. 이는 서버의 자원 낭비로 귀결된다.

참조

 

🌐 Access Token & Refresh Token 원리

Access Token & Refresh Token 이번 포스팅에서는 기본 JWT 방식의 인증(보안) 강화 방식인 Access Token & Refresh Token 인증 방식에 대해 알아보겠다. 먼저 JWT(Json Web Token) 에 대해 잘 모르는 독자들은 다음 포스

inpa.tistory.com

 

쉽게 알아보는 서버 인증 2편(Access Token + Refresh Token)

안녕하세요! 이전 포스팅에는 크게 세션/쿠키 인증, 토큰 기반 인증(대표적으로 JWT)에 대하여 알아보았습니다. 저희가 앱, 웹 혹은 서버 개발을 하면서 꼭 사용하게 되는 인증(Authorization)은 아주

tansfil.tistory.com

 

JWT(Json Web Token) 알아가기

jwt가 생겨난 이유부터 jwt의 실제 구조까지 | 사실 꾸준히 작성하고 싶었던 글이지만 JWT를 제대로 개념을 정리하고 구현을 진행해본 적이 없었는데 리얼월드 프로젝트를 진행하면서 JWT에 대한

brunch.co.kr

'CS > 인증 및 인가' 카테고리의 다른 글

[JWT] JWT란?  (2) 2023.12.08
[인증 및 인가] Cookie / Session / Token  (2) 2023.12.07