목적
학교에서 3학년 취업자 선배님들께 배우는 도제 교육에서 쿠키, 세션, 토큰에 대해 간단히 설명을 들었는데 자세히 알아보고 공부하면 좋을 것 같아 이렇게 블로그로 작성하게 되었습니다.
먼저 쿠키에 대해 알아보도록 하겠습니다.
쿠키
쿠키는 공개 가능한 정보를 사용자의 브라우저에 저장시킵니다.
쿠키 동작 방식
- 브라우저가 서버에 요청을 보낸다.
- 서버는 클라이언트의 요청에 대한 응답을 작성할 때, 클라이언트 측에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담는다.
- 이후 해당 클라이언트는 요청을 보낼 때, 저장된 쿠키를 요청 헤더의 Cookie에 담아 보낸다.
쿠키 특징
- 쿠키의 속성데 따라 쿠키가 언제 어느 사이트로 전송되는지 다릅니다.
- 쿠키는 보약에 취약합니다. 탈취해서 클라이언트인 척 할 수 있습니다.
- 크롬, 사파리 같은 브라우제에는 쿠키를 관리하기 위한 전용 메모리가 있습니다. 보통 확인할 수 없게 되어있지만, 개발자 도구->application->storage->cookies 항목에 들어가면 현재 사이트의 쿠키를 확인할 수 있습니다.

쿠키의 종류
쿠키는 만료시간 세팅 여부에 따라 지속 쿠키, 세션 쿠키로 나뉘어집니다.
- 지속 쿠키
- 브라우저를 꺼도 만료기간까지 남아있습니다. Max-Age, Expires 속성을 사용해서 만료 기간을 정할 수 있습니다.
- 세션 쿠키
- 브라우저를 끄면 없어집니다.
세션
세션은 기본적으로 서버의 메모리의 존재합니다. 스프링 어플리케이션의 경우 세션은 톰캣이 점유하는 메모리상에 있습니다.
세션 동작 방식
- 클라이언트가 로그인 요청을 보냅니다.
- 서버는 세션을 생성하고 고유한 세션 ID를 발급합니다.
- 서버는 세션 ID를 쿠키(set-cookie)로 클라이언트에 전달합니다.
- 이후 클라이언트가 요청할 때 쿠키에 담긴 세션 ID를 전송합니다.
- 서버는 세션 ID로 사용자 상태를 조회해 인증을 처리합니다.
세션의 특징
- 서버 중심 관리
- 사용자 상태(로그인 여부, 장바구니, 권한 등)를 서버에서 직접 관리합니다.
- 클라이언트에는 최소한의 정보만 저장
- 세션 ID만 쿠키로 저장되고, 실제 데이터는 서버가 들고 있으므로 보안에 유리합니다.
- 상태 유지가 용이
- 서버가 세션에 데이터를 자유롭게 넣고 뺄 수 있어, 로그인/로그아웃, 장바구니, 최근 본 상품 등 상태 기반 기능 구현이 쉽습니다.
- 만료와 무효화가 간단
- 서버가 세션을 지워버리면 즉시 무효화됩니다. (토큰처럼 강제 무효화가 어려운 문제가 없습니다.)
- 프레임워크/서버 지원이 풍부
- 스프링, Django, Express 등 대부분의 웹 프레임워크에서 기본적으로 세션 관리 기능을 제공합니다.
세션 + 쿠키 인증 방식
- 서버가 세션 ID를 생성하고, 클라이언트에 쿠키 형태로 전달합니다.
- 클라이언트는 이후 요청마다 세션 ID 쿠키를 전송합니다.
- 서버는 세션 ID를 기반으로 사용자 정보를 확인합니다.
세션의 장단점
장점
- 보안성이 높다
- 쿠키처럼 사용자 브라우저에 중요힌 데이터를 직접 저장하지 않고, 서버에서 관리하니까 탈취 위험이 상대적으로 적습니다.
- 유연한 관리
-서버가 세션을 들고 있으니까 언제든지 개별 사용자 세션을 강제로 만료시킬 수 있습니다.
-쿠키/토큰은 클라이언트 쪽에서 지우지 않으면 계속 유효할 수 있는데, 세션은 서버 마음대로 통제가 가능하다.
단점
- 서버 메모리/저장소 부담이 큽니다.
- 서버 확장 시 세션 공유/동기화 문제 발생.
토큰
토큰은 사용자 인증 정보를 담은 문자열 입니다.
서버가 별도 상태를 저장하지 않아도, 클라이언트가 들고 있는 토큰만 검증해서 인증할 수 있습니다.
토큰 동작 방식
- 클라이언트가 로그인 요청을 보낸다.
- 서버는 사용자 정보를 확인하고, 해당 정보를 바탕으로 토큰을 발급한다.
- 클라이언트는 토큰을 로컬 스토리지/세션 스토리지/쿠키 등에 저장한다.
- 이후 요청 시 클라이언트는 토큰을
Authorization: Bearer <토큰> 헤더에 담아 전송한다.
- 서버는 토큰을 검증하고, 유효하다면 요청을 처리합니다.
토큰의 특징
- 서버에 별도의 상태 저장소가 필요 없습니다.
- 토큰 자체에 사용자 정보, 만료 시간 등을 포함합니다.
- 주로 JWT(JSON Web Token) 형식을 사용합니다.
- 서버는 토큰이 변조되지 않았는지만 확인하면 됩니다.
- 유효기간이 지나면 토큰이 무효화 됩니다.
JWT 구조
헤더(header).페이로드(Payload).서명(Signature)
- 헤더 : 토큰의 타입(JWT), 알고리즘 정보(HS256 등).
- 페이로드 : 사용자 정보, 만료기간, 발급자 등.
- 서명 : 비밀키로 서명해 변조 여부 확인.
토큰의 종류
액세스 토큰
- 로그인 성공 시 발급되는 기본 토큰
- 보통 짧은 유효 기간(15분~1시간)
- 서버 API 요청 시 인증 수단으로 사용됩니다.
- 짧게 두는 이유 : 탈취되더라도 피해를 줄이기 위함.
리프레시 토큰
- 액세스 토큰이 만료되었을 때, 새로운 엑세스 토큰을 발급받기 위한 토큰
- 상대적으로 긴 유효 기간(며칠~몇 주)
- 직접 API 요청에는 사용되지 않고, 오직 재발급 용도로만 쓰입니다.
- 주로 서버 DB나 보안 쿠키에 안전하게 보관됩니다.
토큰의 장단점
장점
- 서버가 상태를 저장하지 않으므로 확장성에 유리합니다.
- 여러 서비스간 인증에 편리합니다.
단점
- 토큰 탈취 시 악용 가능성이 큽니다.
- 토큰 자체가 커지면 요청마다 전송 부담이 생길 수 있습니다.
- 토큰을 발급받고 나면 만료 전까지 강제로 무효화하기 어렵습니다.
토큰 보안 강화 방식
- 토큰 만료 시간을 짧게 설정하고, 리프레시 토큰을 따로 발급해 관리.
- HTTPS를 통해 전송하고, 가능한 경우 쿠키의
HttpOnly, Secure 속성 활용
HttpOnly란
의미: 자바스크립트에서 쿠키에 접근하지 못하게 막는 속성입니다.
목적: XSS(교차 스트립팅) 공격으로부터 쿠키를 보호
Secure란?
의미: HTTPS 연결에서만 쿠키를 전송하도록 제한하는 속성
목적: 평문 HTTP에서 쿠키가 탈취되는 걸 방지
- 민감한 정보는 페이로드에 직접 넣지 않고, 최소한의 식별자만 담습니다.
마무리
여기까지 쿠키, 세션, 토큰에 대해 알아보았습니다!
감사합니다.