세션 기반, 토큰 기반 로그인 방식 비교(장점, 단점, 보안 취약점)


간단하게 말해서 세션 기반 로그인은 사용자가 시스템에 로그인할 때마다 서버가 세션 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 공격을 통해 토큰이 노출될 위험이 있다. 따라서 웹 애플리케이션의 스크립팅 보안을 강화해야 한다.
  • 토큰 탈취와 유효기간 : 토큰이 탈취되는 경우, 탈취자는 토큰의 유효 기간 동안 사용자의 권한을 가지고 행동할 수 있다. 이를 방지하기 위해 토큰의 유효 기간을 짧게 설정하고, 가능한 경우 토큰의 재발급을 자주 진행해야 한다.