쿠키 vs 세션 vs 토큰 (JWT)

2025. 5. 2. 13:06·개발 | 프로젝트

웹과 앱에서 사용자 인증(Authentication)과 인가(Authorization)를 처리할 때, 대표적으로 사용하는 방식은 다음과 같습니다.

  1. 쿠키(Cookie) 방식
  2. 세션(Session) 방식
  3. JWT(JSON Web Token) 방식

각 방식이 어떻게 작동하는지 알아보고, 상황에 따라 어떤 방식을 사용하는 것이 적합한지 알아보겠습니다.

 

 

웹사이트에서 로그인한 후 마이페이지를 누르거나 글을 쓰는 등의 행동은 서버에 새 요청을 보내는 것입니다. 하지만 이 요청은 이전 로그인 정보와 연결되지 않은 익명 요청이기 때문에, 서버는 "이 요청이 로그인한 사용자에게서 온 것인지" 알 수 없습니다.


그래서 사용자가 로그인 상태임을 인증할 수단이 없으면, 매번 아이디와 비밀번호를 반복해서 입력해야 하는 불편함이 생깁니다. 이런 번거로움을 해결하기 위해  쿠키, 세션, JWT 같은 인증 방식이 필요합니다.


1. 쿠키(Cookie) 방식

  • 클라이언트(브라우저)가 서버로부터 받은 인증 정보를 쿠키에 저장해두고, 이후 요청마다 쿠키를 자동으로 서버에 함께 전송합니다.

장점

  • 클라이언트가 알아서 요청마다 쿠키를 보내주기 때문에 편리함
  • 브라우저에 내장된 기능이므로 별도 구현이 간단함
  • 사용자 경험(UX)에 유리 (자동 로그인 등)

단점

  • 쿠키는 브라우저에 저장되기 때문에, CSRF 공격에 취약할 수 있음
  • 모바일 앱에서는 쿠키 자동 전송 기능이 제한적이어서 비효율적일 수 있음
  • 쿠키는 당사자뿐만 아니라 제 3자가 조회하는 것도 가능하기 때문에 개인 정보를 담은 내용이나 보안상 민감한 정보를 저장하는 데에는 적합하지 않음

 

 

 


2. 세션(Session) 방식

  • 로그인 시 서버에서 유저 정보를 저장한 세션ID를 생성해놓고, 클라이언트에는 그 ID만 쿠키로 전달합니다.
  • 서버는 해당 ID를 통해 사용자 정보를 계속 추적할 수 있습니다.

장점

  • 사용자 정보를 서버가 직접 관리하므로 보안성이 높음
  • 민감한 정보를 클라이언트에 노출하지 않음

단점

  • 서버가 세션 상태를 계속 기억해야 하기 때문에, 사용자가 많아지면 서버의 메모리 부담 증가
  • 서버 확장이 어려워짐 (stateless 아님)

 


3. JWT(JSON Web Token) 방식

  • 로그인 시, 서버는 사용자 정보를 암호화한 토큰(JWT)을 생성해 클라이언트에 전달
  • 클라이언트는 이 토큰을 로컬 저장소에 저장하고, 요청 시마다 헤더에 Authorization: Bearer 토큰 형태로 전송

장점

  • 서버가 세션 정보를 저장할 필요가 없어 stateless 구조로 확장성에 유리
  • 토큰 안에 정보를 담을 수 있어, 추가 요청 없이 유저 정보 확인 가능
  • 모바일 앱 환경에 최적화 (쿠키 자동 전송 기능 없음)

단점

  • 토큰 탈취 시 위험. 한 번 탈취되면 중간에 무효화하기 어려움 (refresh token 도입으로 해결 가능)
  • 토큰 크기가 커질 수 있음 → 네트워크 비용 증가 가능성

 

 


정리

 

  • 웹 브라우저 중심의 간단한 인증: 쿠키 or 세션 방식
  • 보안이 중요하고 확장성이 낮아도 되는 웹 서비스: 세션 방식
  • 모바일 앱 또는 확장성과 분산 서버 환경을 고려하는 경우: JWT 토큰 방식이 가장 적합

 

 

 

'개발 | 프로젝트' 카테고리의 다른 글

[LLM] Llama 3 설치 / llama 3.2 Bllossom 3B gguf 한국어 모델 사용하기  (0) 2025.05.08
[YOLO] YOLOv5 모델 학습 / 예제 코드  (0) 2025.05.08
[YOLO] Detection & Segmentation, Segmentation 라벨에서 Bounding Box(바운딩 박스)로 변환  (1) 2025.04.30
[React Native] 빌드 속도 향상 (캐시화)  (0) 2025.04.29
YOLO / CNN 차이  (0) 2025.04.21
'개발 | 프로젝트' 카테고리의 다른 글
  • [LLM] Llama 3 설치 / llama 3.2 Bllossom 3B gguf 한국어 모델 사용하기
  • [YOLO] YOLOv5 모델 학습 / 예제 코드
  • [YOLO] Detection & Segmentation, Segmentation 라벨에서 Bounding Box(바운딩 박스)로 변환
  • [React Native] 빌드 속도 향상 (캐시화)
seulll
seulll
개인 공부 / 정리 블로그입니다
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
    • 분류 전체보기 (330) N
      • 코딩테스트 (226) N
        • programmers (python) (156)
        • 백준 (python) (68) N
      • 자료구조 | 알고리즘 (14)
      • 개발 | 프로젝트 (40)
        • Python (4)
        • Java | Spring (7)
        • Android (4)
        • Unity (3)
        • API (4)
      • CS (15)
        • Network (5)
        • SQL (2)
        • OS (4)
      • 데이터 분석 (14)
      • 기타 (12)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 링크

    • GitHub
  • 인기 글

  • 태그

    카카오맵 api
    그리디 알고리즘
    백엔드 개발자 역량
    Greedy
    kakao map api
    confusion matrix
    프렌즈4블록
    코딩테스트
    train_test_split
    티스토리챌린지
    Boxplot
    박스플롯
    오차행렬
    웹크롤링
    API
    프로그래머스
    카카오맵
    야근 지수
    백엔드
    asterisk
    모델 성능 평가
    대입 표현식
    파이썬
    바다코끼리
    오블완
    Python
    백엔드 개발자
    데이터분석
    solving environment
    2 x n 타일링
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
seulll
쿠키 vs 세션 vs 토큰 (JWT)
상단으로

티스토리툴바