jwt 방식의 인증(보안) 강화방식인 Access Token과 Refresh Token
Access Token만을 이용한 인증방식은 만약 제 3자가 탈취당할 경우 보안에 취약하다 따라서 Access Token은 발급된 이후,
서버에 저장되지않고 token 자체로 검증하며 사용자의 권한을 인증하기에 Access Token이 탈취되면 token 만료 이전에 token을
획득한 사람은 누구나 권한 접근이 가능해진다.
jwt는 발급한 후 삭제가 불가능 하기에 접근에 관여하는 token에 유효시간을 부여하는 식으로 탈취 문제에 대해 대응 해야한다.
이렇게 token 유효기간을 짧게 하면 토큰 남용을 방지하는것이 해결책이 될 수 있지만, 유효 기간이 짧은 token의 경우
그만큼 사용자는 로그인을 자주해서 새로운 token을 발급받아야하는 단점이있다. but 그렇다고 유효시간을 길게하면 토큰을 탈취당하면
보안에 더 취약해진다.
따라서 유효기간을 짧게하면서 좋은 방법은 Refresh Token을 적용하는 것이다.
Refresh Token은 Access Token과 똑같은 jwt임. 단지 Access Token은 접근에 관여하는 token, Access Token은
재발급에 관여하는 token 즉 둘의 역할이 다르다.
그럼 한번 생각해보자 처음에 로그인을 했을때, 서버를 로그인이 성공하면 클라이언트에게 Access Token과 Refresh Token을 동시에
발급한다.
그럼 서버는 데이터베이스에 Refresh Token을 저장하고, 클라이언트는 Access Token과 Refresh Token을 쿠키, 세션 혹은 웹스토리지에 저장하고 요청이 있을때마다 이 둘을 헤더에 담아서 보낸다.
Refresh Token은 긴 유효시간을 가지면서, Access Token이 만료됐을때 새로 재발급 해주는 열쇠가 된다.
따라서 만일 만료된 Access Token을 서버에 보내면, 서버는 같이 보내진 Refresh Token을 데이터베이스에 있는것과
비교하여 일치하면 다시 Access Token을 재발급하는 원리이다.
만일 사용자가 로그아웃을 하면 저장소에서 Refresh Token을 삭제하여 사용이 불가능하도록 하고 새로 로그인하면 서버에서
다시 재발급해서 데이터베이스에 저장한다.
How it works
Refresh Token의 유효기간: 2주,
Access Token의 유효기간: 1시간,
사용자가 api요청을 하다가 1시간이 지남,
갖고있는 Access Token은 만료되게됨.
그러면 Refresh Token의 유효기간 전까지는 Access Token을 새롭게 발급받을 수 있게됨.
즉, Refresh Token은 접근에 대한 권한을 주는것이 아닌 Access Token 재발급에만 관여하는 것.
만일 Refresh Token의 유효기간이 만료됐다면 사용자는 새로 로그인을 해야함.
Refresh Token도 탈취 가능성을 배제할순 없기에 이역시 적절한 유효기간 설정이 필요함(대부분 2주)
재발급 원리
------------------------------------------------------------------------------------
1. 기본적으로 로그인 과정을 하면 엑세스 토큰과 리프레시 토큰 모두 발급.
이때 리프레시 토큰만 서버측 데베에 저장하며, 리프레시 토큰과 엑세스 토큰을 쿠키 혹은 웹스토리지에 저장
2. 사용자가 인증이 필요한 api에 접근하고자 하면 가장 먼저 토큰 검사
이때 토큰 검사하면서 각 경우에 대해서 토큰의 유효기간을 확인하여 재발급 여부 결정
case1. 엑세스 토큰과 리프레시 토큰 모두가 만료된 경우
-> 에러발생(재 로그인하여 둘다 새로 발급)
case2. 엑세스 토큰은 만료되었지만 리프레시 토큰은 유효한 경우
-> 리프레시 토큰을 검증하여 엑세스 토큰 재발급
case3. 엑세스 토큰은 유효하지만, 리프레시 토큰은 만료된 경우
-> 엑세스 토큰을 검증하여 리프레시 토큰 재발급
case4. 엑세스 토큰과 리프레시 토큰 모두가 유효한 경우
-> 정상처리
tip.
[refresh token을 검증하여 access token 재발급]
클라이언트(쿠키, 웹스토리지)에 저장되어있는 refresh token과 서버 DB에 저장되어있는 refresh token 일치성을 확인한 뒤 access token 재발급한다.
[access token을 검증하여 refresh token 재발급]
access token이 유효하다라는 것은 이미 인증된 것과 마찬가지니 바로 refresh token 재발급한다.
3. 로그아웃시, 엑세스토큰과 리프레시 토큰 모두 만료시킴