STUDY

[네트워크] 쿠키와 세션 인증

sed 2026. 5. 29. 00:14
SMALL

쿠키와 세션 인증

HTTP는 상태를 유지하지 않는 프로토콜이다.

이를 스테이트리스(stateless)라고 한다.

 

HTTP에서 클라이언트의 모든 요청은 기본적으로 독립적인 요청으로 간주된다.

 

예를 들어 같은 사용자가 서버에 여러 번 요청을 보내도, HTTP 자체만 보면 서버는 이전 요청과 다음 요청이 같은 사용자에게서 온 것인지 기억하지 않는다.

첫 번째 요청: 로그인 페이지 주세요.
두 번째 요청: 장바구니 보여주세요.
세 번째 요청: 결제할게요.

 

HTTP 자체는 이 요청들을 각각 별개의 요청으로 본다.

 

그런데 실제 웹 서비스에서는 상태가 필요한 기능이 많다.

로그인 상태를 유지해야 하고, 장바구니에 담긴 상품도 기억해야 하며, 사용자가 어떤 설정을 선택했는지도 저장해야 한다.

 

서버가 클라이언트의 상태를 전혀 알 수 없다면 이런 기능을 구현하기 어렵다.

 

이 문제를 보완하기 위해 사용하는 대표적인 기술이 쿠키(cookie)이다.

 

쿠키

쿠키는 서버에서 생성되어 클라이언트 측에 저장되는 데이터이다.

HTTP가 상태를 유지하지 않는 특성을 보완하기 위한 수단으로 사용된다.

 

쿠키는 기본적으로 이름과 값의 쌍으로 구성된다.

 

쿠키는 이름과 값 외에도 다양한 속성을 가질 수 있다.

Domain
Path
Expires
Max-Age
Secure
HttpOnly

 

서버는 응답 메시지를 통해 쿠키를 클라이언트에게 전달한다.
클라이언트는 전달받은 쿠키를 저장해두었다가, 이후 같은 서버에 요청을 보낼 때 쿠키를 함께 전송한다.

 

흐름은 다음과 같다.

서버가 쿠키 생성
클라이언트에게 쿠키 전달
클라이언트가 쿠키 저장
이후 요청에 쿠키 포함
서버가 쿠키를 보고 클라이언트 식별

 

쿠키는 로그인 유지, 장바구니, 사용자 설정, 방문 기록 등 여러 기능에 활용될 수 있다.
특히 인증 상태를 유지하는 데 자주 사용된다.

 

 

쿠키가 필요한 이유

HTTP는 기본적으로 상태를 기억하지 않는다.

그러면 클라이언트가 서버에 요청을 보낼 때마다 매번 아이디와 비밀번호를 보내야 할까?

 

예를 들어 로그인 후 마이페이지에 들어가고, 장바구니를 확인하고, 결제 페이지로 이동할 때마다 매번 로그인 정보를 다시 보내야 한다면 매우 불편하다.

 

또한 보안상으로도 매 요청마다 아이디와 비밀번호를 직접 보내는 방식은 좋지 않다.

 

그래서 서버는 로그인에 성공한 클라이언트에게 특정 값을 발급하고, 클라이언트는 이후 요청마다 그 값을 쿠키에 담아 보낸다.

 

서버는 쿠키를 확인해 이 요청이 로그인된 사용자에게서 온 것인지 판단할 수 있다.

 

세션 인증

쿠키를 활용한 대표적인 인증 방식이 세션 인증이다.

세션 인증에서는 서버가 클라이언트를 식별하기 위한 세션 ID를 발급한다.

 

세션 ID는 로그인된 사용자를 구분하기 위한 값이다.

 

전체 흐름은 다음과 같다.

1. 클라이언트가 서버에 인증 정보를 보낸다.
2. 서버는 인증 정보가 올바른지 확인한다.
3. 인증이 성공하면 서버는 세션 ID를 생성한다.
4. 서버는 생성한 세션 ID를 데이터베이스나 메모리에 저장한다.
5. 서버는 세션 ID를 쿠키에 담아 클라이언트에게 보낸다.
6. 클라이언트는 이후 요청마다 쿠키에 세션 ID를 포함한다.
7. 서버는 쿠키 속 세션 ID와 서버에 저장된 세션 ID를 비교한다.
8. 세션 ID가 유효하면 해당 클라이언트를 로그인된 사용자로 판단한다.

 

예를 들어 사용자가 로그인한다고 하자.

클라이언트: 아이디와 비밀번호를 보냄
서버: 인증 성공
서버: 세션 ID 생성
서버: 세션 ID를 쿠키로 전달

 

이후 클라이언트가 마이페이지를 요청할 때는 아이디와 비밀번호를 다시 보내지 않는다.
대신 쿠키에 세션 ID를 담아 보낸다.

클라이언트: 세션 ID가 담긴 쿠키와 함께 마이페이지 요청
서버: 세션 ID 확인
서버: 로그인된 사용자로 판단

 

이 방식 덕분에 매 요청마다 번거로운 인증 과정을 반복하지 않아도 된다.

 

Set-Cookie 헤더

서버가 클라이언트에게 쿠키를 전달할 때는 HTTP 응답 메시지의 Set-Cookie 헤더를 사용한다.

 

예를 들어 서버는 다음과 같은 응답 헤더를 보낼 수 있다.

Set-Cookie: sessionId=abc123

 

이 응답을 받은 클라이언트는 sessionId=abc123이라는 쿠키를 저장한다.

 

쿠키에는 속성도 함께 붙을 수 있다.

Set-Cookie: sessionId=abc123; Path=/; Max-Age=3600; HttpOnly; Secure

 

하나의 응답 메시지에서 여러 쿠키를 전달할 수도 있다.
이 경우 Set-Cookie 헤더를 여러 개 사용할 수 있다.

Set-Cookie: sessionId=abc123; Path=/; HttpOnly
Set-Cookie: theme=dark; Path=/; Max-Age=86400

 

Cookie 헤더

클라이언트가 서버에 쿠키를 보낼 때는 HTTP 요청 메시지의 Cookie 헤더를 사용한다.

 

예를 들어 클라이언트는 이후 요청에서 다음과 같은 헤더를 보낼 수 있다.

Cookie: sessionId=abc123

 

여러 쿠키가 있다면 하나의 Cookie 헤더에 함께 담길 수 있다.

Cookie: sessionId=abc123; theme=dark

 

서버는 이 쿠키 값을 확인해 클라이언트 상태를 추정하거나 인증 여부를 판단한다.

쿠키의 Domain 속성

쿠키는 사용할 수 있는 도메인이 정해져 있다.

Domain 속성은 이 쿠키를 어떤 도메인에 보낼 수 있는지 지정한다.

 

예를 들어 다음과 같은 쿠키가 있다고 하자.

Set-Cookie: sessionId=abc123; Domain=example.com

 

이 쿠키는 example.com 도메인과 관련된 요청에 포함될 수 있다.

Domain 속성을 잘못 설정하면 의도하지 않은 하위 도메인에도 쿠키가 전송될 수 있으므로 주의해야 한다.

쿠키의 Path 속성

같은 도메인 안에서도 경로별로 쿠키를 구분하고 싶을 수 있다.

이때 Path 속성을 사용한다.

Path 속성은 쿠키가 적용될 URL 경로 범위를 제한하는 역할을 한다.

 

쿠키의 유효 기간

쿠키에는 유효 기간을 지정할 수 있다.

 

대표적으로 Expires Max-Age 속성이 사용된다

.

Expires는 쿠키가 만료되는 특정 시각을 지정한다.

Max-Age는 쿠키가 유지될 시간을 초 단위로 지정한다.

 

유효 기간이 지나면 브라우저는 해당 쿠키를 더 이상 사용하지 않는다.

유효 기간을 지정하지 않은 쿠키는 보통 세션 쿠키로 동작한다.
세션 쿠키는 브라우저 세션이 끝나면 삭제될 수 있다.

Secure 속성

쿠키의 대표적인 한계는 보안이다.

쿠키는 클라이언트에 저장되기 때문에 노출되거나 조작될 수 있다.

 

특히 인증에 사용하는 쿠키가 탈취되면 다른 사람이 로그인된 사용자처럼 행동할 위험이 있다.

 

Secure 속성은 HTTPS를 사용하는 경우에만 쿠키를 전송하도록 제한한다.

 

Secure 속성이 설정된 쿠키는 HTTP가 아니라 HTTPS 요청에서만 전송된다.

인증 정보와 관련된 쿠키에는 Secure 속성을 사용하는 것이 좋다.

HttpOnly 속성

쿠키는 기본적으로 브라우저에 저장되며, JavaScript를 통해 접근 가능한 경우도 있다.

 

예를 들어 JavaScript의 document.cookie를 사용하면 쿠키를 읽을 수 있다.

하지만 인증 쿠키가 JavaScript로 접근 가능하면 XSS 공격에 의해 탈취될 위험이 커진다.

 

HttpOnly 속성은 JavaScript에서 쿠키에 접근하지 못하도록 제한한다.

 

HttpOnly가 설정된 쿠키는 HTTP 요청과 응답 과정에서는 사용되지만, JavaScript 코드로는 읽을 수 없다.

인증용 세션 쿠키에는 HttpOnly 속성을 설정하는 것이 일반적이다.

쿠키의 한계

쿠키는 HTTP의 스테이트리스 특성을 보완하는 데 유용하지만, 한계도 있다.

쿠키는 클라이언트 측에 저장된다.
따라서 사용자가 직접 삭제하거나 조작할 수 있고, 보안 설정이 부족하면 탈취될 수도 있다.

 

또한 쿠키는 요청마다 서버로 함께 전송된다.
불필요하게 큰 데이터를 쿠키에 저장하면 요청 크기가 커지고 성능에 영향을 줄 수 있다.

그래서 쿠키에는 민감한 정보를 그대로 저장하지 않는 것이 좋다.

 

예를 들어 비밀번호나 개인정보를 쿠키에 직접 저장하는 것은 위험하다.

세션 인증 방식에서는 쿠키에 사용자 정보 전체를 넣는 대신, 보통 세션 ID만 저장한다.
실제 사용자 정보와 인증 상태는 서버가 관리한다.

LIST