세션 기반 인증과 토큰 기반 인증에 대해 알아보자.
HTTP의 Stateless(비상태성)
HTTP는 비상태성이라는 특성을 갖습니다.
서버는 클라이언트의 상태를 저장하지 않기때문에 이전의 요청에서 인증과정을 거쳤는지 알 방법이 없습니다.
이러한 특성은 사용자에게 어떤 서비스를 이용하더라고 매번 로그인을 해야하는 불편함을 강요합니다.
또한 id, password 등의 매번 요청마다 함께 보내는 방식은 보안에도 취약하고 전송 데이터가 커지므로 비효율적으로 됩니다.
이러한 여러 문제들을 해결하기위해 세션과 토큰 등을 활용합니다.
세션 기반 인증 방식
세션 기반 인증 방식은 사용자의 인증 정보가 서버의 세션 저장소에 저장됩니다.
사용자가 로그인 인증에 성공하면 해당 정보를 서버의 세션 저장소에 저장하고, 사용자에게는 세션 정보를 식별할 Session_id를 발급합니다.
사용자는 인증에 성공 시 받은 Session_id를 다음 요청에 같이 보내는 것으로 인증된 사용자임을 알려줄 수 있습니다.
보통 Cookie + Session 기반 인증 방식을 사용합니다.
장단점
장점
서버에 저장하기 때문에 매우 관리가 편하고 효율적이다.
신뢰할 수 있는 유저인지 서버에서 추가로 확인이 가능하다.
단점
세션 기반 인증 방식은 서비스가 세션 데이터를 직접 저장하고, 관리하므로 세션 데이터의 양이 많아지면 많아질수록 서버의 부담이 증가합니다.
여전히 쿠키를 사용하기 때문에 XSS공격 등에 취약합니다.
서버 확장 방식을 수평 확장 (즉, 서버를 여러 서버로) 으로 늘릴 때 세션 불일치 문제를 겪게 됩니다.
토큰 기반 인증 방식
토큰 기반 인증 방식은 세션 기반과 다르게 클라이언트가 직접 인증 정보를 저장합니다.
인증 정보를 토큰의 형태로 브라우저에 저장합니다.
요청할 때 HTTP 의 Authorization 헤더에 토큰을 담아 보내면 서버가 인증 정보를 확인해 인가합니다.
장단점
장점
- Statelessness & Scalability (무상태성 & 확장성)
- 서버는 클라이언트에 대한 정보를 저장할 필요가 없고, 토큰을 헤더에 추가만 하면 인증절차가 완료됩니다.
- 안정성
- 암호화 한 토큰을 사용하므로 암호화 키를 노출할 필요가 없습니다.
토큰을 생성하는 서버가 꼭 토큰을 만들지 않아도 된다.
- 토큰의 Payload안에 어떤 정보에 접근 가능한지 정의가 되어 있다.
단점
JWT는 매우 복잡한 표준이어서 사용자가(개발자) 잘못 이해할 가능성이 있습니다.
JWT의 크기가 상대적으로 커서 쿠키에 JWT를 담으면 오버헤드가 발생할 수 있습니다.