티스토리 뷰

IT/Network

🔐 쿠키, 세션, 토큰 인증의 모든 것 - 상태 없는 웹에서 사용자 인증은 어떻게 가능한가?

Stv 2025. 4. 9. 19:56

목차


    1. 왜 인증이 필요한가?

    : 웹의 기본 통신 프로토콜인 HTTP는 무상태(stateless)이다. 서버는 매 요청마다 사용자가 누구인지 모른다 따라서 사용자의 로그인 상태나 권한 같은 "상태"를 유지 하기 위해 인증 기법이 필요하다.

     

    2. 상태 관리를 위한 3가지 방식

     

    방식 특징 사용 예
    쿠키(Cookie) 클라이언트가 정보를 저장 자동 로그인, 장바구니
    세션(Session) 서버가 정보를 저장, 클라이언트는 키만 가짐 로그인 인증
    토큰(Token, JWT) 클라이언트에 정보를 인코딩하여 저장 모바일, MSA, API 인증

     

    3. 쿠키(Cookie)

     

    📌 쿠키란?

    • HTTP 헤더를 통해 클라이언트(브라우저)에 저장되는 데이터 조각
    • 주로 사용자 식별, 인증 유지, 사용자 설정 기억 등의 용도로 사용

    ✅ 쿠키의 특징

    • 최대 4KB 정도의 크기 제한
    • 자동으로 요청 시 함께 전송됨 (도메인/경로 일치 시)
    • 클라이언트에 저장되므로 보안에 취약할 수 있음
    Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; Max-Age=3600

     

    속성 설명
    Name = Value 쿠키 이름과 값
    Path 어느 경로에서 쿠키를 보낼지
    HttpOnly JS 접근 불가 (보안 강화)
    Secure HTTPS에서만 전송
    Max-Age 쿠키 유효시간 (초 단위)

     

    4. 세션(Session)

     

    📌 세션이란?

    • 서버가 사용자의 상태를 기억하는 방식
    • 클라이언트는 세션 ID만 쿠키로 보관하고, 실제 데이터는 서버에서 관리

    ✅ 세션의 구조

    1. 사용자가 로그인하면 서버가 세션을 생성
    2. 서버는 세션에 사용자 정보를 저장하고, 클라이언트에 세션 ID가 담긴 쿠키 전송
    3. 이후 요청마다 세션 ID를 보내면, 서버가 해당 사용자 정보를 찾아 응답

    ✅ 세션 저장 방식

    • 메모리 저장 (기본)
    • DB 저장 (규모가 클 때)
    • Redis 저장 (속도 + 확장성)

    🔒 세션의 장점/단점

    장점 단점
    보안성이 높다 서버에 저장 공간 필요
    클라이언트에 민감정보 없음 확장성 문제 (로드 밸런싱 시 sticky session 필요)

     

    5. 토큰(Token) 기반 인증 (JWT)

     

    📌  토큰이란?

    • 클라이언트가 인증 정보를 토큰 형태로 들고 다니며 서버와 통신하는 형식
    • 주로 JWT(JSON Web Token) 형태로 사용

    ✅ JWT 구조

    : JWT는 3개의 파트로 구성됨 (Header.Payload.Signature)

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJ1c2VySWQiOjEyMywiaXNzIjoiYXBwLmNvbSJ9.
    JX81vPQ9Er6c7B6VRgfsmMcjZuX3aK3i3yK0UzKvzpA

     

    ✅ JWT의 동작 방식

    1. 클라이언트가 로그인
    2. 서버가 JWT 생성 후 클라이언트에 전달
    3. 클라이언트는 이후 요청마다 JWT를 헤더에 담아 보냄
    4. 서버는 서명을 검증하여 사용자를 식별

    ✅ JWT의 장점과 단점

    장점 단점
    서버가 상태를 기억할 필요 없음 (Stateless) 탈취 시 위험 (재발급 불가)
    수평 확장에 유리 (분산 시스템) 토큰이 클 수 있음 (Payload 포함)
    모바일/SPA/서버리스 구조에 적합 토큰 만료 처리 복잡

     

    6. 쿠키 vs 세션 vs 토큰 요약 비교

    항목 쿠키 세션 토큰(JWT)
    저장 위치 클라이언트 서버 클라이언트
    인증 정보 저장 직접 간접 (ID만) 직접 (Payload)
    보안성 낮음 (조작 가능) 높음 중간 (암호화 필요)
    서버 부하 없음 있음 없음
    확장성 좋음 나쁨 매우 좋음
    모바일/SPA 적합 X O

     

    7. 실무에서는 어떻게 써야 할까?

    • 전통적인 웹 (세션 기반)
      • 로그인 페이지가 있고, 서버에 상태 저장 필요 -> 세션 사용
    • 모바일 앱, SPA, API 서버
      • 상태 저장하지 않고 API만 제공 -> JWT 사용
    • 하이브리드 방식
      • 쿠키 + 세션 또는 JWT + 리프레시 토큰 조합 사용

    ✅ 마무리 요약

    📌 핵심 개념

    • HTTP는 무상태 -> 상태 유지를 위해 인증 기술 필요
    • 쿠키는 클라이언트 측 저장소, 세션은 서버 저장소
    • 토큰(JWT)은 자체에 사용자 정보를 담아 API 요청 시 유리
    • 실무에서는 보안, 확장성, 사용 환경에 따라 적절히 선택해야 함

    🔜 다음 주제로는 벡엔드 개발 언어에 대해 공부하고 포스팅 하려고 한다. 먼저  "Python - 벡은드 입문자에게 가장 사랑받는 언어" 라는 주제로 공부해 보고자 한다.