인증, access, refresh token 방식

Kyungs·2022년 3월 22일
0

auth

목록 보기
1/1
post-thumbnail

JWT (Json Web Token)

JWT란 인증에 필요한 정보를 문자열로 암호화시킨 토큰이며, access token의 역할을 한다. 클라이언트는 서버에 요청을 보낼 때 HTTP 헤더에 이 access token만 포함하여 넘겨주면, 서버는 이 토큰이 유효한 지 검사 후 클라이언트로 응답을 하게 된다.

JWT를 생성하기 위해서는 아래 세 가지가 필요하다.

  • header: JWT의 정보들을 암호화 할 방식과 타입 등을 포함
  • payload: 서버에 보낼 데이터. 유저의 고유 ID, 유효기간 등이 포함됨
  • verify signature: Base64 방식으로 인코딩 된 header, payload, secret key를 더한 후 서명됨

위 세 가지 정보들은 각각 .으로 구분되어 JWT가 생성된다. header와 payload의 정보는 디코딩이 쉬워 악성 유저에게 탈취될 수 있지만, verify signature는 secret key를 알지 못하면 디코딩하여 정보를 확인할 수 없다. 즉, verify signature가 있기 때문에 악성 유저가 토큰을 조작할 수 없게 된다.

refresh token

JWT(access token)에 verify signature가 있다고 해도 보안에 취약한 것은 사실이다. 토큰을 조작할 수 없을 뿐, 해당 access token을 탈취당하면 얼마든지 악용될 수 있기 때문이다. 보안성을 높이기 위해서는 access token의 유효 기간을 짧게 설정해야 하는데, 이런 경우 유저가 자주 로그인을 해야하기 때문에 불편을 야기할 수 있다.

refresh token은 이러한 보안성과 불편을 해소하기 위해 등장했다. refresh token은 서버에서 access token을 발급할 때 함께 주어지는데, 이 refresh token만 있으면 유저는 언제든지 access token을 재발급 받을 수 있다. 따라서, access token의 유효 기간을 짧게 설정하고, refresh token의 유효 기간을 길게 설정하면 access token의 탈취로부터 생기는 보안 취약성도 보완할 수 있고, 유저가 자주 로그인하지 않아도 되어서 편리성도 갖출 수 있다.

refresh token이 탈취당한다고 가정해도 어느 정도의 보안성을 가져올 수 있다.

  • 정상적인 사용자가 access token, refresh token을 발급받고, 서버는 이를 데이터베이스에 저장한다.
  • 악성 유저가 탈취한 refresh token을 이용하여 access token을 새로 발급받기를 시도한다.
  • 서버는 데이터베이스에 저장된 access token과 악성 유저의 access token이 매치되지 않는 것을 확인하고, refresh token이 탈취되었다고 판단하여 두 토큰을 모두 만료시킨다.
  • refresh token 유효 기간이 지나지 않았다 하더라도 정상 유저도 다시 로그인을 해야 하지만, 악성 유저가 리소스로 접근하는 것은 막을 수 있다.

token refresh 과정


아래는 클라이언트의 access token이 만료되었으나 refresh token이 유효할 때, access token을 재발급받는 과정이다.

  • 클라이언트가 access token이 만료된 채 서버로 api 요청을 보낸다.
  • 서버는 토큰이 만료되어 리소스 접근 불가 응답을 보낸다.
  • 토큰 만료 응답을 받은 클라이언트가 refresh token을 담은 access token 재발급 요청을 보낸다.
  • 서버는 refresh token의 유효성을 검사하고 access token을 재발급 해준다.
  • 재발급 받은 access token으로 위 요청을 다시 보낸다.

참고자료

쉽게 알아보는 서버 인증 1편(세션/쿠키 , JWT)
JWT에서 Refresh Token은 왜 필요한가?

0개의 댓글