1. 쿠키 (Cookie)
정의
- 쿠키는 웹 서버가 클라이언트(브라우저)에 저장하는 작은 데이터 조각
- 키-값 쌍으로 구성되어 있음
쿠키의 HTTP 헤더
Cookie
- 클라이언트가 서버에 요청을 보낼 때 포함되는 헤더
- 클라이언트에 저장된 모든 쿠키가 이 헤더에 포함되어 전송
- 목록 내 쌍들은 세미콜록과 공백(
'; '
)으로 구분
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
Set-Cookie
- 서버가 클라이언트에 쿠키를 설정할 때 사용하는 헤더
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
구조 예시
Set-Cookie: key=value; expires=Mon, 04 Nov 2024 03:21:00 GMT; max-age=3600; path=/; domain=example.com; secure; HttpOnly; SameSite=Strict
- key=value: 쿠키의 이름과 값.
- expires: 쿠키의 만료 시간을 UTC 형식으로 지정. 해당 시간이 지나면 쿠키는 삭제. 시간은 서버가 아닌 쿠키가 설정되는 클라이언트에 상대적임.
- max-age: 쿠키의 최대 수명(초 단위). expires 대신 사용할 수 있으며, 생성된 시점으로부터의 상대적인 수명을 설정. 만약 Expire와 Max-Age를 둘 다 설정했으면 Max-Age가 우선순위를 가짐.
- path: 쿠키가 유효한 URL 경로를 지정. 기본값은 쿠키를 설정한 경로와 그 하위 경로.
- domain: 쿠키가 유효한 도메인을 지정. 기본적으로 쿠키를 설정한 도메인에서만 유효하지만, 서브도메인에서도 사용할 수 있도록 설정할 수 있음. 만약 생략된다면 하위 도메인을 포함하지 않고, 현재 문서 URL의 도메인을 기본 값으로 설정.
- secure: 이 속성이 설정되면, localhost를 제외한 HTTPS 프로토콜을 통해서만 쿠키가 전송. 이는 중간자 공격을 방지하는 데 유용.
- HttpOnly: 이 속성이 설정된 쿠키는 JavaScript에서 접근할 수 없음. 이를 통해 XSS 공격으로부터 쿠키를 보호할 수 있음.
- SameSite: 사이트 간 요청과 함께 쿠키가 전송될지를 제어하여 사이트 간 요청 위조 공격(CSRF)을 방지하기 위한 속성.
- Strict: 동일한 사이트 에서만 쿠키를 전송. 즉, 사용자가 다른 사이트에서 링크를 클릭하여 요청을 보낼 때는 쿠키가 포함되지 않음. 가장 높은 수준의 보안을 제공하지만, 사용자 경험에 영향을 줄 수 있습니다.
- Lax: 기본값으로 설정되는 경우가 많으며, 사용자가 다른 사이트에서 링크를 클릭하여 해당 사이트로 이동할 때는 쿠키가 전송되지만, POST 요청과 같은 더 위험한 요청에서는 쿠키가 전송되지 않음. 사용자 경험을 어느 정도 유지하면서도 CSRF 공격에 대한 방어를 제공함.
- None: 모든 요청에 쿠키를 전송. 즉, 다른 사이트에서 발생하는 요청에도 쿠키가 포함됨. 반드시 Secure 속성과 함께 사용해야 함. CSRF 공격에 취약할 수 있으므로 신중하게 사용해야 함.
세션 쿠키 vs 지속 쿠키
- 세션 쿠키 : 클라이언트가 종료될 때 쿠키를 제거. Expires 또는 Max-Age 속성을 지정하지 않음.
Set-Cookie: sessionId=38afes7a8
- 지속 쿠키 : 클라이언트가 종료될 때가 아니라, 특정 날짜(Expires) 또는 특정 시간 후(Max-age)에 제거.
Set-Cookie: id=a3fWa; Expires=Mon, 04 Nov 2024 03:21:00 GMT
or
Set-Cookie: id=a3fWa; Max-Age=2592000
특징
- 저장 위치: 클라이언트의 브라우저에 저장.
- 용량 제한: 각 쿠키는 약 4KB (4096byte)로 제한.
- 만료 시간: 만료 시간을 설정할 수 있으며, 특정 시간이 지나면 자동으로 삭제.
- 자동 전송: 클라이언트가 같은 도메인에 대한 요청을 보낼 때 자동으로 서버에 전송.
- 브라우저가 관리 : 브라우저가 관리하며 각 브라우저에 동일한 쿠키 내용이라 하더라도 서로 별개의 쿠키로 적용됨.
동작 원리
- 서버가 클라이언트에게 쿠키를 설정하는 HTTP 응답을 보냄. 예를 들어, 사용자가 로그인할 때 세션 ID를 쿠키로 설정.
- 클라이언트의 브라우저가 쿠키를 저장. 이는 브라우저의 메모리에 저장되며, 특정 도메인에 대해 유지.
- 클라이언트가 서버에 요청을 보낼 때마다 저장된 쿠키가 자동으로 포함. 이때 요청 헤더의 Cookie 필드에 쿠키가 포함되어 전송.
- 서버는 쿠키를 읽어 사용자 정보를 확인하고 필요한 처리를 수행. 예를 들어, 세션 ID를 사용하여 사용자의 로그인 상태를 확인.
장점
- 간편한 사용: 서버와 클라이언트 간의 정보를 쉽게 주고받을 수 있음.
- 다양한 정보 저장 가능: 사용자 설정, 테마, 로그인 정보 등을 저장하는 데 유용함.
- 자동 전송: 요청 시 자동으로 포함되므로 별도의 작업이 필요 없음.
- 다양한 용도: 인증, 사용자 설정, 세션 관리 등 다양한 용도로 활용할 수 있음.
단점
- 보안 취약점: XSS(교차 사이트 스크립팅) 공격에 노출될 수 있음.
- CSRF 공격: 쿠키는 CSRF(크로스 사이트 요청 위조) 공격에 취약할 수 있음.
- 용량 제한: 한개의 쿠키당 최대 4KB(4096byte)크기로 제한되어 있어 대량의 데이터를 저장할 수 없음.
- 저장 제한: 클라이언트는 총 300개의 쿠키를 저장할 수 있으며, 하나의 도메인당 20개의 쿠키를 가질 수 있음.
보안 고려 사항
- HttpOnly 속성: 쿠키에 HttpOnly 속성을 설정하여 JavaScript에서 접근할 수 없도록 하여 XSS 공격을 방지.
- Secure 속성: Secure 속성을 설정하여 HTTPS를 통해서만 쿠키가 전송되도록 하여 중간자 공격을 방지.
- SameSite 속성: CSRF 공격을 방지하기 위해 SameSite 속성을 설정하여 쿠키가 사이트 간 요청에 포함될 수 있는지를 제어.
2. 세션(Session)
정의
- 세션은 서버 측에서 사용자와의 상호작용을 추적하는 방법으로, 사용자가 웹 애플리케이션에 로그인한 후부터 로그아웃할 때까지의 상태를 유지.
- 각 사용자는 고유한 세션 ID를 가지고 있으며, 이 ID를 통해 서버는 사용자의 상태를 관리.
세션 ID와 세션 데이터
- 세션 ID
- 사용자의 세션을 식별하기 위한 고유한 문자열.
- 클라이언트는 이 ID를 통해 서버에 요청을 보낼 때 세션을 식별함.
- 세션 ID는 일반적으로 쿠키에 저장되거나 URL 파라미터를 통해 전달됨.
- 세션 데이터:
- 서버에 저장되는 클라이언트와 관련된 정보.
- 예를 들어, 사용자 로그인 정보, 장바구니 내용, 사용자 설정 등이 포함될 수 있음.
- 세션 데이터는 서버의 메모리, 데이터베이스, 또는 파일 시스템에 저장될 수 있음.
특징
- 저장 위치: 세션 데이터는 서버에 저장되며, 클라이언트는 세션 ID를 통해 접근함.
- 상태 유지: 세션은 사용자의 로그인 정보와 다른 상태 정보를 유지하여 여러 페이지를 탐색하는 동안 일관된 사용자의 상태를 제공함.
- 만료 시간: 세션은 일정 시간이 지나면 만료되거나 사용자가 로그아웃할 때 종료됨. 세션 만료 시간은 서버에서 설정할 수 있음.
동작 원리
- 사용자가 웹 애플리케이션에 로그인하면, 서버는 새로운 세션을 생성하고 세션 ID를 생성.
- 서버는 세션 ID를 클라이언트에 전달. 보통 쿠키를 통해 전달.
- 서버는 세션 ID와 관련된 사용자 정보를 세션 데이터로 저장.
- 클라이언트는 이후 서버에 요청할 때마다 세션 ID를 포함하여 전송.
- 서버는 세션 ID를 기반으로 세션 데이터를 조회하고, 사용자의 상태를 확인.
- 사용자가 로그아웃할 경우, 서버는 해당 세션을 종료하고 세션 데이터를 삭제.
장점
- 보안성: 세션 데이터는 서버에 저장되므로 클라이언트에서 직접 접근할 수 없어 상대적으로 안전함.
- 상태 관리: 사용자의 로그인 정보와 다른 상태 정보를 유지하여 여러 페이지를 탐색하는 동안 일관된 사용자 상태를 제공함.
- 서버 측 관리: 세션 데이터는 서버에서 관리되므로, 데이터의 무결성과 보안성을 유지하기 더 용이함.
단점
- 서버 자원 소모: 세션 정보를 서버에 저장하므로 사용자가 많아질 경우 서버 자원이 소모될 수 있음. 메모리 기반 세션 저장소를 사용할 때 문제가 될 수 있음.
- 확장성 문제: 여러 서버에 걸쳐 세션 정보를 공유하기 어려워 복잡한 아키텍처에서는 관리가 힘들 수 있음. 세션 스토어를 분리하거나, 데이터베이스에 저장하는 방식으로 해결할 수 있지만 추가적인 복잡성을 초래함.
- 만료 관리: 세션의 만료 시간이 지나면 사용자는 다시 로그인해야 하므로, 사용자 경험에 영향을 줄 수 있음.
보안 고려 사항
- 세션 하이재킹 방지: 세션 ID를 탈취당하는 것을 방지하기 위해, HTTPS를 사용하여 데이터 전송 시 암호화.
- 세션 고정 공격 방지: 사용자가 로그인한 후에는 새로운 세션 ID를 생성하여 세션을 고정하는 공격을 방지.
- 세션 만료: 일정 시간이 지나면 세션을 자동으로 만료시켜, 오랜 시간 사용하지 않은 세션에 대한 접근을 차단.
- IP 주소 확인: 세션 ID와 함께 클라이언트의 IP 주소를 체크하여, IP 주소가 변경된 경우 세션을 무효화.
3. 요약
항목 | 쿠키 | 세션 |
저장위치 | 클라이언트(브라우저)에 저장 | 서버에 저장 |
용도 | 사용자 설정, 인증 정보 등 | 사용자 상태 관리 |
만료 | 만료 시간이 설정 가능 | 일정 시간 후 만료, 사용자 로그아웃 시 종료 |
보안 | 상대적으로 취약 (XSS 공격 가능) | 상대적으로 안전 (서버에 저장) |
728x90
반응형
'Web' 카테고리의 다른 글
HTTP 요청(Request) / 응답(Response) (0) | 2024.11.13 |
---|---|
JWT(JSON Web Token)란? (0) | 2024.11.05 |