쿠키(Cookie)란?

웹 서버가 Set-Cookie 헤더로 브라우저에 저장하게 하는, 이름과 값의 쌍으로 된 작은 데이터. 브라우저는 이후 같은 사이트로 가는 요청에 Cookie 헤더로 자동으로 붙여 보낸다. 무상태인 HTTP에서 로그인 상태를 유지하기 위해 세션 ID를 넣어 사용하는 경우가 많다. Secure(HTTPS일 때만 보냄), HttpOnly(스크립트에서 읽을 수 없게 함), SameSite(다른 사이트에서 시작된 요청에 붙일지), Expires·Max-Age(유효 기간) 등의 속성으로 취급을 지정한다.

일본어 명칭: Cookie

쿠키(Cookie)은(는) 웹 기술 기초, 정보 보안 기초 등 2개 분야의 연습 문제 6개에 나와요.

분야: 웹 기술 기초

구조

서버는 응답에 'Set-Cookie: sid=…' 같은 헤더를 붙이고, 브라우저는 이를 저장합니다. 그 후 브라우저는 같은 사이트(Domain과 Path 속성으로 정해지는 범위)로 가는 요청에 'Cookie: sid=…'를 자동으로 붙여 보냅니다. 서버는 받은 세션 ID를 단서로 서버 쪽에 저장해 둔 이용자 정보를 찾습니다. 유효 기간을 지정하지 않은 Cookie는 일반적으로 브라우저를 닫으면 사라집니다.

안전을 위한 속성

Secure를 붙이면 HTTPS 통신일 때만 보내지므로, 도청으로 값이 알려지는 것을 막을 수 있습니다. HttpOnly를 붙이면 페이지의 JavaScript에서 읽을 수 없게 되어, XSS로 세션 ID를 도둑맞는 피해를 줄일 수 있습니다. SameSite는 다른 사이트에서 시작된 요청에 Cookie를 붙일지를 Strict, Lax, None으로 지정하는 것으로, 이용자가 의도하지 않은 요청을 보내게 하는 공격에 대한 대책 중 하나가 됩니다.

localStorage와의 차이

localStorage도 브라우저에 데이터를 저장하는 구조이지만, 요청에 자동으로 붙지 않고 JavaScript에서 읽고 써서 사용합니다. Cookie는 하나당 일반적으로 약 4 KB까지로 작고, 대상 사이트로 가는 요청마다 붙어서 보내지므로 큰 데이터를 넣으면 통신량이 늘어납니다. 세션 ID 같은 인증 정보는 스크립트에서 읽을 수 없는 HttpOnly Cookie에 넣는 것이 일반적입니다.

도전해 보기: 쿠키(Cookie) 관련 문제

브라우저의 localStorage와 Cookie의 차이로 올바른 것은?

  1. AlocalStorage의 데이터는 요청에 자동으로 붙지 않으며, 같은 출처인 페이지의 JavaScript에서 읽고 써서 사용한다
  2. BlocalStorage의 데이터도 Cookie와 마찬가지로 같은 사이트로 가는 요청마다 헤더에 넣어져 자동으로 서버로 보내진다
  3. ClocalStorage에도 HttpOnly 속성을 붙일 수 있으므로, 세션 ID를 두어도 페이지의 스크립트에서는 읽을 수 없다
정답과 해설 보기

정답: A. localStorage의 데이터는 요청에 자동으로 붙지 않으며, 같은 출처인 페이지의 JavaScript에서 읽고 써서 사용한다

localStorage는 출처마다 키와 값의 문자열을 저장하는 브라우저의 저장 공간으로, 유효 기간을 정하는 구조가 없으며 일반적으로 지울 때까지 남습니다. 서버로는 자동으로 보내지지 않으므로, 보내고 싶을 때는 JavaScript로 요청에 넣습니다. Cookie는 하나당 일반적으로 약 4 KB까지로 작고 요청할 때마다 자동으로 보내지는 데 비해, localStorage에는 더 큰 데이터를 둘 수 있습니다. 다만 페이지의 JavaScript에서는 언제든지 읽을 수 있으므로, XSS가 있으면 내용을 도둑맞습니다. 인증에 사용하는 값을 둘 때는 이 위험을 고려해야 합니다.

자주 묻는 질문

Cookie를 비활성화하면 어떻게 되나요?

세션 ID를 주고받을 수 없게 되므로, 많은 사이트에서 로그인 상태를 유지할 수 없게 됩니다. 쇼핑 카트의 내용이나 표시 설정처럼 Cookie로 기억하고 있는 정보도 유지되지 않습니다.

서드 파티 Cookie란 무엇인가요?

지금 보고 있는 페이지와는 다른 사이트(광고를 배포하는 사이트 등)가 설정하는 Cookie입니다. 여러 사이트에 걸쳐 이용자의 행동을 추적하는 데 사용되어 왔기 때문에, 프라이버시를 지키기 위해 기본적으로 보내지 않거나 제한하는 브라우저가 있습니다.

해설 속 쿠키(Cookie)

쿠키(Cookie)이(가) 나오는 문제 (6)

  1. 위의 헤더로 설정된 Cookie에 대한 설명으로 올바른 것은?
  2. 브라우저의 localStorage와 Cookie의 차이로 올바른 것은?
  3. HTTP는 무상태(stateless) 프로토콜이다. 이것과, 웹사이트에서 로그인한 상태를 유지하는 일반적인 방법에 대한 설명으로 올바른 것은?
  4. 게시판 웹 애플리케이션에서 이용자가 게시한 글 안의 스크립트가 다른 열람자의 브라우저에서 실행되어 버리는 취약점이 있었다. 이 취약점의 이름과 근본적인 대책의 조합으로 올바른 것은?
  5. 웹 애플리케이션에서 로그인한 상태의 이용자가 공격자가 준비한 함정 페이지를 열면, 이용자의 브라우저에서 정규 사이트로 이용자가 의도하지 않은 송금이나 설정 변경 요청이 보내지는 취약점이 있다. 이 취약점에 대한 대책으로 적절한 것은?
  6. 웹 애플리케이션에서 로그인 전과 후에 같은 세션 ID를 계속 사용하면, 공격자가 미리 준비한 세션 ID를 이용자가 사용하게 하고, 이용자가 로그인한 뒤 그 ID로 이용자를 사칭할 우려가 있다. 이 공격에 대한 대책으로 가장 적절한 것은?

관련 용어

크로스 사이트 스크립팅(XSS) HTTP(하이퍼텍스트 전송 프로토콜) 동일 출처 정책(Same-origin Policy) 리버스 프록시(Reverse Proxy) 서버 사이드 렌더링(SSR) 웹소켓(WebSocket) 이벤트 루프(Event Loop) CORS(교차 출처 리소스 공유) DOM(문서 객체 모델) HTTP 메서드(HTTP Method)

용어집으로 돌아가기