
HTTP는 무상태 프로토콜의 일종이다.
무상태 프로토콜
각 요청 간에 독립적으로 처리되며, 어디에도 저장되지 않고 서로 다른 요청 간에 관계가 없는 프로토콜.
따라서, HTTP 자체로는 요청 시마다 인증을 반복해야하는 문제점 발생.
이러한 HTTP 프로토콜의 한계를 극복하기 위한 인증 방식이 2가지 있다.
서버 기반 인증 방식으로, 서버 내 세션을 통해 인증/인가 정보를 저장 및 관리한다.
클라이언트 측에는 Session ID만 발급하여 인증/인가 시 사용하도록 한다.
보안성은 좋지만, 서버의 부담이 커지게 되는 문제점이 발생한다.
이를 위해 수직 스케일 업을 하기에는 비용이 부담되고, 수평 스케일 업을 하기에는 서버가 분리되어 서버 간 인증 정보의 불일치가 발생할 수 있다.
토큰 기반 인증 방식의 대표적인 예로 JWT 가 있다.
토큰 기반 인증은 로그인 성공 시 서버에서 클라이언트로 토큰을 발급하고 이를 요청 시마다 헤더에 저장하여 인증/인가 시 사용한다.
하지만, 이러한 방식은 민감정보가 외부에 노출될 위험이 크기 때문에 실제 민감정보 대신에 회원을 식별할 uuid와 같은 정보가 토큰에 담기게 된다.
하지만, 통신 자체에도 세션아이디에 비해 토큰이 상당히 더 무거워 통신 시 오버로드가 걸릴 수도 있다.
또한, 서버에서는 이미 발급된 토큰에 대해 아무런 제어도 불가하기 때문에 , 토큰이 만료되기 전까지 어떠한 제어도 불가하다.
이러한 취약점을 보완하기 위한 것이 AccessToken과 RefreshToken 개념이다.