브라우저에 데이터 저장하기 - Cookie
쿠키가 뭐예요?
- 브라우저에 저장되는 작은 크기의 문자열로 웹 서버에 의해 만들어짐.
쿠키로 뭐해요?
- 서버가 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) 가 발생하는 예시
- 은행 웹사이트에 로그인
- 해당 사이트에서 사용되는 인증 쿠키가 브라우저에 저장됨
- 브라우저는 은행 웹사이트에 요청을 보낼 때마다 인증 쿠키를 함께 전송함.
- 서버는 전송받은 쿠키를 이용해 사용자를 식별하고, 보안이 필요한 재정 거래를 처리함
- (은행 웹사이트 로그인 상태로) 웹 서핑을 하다가 악성 웹사이트에 접속함.
- 이 사이트엔 해커에서 송금을 요청하는 form
- 폼이 은행 사이트로 바로 전송될 때 인증 쿠키도 함께 전송됨. 은행 웹사이트에 요청을 보낼 때마다 은행 웹사이트에서 설정한 쿠키가 전송되기 때문이다.
- 은행은 전송받은 쿠키를 읽어 실제 계정 주인이 접속한 것으로 생각하고 해커에게 돈을 송금함
- 이를 막기 위해 은행 웹사이트에서 사용하는 모든 폼에 XSRF 보호 토큰이라는 특수 필드에 넣어서 보호 토큰이 없거나 서버에 저장된 값과 일지하지 않으면 요청을 따르지 않음.
samesite 옵션
samesite : strict
- 기본값
- 사용자가 사이트 외부(제 3의 도메인)에서 요청을 보낼 때, 해당 설정이 된 쿠키는 절대로 전송되지 않음.
samesite : lax
- 사용자의 경험을 헤치지 않으면서 XSRF 공격을 막을 수 있는 느슨한 접근법
- srict처럼 사이트 외부에서 요청을 보낼 때 브라우저가 쿠키 보내는 걸 막아주는데 두 가지 조건을 동시에 만족하면 쿠키를 전송해줌.
- 안전한 HTTP 메서드인 경우
- 작업이 최상위 레벨 탐색에서 이루어질 때