Miyeon

브라우저에 데이터 저장하기 - Cookie

2021-10-31Web

쿠키가 뭐예요?

  • 브라우저에 저장되는 작은 크기의 문자열로 웹 서버에 의해 만들어짐.

쿠키로 뭐해요?

  • 서버가 HTTP 응답 헤더의 Set-Cookie에 내용을 넣어 전달 → 브라우저가 이 내용을 브라우저에 저장함.
  • 사용자가 쿠키를 생성하도록 한 동일 서버(사이트)에 접속할 때마다 쿠키의 내용을 Cookie 요청 헤더에 넣어서 함께 전달함.

쿠키가 언제 쓰이나요?

  • 사용자가 로그인할 대 쿠키가 아주 유용하게 사용됨.
  • 사용자 로그인 → 서버는 HTTP 응답 헤더의 Set-Cookie에 담긴 “세션 식별자(session identifier)” 정보를 사용해 쿠키를 설정함 → 사용자가 동일 도메인으로 접속하면 브라우저는 HTTP Cookie 헤더에 인증 정보가 담긴 고윳값(=섹션 식별자)을 함께 실어서 서버에 요청 보냄
  • 서버는 브라우저가 보낸 요청 헤더의 세션 식별자를 읽어 사용자를 식별함(서버는 이 사용자가 로그인한 사용자라는 걸 알 수 있음)

쿠키에 읽기 document.cookie

  • cookie1=value1;처럼 이름과 값을 가짐.
  • 쓰기는 해당 쿠키 값만 갱신
  • 이름과 값을 반드시 인코딩 해야함

쿠키에 포함되는 값

path

  • path=/의 기본값 = 현재 경로
  • url path로 이 경로나 이 경로의 하위 경로에 있는 페이지만 쿠키에 접근할 수 있음.
  • path=/admin 옵션을 사용하여 설정한 쿠키는 /admin/admin/something에서만 볼 수 있음.

domain

  • 쿠키가 접근 가능한 사이트를 설정함. 설정
  • 해당 도메인에서 생성한 쿠키는 다른 사이트에서 절대 전송받을 수 없다.
  • 왜? 민감한 데이터가 저장되는 쿠키는 관련 페이지에서만 보게 만들어서 안정성을 높인 것

예외

// site.com에서
// 서브 도메인(*.site.com) 어디서든 쿠키에 접속하게 설정할 수 있습니다.
document.cookie = "user=John; domain=site.com";

// 이렇게 설정하면

// forum.site.com와 같은 서브도메인에서도 쿠키 정보를 얻을 수 있습니다.
alert(document.cookie); // user=John 쿠키를 확인할 수 있습니다.

expires / max-age

  • 쿠키 만료 시간 설정함.
  • 정되어 있지 않으면 브라우저가 닫힐 때 쿠키도 함께 삭제됨 = 섹션쿠키

secure

  • HTTPS로 통신하는 경우에만 쿠키 전송됨.
  • 쿠키는 기본적으로 도메인만 확인하지 프로토콜을 따지진 않음.

samesite

  • 요청이 외부사이트에서 일어날 때, 브라우저가 쿠키를 보내지 못하게 막아줌
  • 또 다른 보안 속성으로, 크로스 사이트 요청 위조 공격을 받기 위해 만들어진 옵션

크로스 사이트 요청 위조(XSRF) 가 발생하는 예시

  1. 은행 웹사이트에 로그인
  2. 해당 사이트에서 사용되는 인증 쿠키가 브라우저에 저장됨
  3. 브라우저는 은행 웹사이트에 요청을 보낼 때마다 인증 쿠키를 함께 전송함.
  4. 서버는 전송받은 쿠키를 이용해 사용자를 식별하고, 보안이 필요한 재정 거래를 처리함
  5. (은행 웹사이트 로그인 상태로) 웹 서핑을 하다가 악성 웹사이트에 접속함.
  6. 이 사이트엔 해커에서 송금을 요청하는 form
    이 있고, 이 폼은 자동으로 제출하게 설정되어 있음. 마치 은행웹사이트에서 요청하는 것처럼.
  7. 폼이 은행 사이트로 바로 전송될 때 인증 쿠키도 함께 전송됨. 은행 웹사이트에 요청을 보낼 때마다 은행 웹사이트에서 설정한 쿠키가 전송되기 때문이다.
  8. 은행은 전송받은 쿠키를 읽어 실제 계정 주인이 접속한 것으로 생각하고 해커에게 돈을 송금함
  9. 이를 막기 위해 은행 웹사이트에서 사용하는 모든 폼에 XSRF 보호 토큰이라는 특수 필드에 넣어서 보호 토큰이 없거나 서버에 저장된 값과 일지하지 않으면 요청을 따르지 않음.

samesite 옵션

samesite : strict

  • 기본값
  • 사용자가 사이트 외부(제 3의 도메인)에서 요청을 보낼 때, 해당 설정이 된 쿠키는 절대로 전송되지 않음.

samesite : lax

  • 사용자의 경험을 헤치지 않으면서 XSRF 공격을 막을 수 있는 느슨한 접근법
  • srict처럼 사이트 외부에서 요청을 보낼 때 브라우저가 쿠키 보내는 걸 막아주는데 두 가지 조건을 동시에 만족하면 쿠키를 전송해줌.
  • 안전한 HTTP 메서드인 경우
  • 작업이 최상위 레벨 탐색에서 이루어질 때

참고

쿠키와 document.cookie