[Spring] Access Token & Refresh Token

JunWoo An·2023년 11월 27일
0

스파르타코딩클럽

목록 보기
25/46
post-thumbnail

이전에 JWT에 대해 알아보았다면 이번에는 더나아가서 엑세스토큰(Access Token)과 리프레시토큰(Refresh Token)에 대해 알아보자

JWT의 문제점

이전에 다뤘던 JWT한개로만의 인증방식은 Access Token하나로 인증하는 방식과 같다고 보면되는데 이것에 문제점은 토큰의 저장주체가 서버가 아닌 클라이언트이기 때문에 토큰을 제3자에게 탈취당할경우 보안에 취약하다는 문제점이 있다. 또한 JWT는 한번 발급 후 서버에서 임의의 토큰을 삭제, 만료를 시킬수 없이 토큰에 유효시간을 부여하는 식으로 탈취문제에 대응하여야하는데 유효기간을 너무 짧게 할 경우 사용자는 그만큼 자주 로그인을 하여 새롭게 토큰을 발급받아야하는 불편한점이 발생하게된다. 너무길면 탈취위험성이 너무 짧으면 사용자가 불편한상황이 발생하는 상황에서 유효기간을 짧게하면서 사용자가 불편함을 느끼지 않을 방법을 위해 우리는 Refresh Token의 개념을 추가하였다.

Refresh Token

기존의 Access Token이 접속인증을 위한 토큰이였다면 Refresh Token은 이름 그대로 리프래시 즉 토큰 재발급에 관여하는 토큰이다. 이에 대한 로직을 살펴보자면

회원 가입을 완료한 사용자가 로그인을 시도하게 되면 DB는 이에 대한 사용자 확인을 걸쳐 예외가 발생하지 않는다면 엑세스토큰과 리프레시토큰을 발급하게 된다 이때 사용자에게 둘다 응답함과 동시에 리프레시 토큰만 DB에 저장하게 된다.

이후 사용자로 부터 엑세스토큰과 요청이 들어오게되면 엑세스토큰검증을 통해 요청을 처리하다가 토큰검증과정에서 만료된 엑세스토큰일경우 사용자에게 만료토큰응답을 하고 이에대해 사용자는 엑세토큰 발급요청을 엑세스토큰과 리프레시토큰을 담아 요청하게되고 이때 앞선 로그인에서 DB에 저장된 리프레시토큰과 사용자로부터 받은 리프레시토큰을 검증하여 새로운 엑세스토큰을 사용자에게 응답한다.

리프레시토큰 만료기간까지 이처럼 요청이 진행되다가 리프레시토큰의 만료기간이 끝나게 되면 사용자는 로그아웃처리된걸로 간주되어 다시 재 로그인을 시행하여야한다.

일반적으로 엑세스토큰은 1시간 리프레시토큰은 2주일이지만 만약 리프레시토큰 만료된 후 유효한 엑세스토큰을 요청한다면? 이처럼 경우의 수를 생각하면 4가지임으로 이에대해 정리하자면

  1. Access Token, Refresh Token 둘다 만료 ---> 에러발생 재로그인 요청 반환
  2. Access Token 유효 , Refresh Token 만료 ---> Access Token으로 검증하여 인증되면 Refresh Token 발급
  3. Access Token 만료, Refresh Token 유효 ---> Refresh Token으로 검증하여 인증되면 Access Token 발급
  4. Access Token, Refresh Token 둘다 유효 ---> 인증 ok

2번의 경우는 Access Token이 유효하다면 이미 인증된거나 마찬가지이니 Refresh Token을 재발급하고
3번의 경우는 DB의 Refresh토큰과 검증작업을 걸쳐 일치할경우 Access Token을 재발급한다.

기존의 과제에서는 Access Token만을 사용하여 보안문제에 대해 크게 경각심을 갖지않았는데 앞으로의 과제에서는 이처럼 2개의 토큰을 사용하여 보안문제에 대해 좀 더 생각을 가지는개발자가 되기위해 발전해 나가야 한다는 생각을 하였다.

profile
도전하는 사람

0개의 댓글