쿠키와 세션

JWT 토큰

쿠키와 세션 - 서버 기반의 인증 시스템

기존의 인증 시스템으로, 서버 측에서 사용자들의 정보를 기억하고 있어야한다. 이러한 서버를 Stateful한 서버라고한다.

  1. 세션
    1. 사용자가 인증을 할 때, 서버는 이러한 정보를 저장해야하고 이를 세션이라고 한다. 대부분의 경우 메모리에 저장하는데, 로그인 중인 사용자가 늘어날 경우에는 서버의 RAM에 부하가 걸리게 된다.이를 피하기 위해 데이터베이스에 저장을 하기도 하는데, 이러한 방식 역시 데이터베이스에 무리를 줄 수 있다.
  2. 확장성
    1. 사용자가 늘어나게 되면 더 많은 트래픽을 처리하기 위해 여러 프로세스를 돌리거나 컴퓨터를 추가하는 등 서버를 확장해야 한다. 세션을 사용한다면 세션을 분산시키는 시스템을 설계해야 하지만 이러한 과정은 매우 어렵고 복잡한다.
  3. CORS(Corss-Origin Resource Sharing)
    1. 웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있다. 따라서 쿠키를 여러 도메인에서 관리하는 것은 번거롭다.

세션은 사용자의 수 만큼 서버 메모리를 차지하기 때문에,

최근에는 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세

그 중 하나가 JWT ( JSON Web Token) 이다

이러한 문제들 때문에 토큰 기반의 인증 시스템을 사용하게 되었다.

토큰 기반의 인증 시스템

인증받은 사용자들에게 토큰을 발급하고, 클라이언트가 서버에 요청을 할 때 헤더에 토큰을 함께 보내도록 하여 유효성 검사를 한다.

이러한 시스템에서는 더이상 사용자의 인증 정보를 서버에 세션에 유지하지 않고 클라이언트 측에서 들어오는 요청만으로 작업을 처리한다. 즉, 서버 기반의 인증 시스템과 달리 상태를 유지하지 않으므로 Stateless한 구조를 갖는다. 이러한 토큰 기반의 인증 방식을 통해 수 많은 문제점들을 해결할 수 있는데, 대표적으로 사용자가 로그인이 되어있는지 안되어있는지 신경쓰지 않고 손쉽게 시스템을 확장할 수 있다.

토큰 기반 인증 시스템의 이점

  1. 무상태성(Stateless) & 확장성(Scalability)
    1. 토큰은 클라이언트 측에 저장되기 때문에 서버는 완전히 Stateless하며,클라이언트와 서버의 연결고리가 없기때문에 확장하기 매우 적합하다. 만약 사용자 정보가 서버 측 세션에 저장된 경우에 서버를 확장하여 분산처리 한다면, 해당 사용자는 처음 로그인 했었던 서버에만 요청을 받을 수 있도록 설정을 해주어야 한다. 하지만 토큰을 사용한다면 어떠한 서버로 요청이 와도 상관이 없다.
  2. 보안성
    1. 클라이언트가 서버로 요청을 보낼 때 더 이상 쿠키를 전달하지 않으므로, 쿠키 사용에 의한 취약점이 사라지게 된다. 하지만 토큰 환경의 취약점이 존재할 수 있으므로 이에 대해 대비해야한다.