Web/기초

[Web] 쿠키(Cookie) & 세션(Session)

luckyd8 2025. 5. 28. 21:48

 
HTTP 프로토콜은 서버에 요청을 보내면, 서버가 응답한 뒤 연결을 바로 종료하는 비연결지향(Connectionless) 특성을 가진다. 또한, 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보를 유지하지 않는(Stateless) 특성을 갖는다.
이러한 한계를 보완하기 위해 웹에서는 쿠키(Cookie)세션(Session)을 사용해 사용자 상태를 유지한다. 
 

쿠키(Cookie) 

쿠키(Cookie)는 웹 서버가 사용자의 브라우저에 저장하는 기록 정보 파일이다.
Key와 Value로 구성된 문자열 쌍으로 되어 있으며, 서버가 클라이언트에게 쿠키를 발급하면 요청에 포함된 쿠키를 통해 사용자를 식별할 수 있다. 

특징
저장 위치 클라이언트(브라우저)에 저장
사용 목적 로그인 상태 유지, 사용자 설정 저장, 광고 추적 등
구성 요소 이름(name), 값(value), 만료 시간, 경로(path), 도메인(domain), 보안 연결 여부, HttpOnly 여부로 구성
전송 방식 HTTP 요청/응답 헤더에 포함됨

 
1. 쿠키 작동 방식

(1) 클라이언트가 서버에 로그인 요청을 함
(2) 서버는 클라이언트의 로그인 요청의 유효성을 확인 후, 응답헤더에 set-cookie: 를 통해 쿠키를 추가해 (브라우저에게) 보냄, 브라우저가 쿠키를 로컬에 저장

HTTP/1.1 200 OK  
Set-Cookie: userid=abc; Expires=Fri, 01 Jun 2025 12:00:00 GMT; Path=/

 
(3) 클라이언트가 같은 도메인으로 요청할 때, (브라우저가) 자동으로 쿠키를 요청 헤더에 추가해 보냄

더보기

쿠키 헤더 구성 요소

Set-Cookie: userid=abc; // Name=Value: 쿠키 이름과 값
            Expires=Fri, 01 Jun 2025 12:00:00 GMT;
            Path=/;
            Domain=example.com;
            Secure;
            HttpOnly;
            SameSite=Lax

 

 

Expires=Fri, 01 Jun 2025 12:00:00 GMT

: 쿠키의 유효기간 (만료 시점)

- GMT: 국제 표준 시간 (그리니치 표준시)

 

Path=/

: 쿠키가 어떤 경로에서 유효한가를 지정, 사이트 전체에 쿠키를 적용하라는 뜻

  만약, Path=/admin인 경우, 오직 /admin과 그 하위 경로에서만 쿠키가 자동 전송됨

 

 Domain=example.com

: 어떤 도메인에 쿠키를 전송할지 지정, Domain 지정 시 넓은 범위에 적용 가능

  (기본적으로는 현재 요청한 도메인만 적용, 하위도메인 미포함)

  예시와 같이 최상위 도메인을 설정하면 example.com과 같은 모든 하위도메인에 대한 요청에도 쿠키를 전송함 

 

Secure

: 이 쿠키는 HTTPS 연결일 때만 전송, 별도의 값은 가지지 않음

 

HttpOnly
: 브라우저의 JavaScript에서 쿠키 접근 금지, document.cookie로 읽을 수 없음 (XSS 공격 방어)

 

SameSite

: 쿠키를 다른 사이트 요청에 실어 보낼지 여부 설정 (CSRF 방지용)

- Strict : 타 도메인 요청에 절대 보내지 않음 

- Lax : 타 도메인 GET 요청은 허용

- None: 모든 경우 허용, 단 Secure 필

 
2. 쿠키 유형

세션 쿠키(Session Cookie)는 사용자가 웹 사이트를 방문하는 동안 메모리에 저장되는 쿠키이다. 사용자가 웹 브라우저 종료 시 자동 삭제되며, 별도의 만료 일자나 유효 기간을 설정하지 않은 쿠키를 의미한다.

영구 쿠키(Persistent Cookie)는 서버의 의해 만료 일시(Expires)나 유효 기간(Max-Age)이 설정된 쿠키이다. 사용자의 하드디스크에 저장되며, 브라우저를 껐다 켜도 살아있다. 만료 일시나 유효 기간이 종료되었을 때 삭제된다. 


3. 쿠키 사용 목적
일반적으로 쿠키는 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 쓰인다.

정보 기록 (Information Storage) 브라우저에 어떤 데이터를 저장하는 행위 
상태 정보 (State Management) 서버와 클라이언트가 상태를 기억하고 유지하기 위한 정보 (클라이언트 식별값을 쿠키에 저장) 
구체적인 활용 목적
세션 관리 (Session Management) 웹 사이트가 사용자를 식별하고 사용자의 로그인 정보를 기억할 수 있도록 함 (상태정보) 
개인화 (Personalization) 사용자별 맞춤형 광고나 웹 사이트 내 환경 설정 등과 같이 사용자의 웹사이트 환경을 개인화하기 위해 사용됨 (정보 기록 + 부분적 상태 정보)
트래킹 (Tracking) 사용자의 행동과 패턴을 분석하고 기록 (정보 기록)

 
 
쿠키는 임의의 사용자가 쿠키를 변조해 다른 사용자 행세를 할 수 있다는 보안상 문제를 가진다. 세션은 이 문제점을 방지하기 위해 사용된다.
 

세션(Session)

세션은 서버가 사용자 개개인의 상태 정보를 기억하는 방식이다. 클라이언트가 서버에 접속한 시점부터 브라우저를 종료해 연결을 끝내는 동안 클라이언트(브라우저)로부터 들어오는 요청들을 하나의 흐름(세션)으로 묶어 관리한다.
즉, 방문자가 웹 서버에 접속해 있는 상태를 의미한다.
 
1. 세션의 작동 방식
세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키를 만들어 클라이언트에 전달하는 방식으로 작동한다.

(1) 클라이언트가 서버에 로그인 요청

POST /login
userid=abc&password=1234

(2) 서버는 로그인 요청의 유효성 확인 후, 쿠키를 이용해 세션을 생성, 저장함 (고유한 세션 ID를 Set-Cookie 헤더에 추가해 응답)

Set-Cookie: PHPSESSID=abc123xyz; Path=/; HttpOnly

(3) 이후 같은 도메인으로 요청할 때, 클라이언트는 (브라우저가) 자동으로 세션 ID를 요청 헤더에 포함시켜 보냄

Cookie: PHPSESSID=abc123xyz

(4) 서버는 요청 헤더의 세션 ID를 보고 사용자를 식별
 
2. 세션과 쿠키의 차이점

항목 세션 쿠키
저장 위치 서버에 저장 클라이언트(브라우저)에 저장
보안 보안이 더 높음
(서버에만 저장)
클라이언트에서 수정 가능
(변조 위험)
용도 서버와 클라이언트 간의 상태 정보 유지 사용자 정보를 클라이언트 측에서 유지  
속도 정보가 서버에 있어 비교적 느림 쿠키는 정보가 클라이언트에 있어 비교적 가벼우나, 네트워크 전송량 부담

 

더보기

세션과 쿠키를 모두 사용하는 이유

 

세션이 보안면에서 훨씬 유리하지만, 서버의 자원을 사용하기에 한계가 존재!

속도가 느려질 수 있어 쿠키와 세션을 적절히 병행 사용하는 것이 좋음