Access Token & Refresh Token ?

Pink Chun·2022년 12월 4일
2

개발상식

목록 보기
4/4
post-thumbnail

1. JWT 구조

일단 JWT는 위키피디아, Auth0, jwt.io 등 다양한 사이트에서도 이미 잘 설명하고 있지만 비밀키를 이용하여 서명된 JSON 형태의 데이터다. 여기에 사용자 인증 정보를 넣어서 토큰을 발급해주면 추후 인증이 필요한 리소스에 접근 시 사용자가 서버에 토큰을 포함해서 전송하여 서버측에서는 복잡한 인증 과정 없이 토큰만으로 사용자를 인증 및 인가할 수 있는 것이다.

JWT는 헤더, 페이로드, 서명 세 가지 정보를 base64로 인코딩한 값을 콤마('.')를 사이에 두고 이어붙인 형태로 생성된다.

헤더: JWT 서명에 사용된 알고리즘을 담는다.
페이로드: 토큰에 담긴 주체(Subject), 만료일(exp), 생성자(iss) 등을 담는다.
시그니처: 헤더와 페이로드를 각각 base64로 인코딩한 후 콤마로 이어붙인다. 그리고 이를 헤더에 명시된 알고리즘으로 암호화한 값을 담는다. 이때 비대칭키 암호화 방식을 사용하기 때문에 서버측에서는 이 토큰을 받아서 시그니처를 복호화하여 디코딩하는 방식으로 토큰의 유효성을 검증할 수 있다.


2. Access Token & Refresh Token ?

간단히 말해서 Access Token은 인증을 위한 JWT이면서, 동시에 보안을 위해 유효기간이 매우 짧다. 반면, Refresh Token은 유효기간이 짧은 Access Token을 보완하기 위한 JWT로서, Access Token에 비해 유효기간이 길다. Access Token과 Refresh Token, 그리고 기타 인증방식에 대해서 너무나도 깔끔하고 자세하게 포스팅한 블로그 https://tansfil.tistory.com/59 를 참고하자.


3. 로그인시 Access Token, Refresh Token 보내주기

1) Access Token

서버가 액세스 토큰을 클라이언트에게 주면 클라이언트는 매 요청시 액세스 토큰을 서버로 보내주어 로그인 상태을 알려준다.

이러한 방식은 HTTP의 무상태 특성을 보완하기 위한 한 가지 방법이지만 액세스 토큰을 주는 방식은 전달 과정에서 탈취 당할 우려가 있어 보안에 문제가 있다.

이를 해결하기 위해 토큰에 만료기간을 주어, 만약 탈취를 당하더라도 시간이 지나면 토큰을 사용할 수 없게 만들 수 있다.

하지만 이는 로그인 상태가 주기적으로 풀린다는 뜻이고 사용자에게 큰 불편을 준다. 그래서 사람들은 리프레시 토큰을 생각해냈다.

2) Refresh Token - 리프레시 토큰으로 액세스 토큰 재발급

리프레시 토큰은 액세스 토큰이 만료되었을 경우 이를 확인하고 다시 액세스 토큰을 발급하는 방법이다.

사용자는 재로그인을 하지 않고도, 본인이 인지하지 못하는 사이에 액세스 토큰을 재발급, 계속해서 로그인 상태를 유지하는 것이다.

리프레시 토큰을 구현하는 방법은 여러가지이고 각 서비스의 특성에 따라 달라질 수 있다. 예를 들어 액세스 토큰이 만료되면 이를 확인하고 다시 액세스 토큰을 재발급하는 경우, 또는 처음 로그인시 액세스 토큰과 리프레시 토큰을 함께 전달하여 액세스 토큰이 만료되면 리프레시 토큰을 보내 액세스 토큰을 재발급하는 경우가 있다.

profile
최룰루의 개발일지(코린이)

0개의 댓글