간단하게 말해서 세션 기반 로그인은 사용자가 시스템에 로그인할 때마다 서버가 세션 ID를 생성하여 사용자의 브라우저에 저장하고, 이 ID를 통해 사용자를 식별하는 방식이다. 반면, 토큰 기반 로그인은 서버가 로그인 성공 시 토큰을 생성하여 사용자에게 전달하고, 이후의 모든 요청에 토큰을 포함시켜 사용자를 인증하는 방식이다.
1. 세션 기반 로그인 방식
이 방식에서 핵심적인 요소는 '세션'이라는 개념이다. 세션은 클라이언트와 서버 간의 상호작용을 유지하기 위해 서버에 의해 생성되고 관리되는 일련의 정보들이다.세션 로그인의 작동 원리
- 사용자 인증 : 사용자가 로그인 정보(예: 사용자 이름과 비밀번호)를 웹 사이트에 제공한다.
- 세션 생성 : 인증이 성공하면, 서버는 세션 ID를 생성한다. 이 ID는 고유하며, 서버에서 생성된 세션 정보와 연결된다.
- 세션 ID 저장 : 생성된 세션 ID는 사용자의 브라우저에 쿠키 형태로 저장된다. 이 쿠키는 사용자가 브라우저를 사용하는 동안 유효하다.
- 세션 ID를 통한 요청 인증 : 사용자가 추가 요청을 할 때마다 브라우저는 세션 ID를 포함한 쿠키를 서버에 전송한다. 서버는 이 세션 ID를 확인하여 사용자를 식별하고 요청에 응답한다.
세션 로그인의 장점
- 상태 유지 : 세션 ID를 통해 사용자의 로그인 상태를 지속적으로 유지할 수 있다. 이는 사용자가 사이트를 탐색할 때 매번 로그인할 필요가 없게 해준다.
- 보안성 : 세션 ID는 서버에서만 생성하고 관리되므로, 사용자 정보를 서버의 컨트롤 하에 두는 데 유리하다.
세션 로그인의 단점
- 스케일링 문제 : 서버가 모든 세션 정보를 메모리에 저장해야 하기 때문에, 사용자 수가 많은 대규모 시스템에서는 메모리 부족 문제가 발생할 수 있다.
- 메모리 사용 : 각 사용자에 대해 세션을 유지해야 하므로, 서버의 메모리 사용량이 증가한다. 이는 성능 저하로 이어질 수 있다.
- 쿠키 의존성 : 세션 ID가 쿠키에 저장되므로, 사용자가 쿠키를 비활성화하거나 삭제할 경우 세션 유지가 불가능해진다.
세션 기반 로그인 방식은 사용자와의 지속적인 상호작용이 필요한 웹 애플리케이션에 적합하다. 또한, 사용자의 로그인 상태를 서버 측에서 관리해야 할 필요가 있을 때 유용하게 사용될 수 있다.
2. 토큰 기반 로그인 방식
이 방식은 세션을 서버에 저장하는 대신, 클라이언트 측에서 인증 토큰을 관리한다. 이 토큰은 사용자의 인증 정보를 암호화된 형태로 담고 있어, 클라이언트와 서버 간의 요청이 있을 때마다 이를 사용하여 사용자를 인증한다.토큰 로그인의 작동 원리
- 사용자 인증 : 사용자가 로그인 정보를 입력하면, 서버는 이를 검증한다.
- 토큰 생성 : 인증이 성공하면, 서버는 토큰을 생성한다. 이 토큰에는 사용자의 신원을 확인할 수 있는 정보와 유효 기간 등이 포함된다. 주로 JSON 웹 토큰(JWT) 형식이 사용된다.
- 토큰 전송 : 생성된 토큰은 HTTP 응답을 통해 사용자에게 전달된다.
- 토큰 저장과 관리 : 클라이언트는 받은 토큰을 로컬 저장소에 저장하고, 이후 서버로 요청을 보낼 때마다 헤더에 토큰을 포함시켜 인증을 수행한다.
- 서버의 토큰 검증 : 서버는 요청과 함께 전송된 토큰을 검증하고, 유효한 경우 요청을 처리한다.
토큰 로그인의 장점
- 상태 비저장(statelessness) : 서버는 세션 상태를 유지할 필요가 없으므로, 확장성과 유지보수성이 향상된다.
- 보안성 : 토큰은 정보가 암호화된 형태로 전송되므로, 보안성이 강화된다.
- 다중 플랫폼 지원 : 하나의 토큰을 웹, 모바일 등 다양한 클라이언트에서 사용할 수 있어, 시스템의 유연성이 증가한다.
- 인증 정보의 자체 포함성 : 토큰 자체에 사용자 인증 정보가 포함되어 있어, 별도의 인증 저장소가 필요 없다.
토큰 로그인의 단점
- 토큰 관리의 복잡성 : 클라이언트 측에서 토큰을 안전하게 저장하고 관리해야 하는 책임이 생긴다.
- 토큰 크기 : 토큰이 HTTP 헤더에 포함되므로, 크기가 큰 토큰은 네트워크 오버헤드를 증가시킬 수 있다.
- 보안 취약점 : 토큰이 탈취되면, 탈취자는 토큰의 유효 기간 동안 사용자의 권한을 가지고 행동할 수 있다.
토큰 기반 로그인 방식은 특히 상태를 서버에 저장하지 않고 클라이언트 측에서 전적으로 관리할 수 있는 환경에서 매우 유용하다. 그래서 클라우드 서비스, 대규모 분산 시스템, 그리고 서비스의 빠른 확장이 필요한 경우에 적합하다고 볼 수 있다.
3. 세션 vs 토큰 보안적 측면 비교
세션과 토큰 방식은 각각의 보안 특성과 취약점을 가지고 있다.세션 기반 로그인 보안
세션 기반 로그인은 서버가 모든 세션 정보를 관리하며, 클라이언트는 서버로부터 받은 세션 ID만을 쿠키에 저장한다. 이 구조는 다음과 같은 보안 특성을 가진다.
- 중앙 집중식 보안 관리 : 서버가 세션 정보를 완전히 통제하므로, 보안 정책을 일관되게 적용할 수 있다.
- 쿠키 탈취의 위험 : 세션 ID가 저장된 쿠키가 탈취되면, 공격자는 사용자의 세션을 도용할 수 있다. 이를 방지하기 위해 HTTPS를 통한 쿠키의 안전한 전송, 쿠키에 HttpOnly와 Secure 플래그를 설정해야 한다.
- 세션 고정 공격 : 공격자가 세션 ID를 미리 설정하고 사용자가 이를 사용하게 만든 후 이를 이용해 사용자를 모방하는 공격을 막기 위해, 로그인 후 새로운 세션 ID를 발급해야 한다.
토큰 기반 로그인의 보안
토큰 기반 로그인에서는 인증 토큰이 클라이언트에 저장되고, 이 토큰을 사용하여 서버와의 통신에서 사용자를 인증한다. 보안 측면에서의 특성은 다음과 같다.
- 자가 포함 구조 : 토큰은 필요한 모든 사용자 정보를 암호화된 형태로 포함하고 있어, 서버는 토큰을 검증만 하면 된다. 이는 토큰이 독립적으로 작동할 수 있게 해, 서버의 부하를 줄이고 보안을 강화한다.
- 크로스-사이트 스크립팅(XSS) 취약점 : 클라이언트 사이드에서 토큰을 저장하게 되면, XSS 공격을 통해 토큰이 노출될 위험이 있다. 따라서 웹 애플리케이션의 스크립팅 보안을 강화해야 한다.
- 토큰 탈취와 유효기간 : 토큰이 탈취되는 경우, 탈취자는 토큰의 유효 기간 동안 사용자의 권한을 가지고 행동할 수 있다. 이를 방지하기 위해 토큰의 유효 기간을 짧게 설정하고, 가능한 경우 토큰의 재발급을 자주 진행해야 한다.