쿠키 세션 토큰!

김지유·2025년 9월 28일
post-thumbnail

목적

학교에서 3학년 취업자 선배님들께 배우는 도제 교육에서 쿠키, 세션, 토큰에 대해 간단히 설명을 들었는데 자세히 알아보고 공부하면 좋을 것 같아 이렇게 블로그로 작성하게 되었습니다.

먼저 쿠키에 대해 알아보도록 하겠습니다.

쿠키

쿠키는 공개 가능한 정보를 사용자의 브라우저에 저장시킵니다.

쿠키 동작 방식

  1. 브라우저가 서버에 요청을 보낸다.
  2. 서버는 클라이언트의 요청에 대한 응답을 작성할 때, 클라이언트 측에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담는다.
  3. 이후 해당 클라이언트는 요청을 보낼 때, 저장된 쿠키를 요청 헤더의 Cookie에 담아 보낸다.

쿠키 특징

  • 쿠키의 속성데 따라 쿠키가 언제 어느 사이트로 전송되는지 다릅니다.
  • 쿠키는 보약에 취약합니다. 탈취해서 클라이언트인 척 할 수 있습니다.
  • 크롬, 사파리 같은 브라우제에는 쿠키를 관리하기 위한 전용 메모리가 있습니다. 보통 확인할 수 없게 되어있지만, 개발자 도구->application->storage->cookies 항목에 들어가면 현재 사이트의 쿠키를 확인할 수 있습니다.

쿠키의 종류

쿠키는 만료시간 세팅 여부에 따라 지속 쿠키, 세션 쿠키로 나뉘어집니다.

  • 지속 쿠키
    - 브라우저를 꺼도 만료기간까지 남아있습니다. Max-Age, Expires 속성을 사용해서 만료 기간을 정할 수 있습니다.
  • 세션 쿠키
    - 브라우저를 끄면 없어집니다.

세션

세션은 기본적으로 서버의 메모리의 존재합니다. 스프링 어플리케이션의 경우 세션은 톰캣이 점유하는 메모리상에 있습니다.

세션 동작 방식

  1. 클라이언트가 로그인 요청을 보냅니다.
  2. 서버는 세션을 생성하고 고유한 세션 ID를 발급합니다.
  3. 서버는 세션 ID를 쿠키(set-cookie)로 클라이언트에 전달합니다.
  4. 이후 클라이언트가 요청할 때 쿠키에 담긴 세션 ID를 전송합니다.
  5. 서버는 세션 ID로 사용자 상태를 조회해 인증을 처리합니다.

세션의 특징

  • 서버 중심 관리
    - 사용자 상태(로그인 여부, 장바구니, 권한 등)를 서버에서 직접 관리합니다.
  • 클라이언트에는 최소한의 정보만 저장
    - 세션 ID만 쿠키로 저장되고, 실제 데이터는 서버가 들고 있으므로 보안에 유리합니다.
  • 상태 유지가 용이
    - 서버가 세션에 데이터를 자유롭게 넣고 뺄 수 있어, 로그인/로그아웃, 장바구니, 최근 본 상품 등 상태 기반 기능 구현이 쉽습니다.
  • 만료와 무효화가 간단
    - 서버가 세션을 지워버리면 즉시 무효화됩니다. (토큰처럼 강제 무효화가 어려운 문제가 없습니다.)
  • 프레임워크/서버 지원이 풍부
    - 스프링, Django, Express 등 대부분의 웹 프레임워크에서 기본적으로 세션 관리 기능을 제공합니다.

세션 + 쿠키 인증 방식

  • 서버가 세션 ID를 생성하고, 클라이언트에 쿠키 형태로 전달합니다.
  • 클라이언트는 이후 요청마다 세션 ID 쿠키를 전송합니다.
  • 서버는 세션 ID를 기반으로 사용자 정보를 확인합니다.

세션의 장단점

장점

  • 보안성이 높다
    - 쿠키처럼 사용자 브라우저에 중요힌 데이터를 직접 저장하지 않고, 서버에서 관리하니까 탈취 위험이 상대적으로 적습니다.
  • 유연한 관리
    -서버가 세션을 들고 있으니까 언제든지 개별 사용자 세션을 강제로 만료시킬 수 있습니다.
    -쿠키/토큰은 클라이언트 쪽에서 지우지 않으면 계속 유효할 수 있는데, 세션은 서버 마음대로 통제가 가능하다.

단점

  • 서버 메모리/저장소 부담이 큽니다.
  • 서버 확장 시 세션 공유/동기화 문제 발생.

토큰

토큰은 사용자 인증 정보를 담은 문자열 입니다.
서버가 별도 상태를 저장하지 않아도, 클라이언트가 들고 있는 토큰만 검증해서 인증할 수 있습니다.

토큰 동작 방식

  1. 클라이언트가 로그인 요청을 보낸다.
  2. 서버는 사용자 정보를 확인하고, 해당 정보를 바탕으로 토큰을 발급한다.
  3. 클라이언트는 토큰을 로컬 스토리지/세션 스토리지/쿠키 등에 저장한다.
  4. 이후 요청 시 클라이언트는 토큰을 Authorization: Bearer <토큰> 헤더에 담아 전송한다.
  5. 서버는 토큰을 검증하고, 유효하다면 요청을 처리합니다.

토큰의 특징

  • 서버에 별도의 상태 저장소가 필요 없습니다.
  • 토큰 자체에 사용자 정보, 만료 시간 등을 포함합니다.
  • 주로 JWT(JSON Web Token) 형식을 사용합니다.
  • 서버는 토큰이 변조되지 않았는지만 확인하면 됩니다.
  • 유효기간이 지나면 토큰이 무효화 됩니다.

JWT 구조

헤더(header).페이로드(Payload).서명(Signature)
  • 헤더 : 토큰의 타입(JWT), 알고리즘 정보(HS256 등).
  • 페이로드 : 사용자 정보, 만료기간, 발급자 등.
  • 서명 : 비밀키로 서명해 변조 여부 확인.

토큰의 종류

액세스 토큰

  • 로그인 성공 시 발급되는 기본 토큰
  • 보통 짧은 유효 기간(15분~1시간)
  • 서버 API 요청 시 인증 수단으로 사용됩니다.
  • 짧게 두는 이유 : 탈취되더라도 피해를 줄이기 위함.

리프레시 토큰

  • 액세스 토큰이 만료되었을 때, 새로운 엑세스 토큰을 발급받기 위한 토큰
  • 상대적으로 긴 유효 기간(며칠~몇 주)
  • 직접 API 요청에는 사용되지 않고, 오직 재발급 용도로만 쓰입니다.
  • 주로 서버 DB나 보안 쿠키에 안전하게 보관됩니다.

토큰의 장단점

장점

  • 서버가 상태를 저장하지 않으므로 확장성에 유리합니다.
  • 여러 서비스간 인증에 편리합니다.

단점

  • 토큰 탈취 시 악용 가능성이 큽니다.
  • 토큰 자체가 커지면 요청마다 전송 부담이 생길 수 있습니다.
  • 토큰을 발급받고 나면 만료 전까지 강제로 무효화하기 어렵습니다.

토큰 보안 강화 방식

  • 토큰 만료 시간을 짧게 설정하고, 리프레시 토큰을 따로 발급해 관리.
  • HTTPS를 통해 전송하고, 가능한 경우 쿠키의 HttpOnly, Secure 속성 활용

HttpOnly
의미: 자바스크립트에서 쿠키에 접근하지 못하게 막는 속성입니다.
목적: XSS(교차 스트립팅) 공격으로부터 쿠키를 보호

Secure란?
의미: HTTPS 연결에서만 쿠키를 전송하도록 제한하는 속성
목적: 평문 HTTP에서 쿠키가 탈취되는 걸 방지

  • 민감한 정보는 페이로드에 직접 넣지 않고, 최소한의 식별자만 담습니다.

마무리

여기까지 쿠키, 세션, 토큰에 대해 알아보았습니다!
감사합니다.

profile
난 아직 너무 부족해요

0개의 댓글