공부방

쿠키 vs 세션 vs 토큰 본문

문법

쿠키 vs 세션 vs 토큰

코딩 화이팅 2025. 3. 27. 17:20

쿠키, 세션, 토큰이 필요한 이유?

  • 웹사이트는 기본적으로 Stateless(기억을 못함)
  • 그래서 로그인 했다는 걸 기억하게 해주는 도구가 필요하다.

쿠키(Cookie)

  • 브라우저(클라이언트)가 정보를 직접 저장하는 작은 메모
  • 저장 위치 : 브라우저(내 컴퓨터)
  • 용량 : 작음(4KB 정도)
  • 보안 : 조심해야 한다 -> 탈취 가능성
  • 유지 기간 : 직접 정할 수 있다 (만료일 있음)
  • 예 : 교복을 입고 교실에 들어가 이름표를 달고 다닌다.
    • 쿠키 : 이름표
    • 서버는 쿠키를 보고 누가 누군지 알 수 있음

언제 쓰냐?

  • 로그인 후, "자동 로그인" 하고 싶을 때
  • 장바구니 정보를 브라우저에 저장해두고 싶을 때
  • 쿠키는 HTTP 헤더에 실려서 서버로 자동 전송된다.
GET /profile
Cookie: sessionId=abc123; theme=dark;
  • 브라우저를 열 때마다, 쿠키는 서버에 자동으로 따라간다.
  • 쿠키를 만들 때 옵션이 있다.
Cookie cookie = new Cookie("userId", "hyun123");
cookie.setMaxAge(3600); // 유효 시간: 1시간
cookie.setSecure(true); // HTTPS에서만 전송
cookie.setHttpOnly(true); // JS에서 접근 못하게
  • HttpOnly : 해커가 자바스크립트로 훔치지 못하게 막는다.
  • Secure : https 연결에서만 쿠키 전송

 

세션(Session)

  • 서버에 정보를 저장하고, 브라우저는 세션 ID만 가지고 다닌다.
  • 저장 위치 : 서버
  • 브라우저 : 세션 ID만 기억
  • 보안 : 쿠키보다 안전하다
  • 유지 기간 : 일정 시간 후 자동 만료 (ex. 30분)
  • 예 : 이름표를 붙이는 것이 아니라 교실 선생님한테 이름들을 등록해두고 다음엔 누가 누군지 ID 카드를 보여주는 것
    • 세션 = 선생님 머릿속 기억장부
    • 세션 ID = 나만 가진 출입카드

언제 쓰냐?

  • 민감한 정보 (ex. 사용자 정보)는 절대 브라우저에 저장하고 싶지 않을 때
  • 세션의 흐름
    1. 사용자가 로그인함
    2. 서버가 유저 정보를 세션에 저장(예 : sessionId = abc123)
    3. 서버는 이 sessionId를 쿠키로 준다.
    4. 사용자는 다음부터 쿠키에 sessionId = abc123 넣어서 요청
  • 서버가 메모리에 유저 정보를 들고 있다.
session.setAttribute("userId", "hyun123");
String userId = (String) session.getAttribute("userId");
  • 서버 메모리를 많이 쓰니까 많은 사용자가 접속하면 부담이 커진다.
  • 그래서 대형 시스템은 세션을 DB나 Redis에 저장하기도 한다.

 

토큰(Token, 주로 JWT)

  • 내 정보와 서명을 담은 전자 인감증명서 같은 것
  • 저장 위치 : 보통 브라우저 (localStorage, sessionStorage 등)
  • 보안 : 도난 당하면 위험 -> https 꼭 필요
  • 서버 : 아무것도 저장 안 함 (Stateless)
  • 특징 : 모바일 / SPA(리액트 등)와 잘 어울림
  • 예 : 학교에서 내가 누군지, 어떤 반인지 정보가 다 들어 있는 인증서를 만들어줘 이 인증서를 들고 어디든지 다닌다.
    • 토큰 = 정보 + 도장 찍힌 전자 문서
    • 내가 직접 들고 다님
  • 서버는 이게 진짜 인증된 건지 검증만 하고, 따로 기억(보관)은 하지 않는다.

언제 쓰냐?

  • 서버가 사용자 정보를 기억하지 않아야 할 때
  • 모바일 앱이나 SPA(React, Vue) 같은 데서 또는 마이크로서비스 구조일 때
  • 토큰이 어떻게 생겼나?
xxxxx.yyyyy.zzzzz
  • Header : 이건 JWT고, 서명은 HMAC256이다.
  • Payload : {"userId" : "hyun123", "role" : "admin"}
  • Signature : 이 토큰이 위조되지 않았는지 확인하는 서명
  • 왜 서버가 저장하지 않아도 되냐?
    • 토큰 안에 모든 정보가 들어있다.
    • 서버는 토큰을 받고 이게 진짠지 확인만 한다. (서명 검증)
  • 예시 흐름
    1. 로그인 성공 -> 서버가 JWT 생성
    2. 클라이언트(localStorage 등)에 저장
    3. 이후 요청 시(밑 코드)
    4. 서버는 서명을 검증해서 이게 진짠지 위조된게 아닌지 확인만 하면 된다.
GET /mypage
Authorization: Bearer xxxxx.yyyyy.zzzzz

 

'문법' 카테고리의 다른 글

Java의 예외 처리  (0) 2025.03.24
JVM(Java Virtual Machine)  (1) 2025.03.24
자바 스레드(Thread)?  (0) 2025.03.24
프로세스(Process) vs 스레드(Thread)를 쉽게 알아보기  (0) 2025.03.20