JWT란 인증에 필요한 정보를 문자열로 암호화시킨 토큰이며, access token
의 역할을 한다. 클라이언트는 서버에 요청을 보낼 때 HTTP 헤더에 이 access token
만 포함하여 넘겨주면, 서버는 이 토큰이 유효한 지 검사 후 클라이언트로 응답을 하게 된다.
JWT를 생성하기 위해서는 아래 세 가지가 필요하다.
secret key
를 더한 후 서명됨위 세 가지 정보들은 각각 .
으로 구분되어 JWT가 생성된다. header와 payload의 정보는 디코딩이 쉬워 악성 유저에게 탈취될 수 있지만, verify signature는 secret key
를 알지 못하면 디코딩하여 정보를 확인할 수 없다. 즉, verify signature가 있기 때문에 악성 유저가 토큰을 조작할 수 없게 된다.
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이 유효할 때, access token을 재발급받는 과정이다.