Rest API 통신을 하기위해 우리는 HTTP를 많이 사용합니다.
먼저 Session과 JWT의 대해서 알아보기 위해서 HTTP의 특성에 대해서 알아봅시다.
비연결성은 클라이언트와 서버가 데이터를 주고 받기 위해서 Connection을 맺은 후 클라이언트의 요청에 서버가 응답을 마치면 Connection을 끊어버리는 성질을 말합니다.
서버는 비연결성으로 인해 요청마다 각 클라이언트를 식별할 수가 없습니다. 이를 무상태성이라고 합니다.
이러한 HTTP의 특성으로 인해서 서버가 클라이언트를 식별하기 위해서는 상태를 저장하는 곳이 필요합니다.
서버는 클라이언트의 신원을 검증하고(인증) 클라이언트의 요청을 승인(인가)하기 위해서는 무상태성을 해결할 기술이 필요합니다.
세션은 사용자의 정보를 브라우저가 아닌 서버에서 사용자 정보를 저장하는 구조이다.
토큰 기반 인증은 서버가 발급한 토큰을 클라이언트가 직접 보관하는 방식입니다.
세션 기반 인증은 Session-Id를 세션 저장소에 확인하는 과정을 거쳐야 되기 때문에 비용이 많이 발생한다.
그에 반해 토큰 기반 인증은 토큰의 위변조 여부와 만료 시간만 확인하면 되기 때문에 검증에 비용이 적다.
세션 기반 인증은 쿠키가 탈취되더라도 사용자의 정보를 서버에 저장하기 하기 때문에 사용자 정보를 알기 어렵습니다. 또한 탈취한 쿠키를 통해 비정상적인 접근을 시도 하더라도 세션저장소에 Session-Id를 삭제하면 되기 때문에 비교적 안전합니다.
토큰 기반 인증은 payload가 암호화 되지 않기 때문에 payload의 민감한 정보를 담을 수 없습니다. 또한 토큰이 탈취된다면 서버에서 접속을 차단하지 못합니다.
-> 유효기간을 짧게 둔 AccessToken 과 유효기간을 길게 둔 RefreshToken을 발급하여 해결하곤 합니다.
세션 기반 인증은 서버의 Scale-Out 시 세션의 불일치가 발생하게 됩니다. 서로 다른 서버의 세션 저장소를 동기화할 수 있는 새로운 세션 저장소가 필요합니다.
토큰 기반 인증은 토큰을 발급하고 검증만 하면 되기 때문에 자유롭게 Scale-Out을 할 수 있습니다.