본문 바로가기
Network Study

쿠키, 세션, JSON 웹 토큰(JWT)

by xogns93 2024. 9. 30.

1. 쿠키(Cookie)

쿠키는 클라이언트(브라우저)에 저장되는 작은 데이터 조각으로, 서버가 클라이언트의 상태 정보를 기억하기 위해 사용합니다. 주로 서버가 클라이언트에게 응답할 때, 클라이언트에게 쿠키를 설정해 두면 이후 클라이언트가 서버에 요청을 보낼 때 쿠키를 자동으로 포함하게 됩니다.

  • 용도: 로그인 상태 유지, 세션 ID 저장, 사용자 선호 설정 등을 저장.
  • 특징: 클라이언트 측에 저장되며, 요청 시마다 서버로 자동 전송됨.
  • 단점: 클라이언트 측에 저장되므로 보안에 취약할 수 있음.

2. 세션(Session)

세션은 서버 측에서 유지되는 사용자 상태 정보입니다. 사용자가 서버에 로그인하면 서버가 세션을 생성하고, 클라이언트는 세션 ID를 쿠키에 저장하여 요청 시마다 이 세션 ID를 서버로 전송합니다. 서버는 이 세션 ID를 기반으로 사용자 상태를 식별하고, 필요한 정보를 유지합니다.

  • 용도: 로그인 상태, 사용자 정보 등을 서버에서 관리.
  • 특징: 서버에 저장되며, 클라이언트는 세션 ID만 가지고 서버에 요청.
  • 단점: 많은 사용자가 접속할 때 서버 측에 세션 정보를 유지해야 하므로 서버 부하가 발생할 수 있음.

3. JSON 웹 토큰(JWT - JSON Web Token)

최근 많이 사용되는 인증 방식은 **JWT(JSON Web Token)**입니다. JWT는 클라이언트와 서버 사이에서 상태 정보를 유지하는 **자체 포함된 토큰(self-contained token)**입니다. JWT는 서버가 클라이언트에게 발급한 토큰을 클라이언트가 저장하고, 이후 요청 시마다 이 토큰을 서버에 전송하여 인증을 진행합니다. 서버는 세션을 유지할 필요가 없으며, 토큰 안에 사용자의 인증 정보가 포함되어 있어 서버는 토큰만으로도 인증 처리가 가능합니다.

  • 구성: JWT는 세 가지 부분으로 구성됩니다: 헤더(Header), 페이로드(Payload), 서명(Signature).
    • 헤더: 토큰의 타입(JWT)과 알고리즘 정보.
    • 페이로드: 사용자 정보나 만료 시간 등의 클레임(claim)이 포함됩니다.
    • 서명: 헤더와 페이로드를 기반으로 비밀 키로 생성한 서명. 이를 통해 데이터 변조 여부를 검증합니다.
  • 용도: 주로 API 인증에 많이 사용되며, 서버가 상태 정보를 유지할 필요가 없는 무상태(stateless) 인증 방식에 적합.
  • 특징:
    • 자체 포함(Self-contained): JWT 자체에 사용자의 인증 정보가 포함되어 있어 서버가 세션을 유지할 필요가 없음.
    • 확장성: JWT는 중앙 집중식 세션 저장소 없이도 서버 간 확장(예: 여러 서버에서 인증 처리 가능)이 용이함.
    • 보안: 서버는 토큰을 통해 사용자의 인증을 검증하지만, 토큰이 유출되면 만료 전까지는 인증이 유지되므로 주의가 필요함.
  • 단점: JWT가 자체 포함된 정보이므로, 토큰이 커질 수 있으며 클라이언트와 서버 간에 요청 시 토큰이 함께 전송되므로 네트워크 비용이 발생할 수 있음. 또한, 보안 측면에서 만료되지 않은 JWT가 유출되면 위험할 수 있음.

쿠키, 세션, JWT의 차이점 요약

  • 쿠키: 클라이언트에 저장되는 작은 데이터. 주로 세션 ID 저장에 사용.
  • 세션: 서버에 저장되는 사용자 상태 정보. 클라이언트는 세션 ID를 통해 서버에 인증 요청.
  • JWT: 자체적으로 사용자 정보를 포함한 토큰으로, 서버에 상태를 저장하지 않고 인증 처리 가능.

요즘 세션 대신 JWT를 많이 쓰는 이유

  • 확장성: JWT는 상태 정보를 서버에 유지하지 않으므로, 서버 간 확장이 쉬워 클라우드 환경이나 마이크로서비스 아키텍처에서 많이 사용됩니다.
  • 무상태: 서버에 상태를 저장하지 않기 때문에 각 요청은 독립적으로 처리되고, 서버 부하가 줄어듭니다.
  • 편리한 인증 처리: JWT는 클라이언트 측에서 쉽게 사용 가능하며, 다양한 플랫폼에서 사용할 수 있습니다.

그래서 최근에는 세션 대신 JWT를 많이 사용하는 추세입니다.