JWT Token Flow

[SPA] JWT Token Flow

JWT의 구체적인 구현 방법에 대해서는 정해진 정답이란 정석은 없다.
AccessToken이나 RefreshToken 의 만료 기간이라든가, refresh 할 때 AccessToken을 같이 보낼 것인지 정보를 재사용할것인지, RefreshToken의 payload에 무엇을 담아야 하는지.. 등등.. 서비스에 따라 구현하기 나름

  • 쿠키만으로 인증하는 서비스의 취약점을 이용하는 XSRF(CSRF) 공격을 대응하기 위해 인증 정보를 쿠키 대신 토큰을 사용하여 헤더로 보내는 방식을 권장하나 쿠키로 인증하는 서비스들도 많이 있음.
  • AccessToken 단독 사용 시 토큰 탈취 방지를 위해 AccessToken 만료 기간은 짧게 설정, RefreshToken 만료 기간을 길게 설정 후 2 개의 토큰을 같이 발급해서 AccessToken 갱신 (AccessToken 단독 사용 보다는 그나마 조금이라도 보안 강화)

1) 클라이언트 JWT Token 인증 + Refresh Token 처리

클라이언트단에서 Refresh Token Flow

Refresh Token 이슈

  • Local Storage
    • 자바스크립트로 RefreshToken 값에 접근이 쉽게 되기에 XSS 공격에 취약하고 보안상 문제 소지가 많다.
  • Cookie
    • 동일 호스트 조건으로 HTTPOnly 와 Secure 옵션을 사용하여 자바스크립트로 접근을 차단할 수 있지만 이 또한 보안에는 불안한 요소가 남아있어 보안상 문제의 소지가 될 수 있다.
  • Server
    • RefreshToken 값을 서버 DB에 저장하기에 보안이 가장 안전하다.

2) 서버 JWT Token 인증 + Refresh Token 처리

서버단에서 Refresh Token Flow

클라이언트에게 제공되는 RefreshToken에 대한 보안 및 안전성은 늘 문제로 제기 되고 있다.

RefreshToken 을 서버단에서 처리는예를 들어 DB에 실제 RefreshToken 값을 저장하고 이때 Index 값을 hash값을 생성해 클라이언트에 전달해서 Cookie, Storage에 저장하는 방법이다.
이렇게 하면 hash 값을 생성한 값을 RefreshToken 으로 저장하기에 클라이언트단에 노출된 RefreshToken 값은 실제 발급된 RefreshToken 값과 무관하므로 노출되어도 알 수 있는 방법이 없으므로 보안상 좀 더 안전하게 저장할 수 있다.


최근 네이버, 카카오 등등 RefreshToken 도 노출하지 않고 REST API 로만 처리할 수 있는 방식으로 정책이 바뀌고 있는 것을 확인할 수 있다.

Kakao Developers 발취

refresh_token, refresh_token_expires_in

JavaScript SDK의 보안 강화를 위해 리프레시 토큰을 취급하지 않도록 수정되었습니다.
Kakao.Auth.login 및 Kakao.Auth.createLoginButton 함수를 사용한 로그인 시 발급되는 리프레시 토큰 정보(refresh_token, refresh_token_expires_in)는 2020 년 7 월 27 일 응답에서 제외되었습니다.

github, foursquare는 RefreshToken 을 사용하지 않는다고 한다.

공유하기