HTTP 쿠키
HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각이다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용한다. 이를 이용하면 사용자의 로그인 상태를 유지할 수 있다. 상태가 없는(Stateless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문이다.
쿠키는 주로 세가지 목적을 위해 사용된다.
- 세션 관리(Session Management)
- 서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보 관리
- 개인화(Personalization)
- 사용자 선호, 테마 등의 세팅
- 트래킹(Tracking)
- 사용자 행동을 기록하고 분석하는 용도
과거엔 클라이언트 측에 정보를 저장할 때 쿠키를 주로 사용하곤 했다. 쿠키를 사용하는게 데이터를 클라이언트 측에 저장할 수 있는 유일한 방법이었을 때는 이 방법이 타당했지만 지금은 modern storage APIs를 사용해 정보를 저장하는 것을 권장한다.
모든 요청마다 쿠키가 함께 전송되기 때문에 성능이 떨어지는 원인이 될 수 있다.
정보를 클라이언트 측에 저장하려면 Modern ApIs의 종류인 웹 스토리지API(localStorage와 sessionStorage)와 IndexedDB를 사용하면 된다.
쿠키 만들기
HTTP 요청을 수신할 때, 서버는 응답과 함께 Set-Cookie 헤더를 전송할 수 있다. 쿠키는 보통 브라우저에 의해 저장되며, 그 후 쿠키는 같은 서버에 의해 만들어진 요청(Request)들의 Cookie HTTP 헤더 안에 포함되어 전송된다. 만료일 혹은 지속시간(duration)도 명시될 수 있고, 만료된 쿠키는 더이상 보내지 않는다. 추가적으로, 특정 도메인 혹은 경로 제한을 설정할 수 있으며 이는 쿠키가 보내지는 것을 제한할 수 있다.
Set-Cookie 그리고 Cookie 헤더
Set-Cookie HTTP 응답 헤더는 서버로부터 사용자 에이전트로 전송된다. 간단한 쿠키는 다음과 같이 설정될 수 있다.
Set-Cookie: <cookie-name>=<cookie-value>
이 서버 헤더는 클라이언트에게 쿠키를 저장하라고 전달한다.
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
이브라우저는 Cookie 헤더를 사용하여 서버로 이전에 저장했던 모든 쿠키들을 회신할 것이다.
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
쿠키의 라이프타임
쿠키의 라이프타임은 두 가지 방법으로 정의할 수 있다
- 세션 쿠키는 현재 세션이 끝날 때 삭제된다. 브라우저는 “현재 세션"이 끝나는 시점을 정의하며, 어떤 브라우저들은 재시작할 때 세션을 복원해 세션 쿠키가 무기한 존재할 수 있도록 한다.
- 영속적인 쿠키는 Expires 속성에 명시된 날짜에 삭제되거나, Max-Age 속성에 명시된 기간 이후에 삭제된다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Secure과 HttpOnly 쿠키
Secure 쿠키는 HTTPS 프로토콜 사엥서 암호화된(encrypted) 요청일 경우에만 전송된다. 하지만 Secure 일지라도 민감한 정보는 절대 쿠키에 저장되면 안된다. 본질적으로 안전하지 않고 실질적인 보안을 제공하지 않기 때문이다.
크롬52 혹은 파이어폭스52로 시작한다면, http:는 쿠키에 Secure 설정을 지시할 수 없다.
Cross-site 스크립팅(XSS)공격을 방지하기 위해, HttpOnly 쿠키는 Javascript의 Document.cookie API에 접근할 수 없다.
서버에만 전송된다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
쿠키의 스코프
Domain 그리고 Path 디렉티브는 쿠키의 스코프를 정의한다.
Domain은 쿠키가 전송되게 될 호스트들을 명시한다. 만약 명시되지 않는다면 현재 문서 위치의 호스트 일부를 기본값으로 한다. 도메인이 명시되면, 서브 도메인들은 항상 포함된다.
Path는 Cookie 헤더를 전송하기 위하여 요청되는 URL내에 반드시 존재하는 URL 경로이다.
SameSite 쿠키
SameSite 쿠키는 쿠키가 cross-site 요청과 함께 전송되지 않았음을 요구하게 만들어, cross-site 요청 위조 공격(CSRF)에 대해 보호 방법을 제공한다.
Document.cookie를 사용한 자바스크립트 접근
새로운 쿠키들은 Document.cookie를 사용해 만들어질 수도 있으며, HttpOnly 플래그가 설정되지 않은 경우 기본의 쿠키들은 자바스크립트로부터 잘 접근될 수 있다.
document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"
보안
세션 하이재킹과 XSS
쿠키는 대개 웹 애플리케이션에서 사용자와 그들의 인증된 세션을 식별하기 위해 사용되곤 한다. 그래서 쿠키를 가로채는 것은 인증된 사용자의 세션 하이재킹으로 이어질 수 있다. 쿠키를 가로채는 일반적인 방법은 소셜 공학 사용 혹은 애플리케이션 내 XSS 취약점을 이용하는 것을 포함한다.
HttpOnly 쿠키 속성은 자바스크립트를 통해 쿠키 값에 접근하는 것을 막아 이런 공격을 누그러뜨리는데 도움을 줄 수 있다.
서드파티 쿠키
쿠키는 그와 관련된 도메인을 가진다. 현재 보고 있는 페이지의 도메인과 동일하다면, 그 쿠키는 퍼스트파티 쿠키라고 불리고, 만약 도메인이 다르면 서드파티 쿠키라고 부른다.
퍼스트파티 쿠키가 그것을 설정한 서버에만 전송되는데 반해, 웹 페이지는 다른 도메인의 서버 상에 저장된 이미지 혹은 컴포넌트를 포함할 수도 있다.
이러한 서드파티 컴포넌트를 통해 전송되는 쿠키들을 서드파티쿠키라고 부르며 웹을 통한 광고와 트래킹에 주로 사용된다.
만약 서드파티 쿠키를 공개하고 있지 않으면, 쿠키 사용이 밝혀질 경우 소비자의 신뢰를 잃을 수도 있다.
명백한 공개는 쿠키 발견과 관련된 모든 부정적인 효과를 없애는 경향이 있다.
Do-Not-Track
쿠키 사용에 대한 합법적이거나 기술적인 요구사항은 없지만, DNT 헤더는 웹 애플리케이션이 트래킹 혹은 개인 사용자의 cross-site 사용자 트래킹 모두를 비활성화하는 신호로 사용될 수 있다.
좀비 쿠키와 Evercookies
쿠키에 대한 좀 더 급진적인 해결책은 삭제 이후에 다시 생성되는 좀비 쿠키 혹은 “Evercookies”이며 의도적으로 영원히 제거하는 것이 어려운 쿠키이다.
쿠키의 존재여부와 관계없이 자신을 다시 만들기 위해 웹 스토리짐 API, Flash 로컬 공유 객체 등을 사용한다.
'Back-end' 카테고리의 다른 글
객체지향 (0) | 2022.08.24 |
---|---|
TDD(Test-Driven-Development) : 테스트 주도 개발 (0) | 2022.08.21 |
캐시(Caching) (0) | 2022.05.18 |
HTTP (0) | 2022.05.18 |
프로젝트(Spring Boot & JPA) (0) | 2022.01.23 |