[Web] 토큰
in Web
세션 기반 인증
- 세션 기반 인증은 서버에서 사용자들의 정보를 기억하기 위해 세션을 유지(디스크 혹은 메모리)
- 클라이언트의 상태를 계속해서 유지하고 이를 서비스에 이용하므로 이러한 서버를 Stateful 서버라고 함
세션 기반 단점
- 트래픽이 늘어날수록 세션을 유지하는 메모리 혹은 DB에 부하가 되고 이는 성능 저하로 이어짐
- 확장성을 위해 스케일 아웃 시 세션을 분산 시키기가 어려움
- 쿠키는 단일 도메인 혹은 서브 도메인에서만 작동하도록 설계되어 있어서, 쿠키를 여러 도메인에서 사용하기 어려움
토큰 기반 인증
- 서버 측에 더이상 클라이언트 정보를 저장하지 않고 토큰을 통해 인증함
- 서버는 인증받은 사용자들에게 토큰을 발급하고, 클라이언트는 서버에 요청 시 헤더에 토큰을 함께 보냄
- 서버는 유효성 검사만 하면 되기 때문에 부담이 없음(stateless)
토큰 기반 인증 동작 과정
- 사용자가 아이디와 비밀번호로 로그인
- 서버 측에서 해당 정보를 검증
- 정보가 정확하다면 서버 측에서 사용자에게 Signed 토큰을 발급(Signed는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 Signature를 가지고 있다는 것)
- 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때마다 해당 토큰을 서버에 함께 전달. 이때 HTTP 요청 헤더에 토큰을 포함
- 서버는 토큰을 검증하고, 요청에 응답
토큰 기반 인증 장점
무상태성 및 확장성
- 토큰은 클라이언트 쪽에만 저장되므로 서버는 stateless
- 세션 기반과 달리 분산 처리 경우에도 어떤 서버로 요청이 와도 처리가 가능
보안성
- 클라이언트는 더이상 서버에 쿠키를 전달하지 않으므로, 쿠키 사용에 의한 취약점이 사라짐
확장성(Extensibility)
- 로그인 정보가 사용되는 분야를 확장할 수 있음
- 사용자 별로 토큰에 선택적 권한을 부여하여 발급(OAuth 등에 활용)
여러 플랫폼 및 도메인
- 어떤 플랫폼, 도메인에서도 토큰 유효성 검사만 가능하면 요청을 처리할 수 있음