백엔드

Access Token 과 Refresh Token 이 뭐고 왜 필요한가

do_hyuk 2024. 3. 22. 10:52

JWT 토근이 무엇이고 왜 필요한가

JWT 토큰은 유저의 신원이나 권한을 결정하는 정보를 담고 있는 데이터 조각이다. 
JWT 토큰을 사용해서 클라이언트와 서버는 안전하게 통신한다.
왜냐하면 JWT 토큰 인증방식은 비밀키(개인키 or 대칭키)로 암호화를 하기 때문이다.

 

하지만 탈취당했을 때 문제가 발생한다. JWT 토큰을 탈취한 사람은 마치 신뢰할 만한 사람인 것처럼
인증을 통과할 수 있기 때문이다.
심지어 본 주인인 클라이언트와 탈취한 사람을 서버는 구분할 수 없다.

따라서 유효기간을 두어야하는 것이다.

 

그런데 유효기간을 짧게 두면 사용자가 로그인을 자주 해야 하므로 사용자 경험적으로 좋지 않고,
유효기간을 길게 두면
보안상 탈취 위험에서 벗어날 수 없다.

 

해결법은 유효기간이 다른 JWT 토큰 2개(Access Token과 Refresh Token)를 두는 것이다.
(JWT 구조 SpringBoot 활용)


프로세스

기본적인 개념은 다음과 같다.

  • Access Token의 유효기간은 짧다. (ex. 마이크로소프트 : 60일 / 아마존 : 1시간)
  • Refresh Token의 유효기간은 길다. (ex.마이크로소프트 : 1년)
  • 평소에 API 통신할 때는 Access Token을 사용하고, Refresh Token은 Access Token이 만료되어 
    갱신될 때만 사용한다.

즉, 통신과정에서 탈취당할 위험이 큰 Access Token의 만료 기간을 짧게 두고 Refresh Token으로 주기적으로
재발급함으로써
피해를 최소화한 것이다.

Access Token 과 Refresh Token 프로세스

(서버 - 클라이언트 통신)

  1. 로그인 인증에 성공한 클라이언트는 Refresh Token과 Access Token 두 개를 서버로부터 받는다.
  2. 클라이언트는 Refresh Token과 Access Token을 로컬에 저장해 놓는다.
  3. 클라이언트는 헤더에 Access Token을 넣고 API 통신을 한다(Authorization)
  4. 일정 기간이 지나 Access Token을 넣고 유효기간이 만료되었다.
    4-1. Access Token은 이제 유효하지 않으므로 권한이 없는 사용자가 된다.
    4-2. 클라이언트로부터 유효기간이 지난 Access Token을 받은 서버는 401 에러 코드로 응답
             (HTTP 상태코드란?)

    4-3. 401을 통해 클라이언트는 invalid_token(유효기간이 만료)을 알 수 있다.
  5. 헤더에 Access Token 대신 Refresh Token을 넣어 API 재요청한다.
  6. Refresh Token으로 사용자의 권한을 확인한 서버는 응답쿼리 헤더에 새로운 Access Token을 넣어 응답한다.
  7. 만약 Refresh Token도 만료되었다면 서버는 동일하게 401 에러 코드를 보내고,
    클라이언트는 재로그인해야 한다.

악의 있는 탈취자는 통신이 빈번한 Access Token을 탈취할 가능성이 높다. 운이 좋게 탈취에 성공했더라도

Access Token의 만료 시간은 짧기 때문에 탈취자는 또다시 탈취를 시도해야 한다.

왜냐하면 JWT Token의 만료 시간은 변경이 불가능하기 때문이다.

 

JWT 토근 구조를 다시 생각해 보면 Header, Payload, Signature로 되어있다. 만료 기간은 Payload에 적혀있고,

Signature는 Header + Payload를 비밀키로 암호화한 것이다. 탈취자는 토큰을 계속 사용하고 싶기 때문에

Payload에 있는 만료기간을 늘리려고 할 것이다. 그런데 Payload의 만료기간을 바꾼다고 해서 Signature가 바뀌지 않는다.

Signature에서 복호화한 Payload와 변경된 Payload가 일치하지 않는 것을 비밀키를 가지고 있는 서버는 알 수 있고,

접근 권한을 내어주지 않게 되는 것이다.


Refresh Token 탈취 위험

Refresh Token의 통신 빈도가 적기는 하지만 탈취 위험에서 완전히 벗어난 것은 아니다.

Refresh Token이 탈취당하는 건 예방할 수 있나? OAuth에서는 Refresh Token Rotation을 제시한다.

 

Refresh Token Rotation은 클라이언트가 Access Token을 재요청할 때마다 Refresh Token도 새로 발급받는 것이다.

 

이렇게 되면 탈취자가 가지고 있는 Refresh Token은 더 이상 만료 기간이 긴 토큰이 아니게 된다.

따라서 불법적인 사용의 위험은 줄어든다.


결론

  • Refresh Token은 JWT 토큰의 탈취 위험을 최소화하고, 사용자 경험을 높이기 위해(빈번한 재로그인 방지) 나온 것이다.
  • Access Token의 유효기간은 짧고, 평소 API 통신할 때 사용한다.
  • Refresh Token의 유효기간은 길고, Access Token 재발급받을 때 사용한다.
  • Refresh Token은 여전히 탈취 위험이 있고, Refresh Token Rotation을 통해 위험을 줄일 수 있다.

 

REF) Access Token과 Refresh Token이란 무엇이고 왜 필요할까?