슬라이딩 세션과 리프레시 토큰
JWT 토큰의 보안적인 문제점에 대해 이를 보완 할 수 있는 방법에 대해 알아보자.
Nov 07, 2023
목차
토큰 사용의 장점과 단점
토큰을 사용하면 서버에 사용자의 상태를 저장하지 않아 서버에 부담을 줄일 수 있다는 큰 장점이 있지만, 반대로 해커가 토큰을 탈취한 경우 토큰을 즉시 무효화 시키지 못하는 취약점이 있다.
- 이를 방지 하기 위해 발급하는 토큰의 유효기간을 짧게 설정할 수 있다. 그렇다면 토큰이 탈취 되었어도, 빠르게 만료되기 때문에 보안상 안전할 수 있다.
- 그러나 이 방법은 토큰이 만료 되었을 때 사용자가 다시 로그인을 해야 하는 등 사용자 입장에서는 굉장히 번거로워 진다.
슬라이딩 세션 (Sliding Sessions)
이러한 비상태 저장 방식인 토큰의 보안 취약점을 보강하고 사용자의 편의성을 유지하기 위해 슬라이딩 세션 (sliding sessions) 전략을 사용할 수 있다.
- 슬라이딩 세션은 로그인 정보를 다시 입력하지 않고 현재 가지고 있는 토큰을 새로운 토큰으로 재발급 해주는 방식을 의미한다.
- 구현 방법은 여러가지가 있다.
- 매 요청 마다 새로운 토큰 발급
- 토큰이 만료되는 시점에 새로운 토큰 발급
- (블로그) 중간에 인증이 만료되는 경우를 방지 하기 위해 글 작성시 새로운 토큰 발급
- (쇼핑몰) 장바구니에 아이템을 담는 경우 새로운 토큰 발급
슬라이딩 세션을 구현하기 위해서는 토큰을 재발급 해주는 토큰이 필요할 것이다. 이를 리프래시 토큰 (refresh token) 이라고 한다. (기존의 인증을 담당한 토큰을 엑세스 토큰 (access token)으로 명칭하여 리프래시 토큰과 구분하겠다.)
리프레시 토큰 (Refresh Token)
그래서 처음 사용자가 로그인을 할 때 서버에서는 엑세스 토큰과 리프레시 토큰을 발급 하고, 엑세스 토큰이 만료되어 에러가 발생한 경우, 클라이언트는 리프레시 토큰을 이용하여 새로운 엑세스 토큰 발급을 서버에 요청한다.
리프레시 토큰은 엑세스 토큰에 비해 긴 만료 기간을 가지고 있다.
- 따라서 클라이언트에서는 반드시 리프레시 토큰을 안정한 공간에 저장해야 한다.
- 서버에서는 보통 리프레시 토큰을 DB에 저장해두고 요청에 포함된 리프레시 토큰의 값과 비교합니다. 이는 사용자의 상태를 저장하지 않는 다는 토큰의 장점을 약화시키긴 하지만, 보안과 사용자 경험을 위해 타협한 방식이라고 볼 수 있다.
발급 전략
- 리프레시 토큰은 긴 만료 시간을 가지고 있기 때문에 발급 되었던 리프레시 토큰이 탈취된 경우, 비록 만료 기간이 남아 있다 해도 비정상 토큰이라는 것을 인지할 수 있도록 로직을 작성해야 한다.
- 리프레시 토큰이 탈취된 경우, 즉 서버에 저장된 이전에 발급한 리프레시 토큰이 사용되었을 때는 새로 발급한, 현재 유효한 리프레시 토큰도 무효화 해야한다. 해커가 유효한 리프레시 토큰을 이용해서 새로운 리프레시 토큰을 발급하고, 이후 사용자가 자신이 발급 받은 현재 유효하던 리프레시 토큰을 사용하는 경우, 해커의 리프레시 토큰을 무효화하여 더 이상 사용하지 못하도록 해야하기 때문이다.
References
Share article