Hyunjung Im
Frontend Developer
2023-07-13
쿠키, localStorage.. 매번 옵션에 대해 기억이 나질 않아 정리를 해본다🍪
웹 스토리지 객체인 localStorage와 session Storage는 브라우저 내에 키-값 쌍을 저장할 수 있게 해준다.
LocalStorage를 잘 사용하기 위해서는 저장된 데이터의 위협 수준이 매우 낮아야 한다. 추가적으로 쉽게 해킹되지 않도록 저장된 데이터를 암호화하는 것이 좋다.
쿠키를 사용하면 브라우저 데이터를 저장할 수 있는데, 왜 또 다른 객체를 사용해 데이터를 저장하는 걸까? 이유로는 아래와 같다.
Persistent Cookies는 만료일을 가진다. 이 쿠키는 만료일까지 유저의 디스크에 저장되고 만료일이 지나면 삭제된다. 유저들이 방문할 때마다 유저 경험을 커스텀하기 위해 특정 웹사이트에서 행동을 기록하는 등 여러 활동들에 사용될 수 있다.
세션 쿠키는 만료일을 포함하지 않는다. 대신에 브라우저나 탭이 열려있는 동안에만 저장된다. 이 유형의 쿠키는 탭을 닫으면 모든 정보를 잊어버리기 때문에 은행 유저들의 자격 증명을 저장하는 데 사용될 수 있다.
document.cookie
프로퍼티를 이용하면 브라우저에서도 쿠키에 접근할 수 있다.
document.cookie
에 직접 값을 쓸 수 있다. 이때 cookie는 데이터 프로퍼티가 아닌 접근자 프로퍼티이다. 접근자 프로퍼티에 값을 할당하는 것은 데이터 프로퍼티에 값을 할당하는 것과는 조금 다르게 처리된다.
document.cookie
에 값을 할당하면, 브라우저는 이 값을 받아 해당 쿠키를 갱신한다. 이때, 다른 쿠키의 값은 변경되지 않는다.
document.cookie = "user=John"; // 이름이 user인 쿠키의 값만 갱신한다.
쿠키의 이름과 값에는 특별한 제약이 없기 때문에 모든 글자가 허용된다. 하지만 형식의 유효성을 일관성 있게 유지하기 위해 반드시 내장 함수 encodeURIComponent
를 사용하여 이름과 값을 이스케이프 처리해 줘야 한다.
const name = "my name";
const value = "John Smith"; // 특수 값인 공백은 인코딩 처리해 줘야 한다.
document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
alert(document.cookie); // ...; my%20name=John%20Smith
쿠키를 쓸 때 옵션은 key, value 쌍 뒤에 ;
로 구분해줘야 한다.
document.cookie = "user=John"; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
domain=site.com
site.com
에서 생성한 쿠키를 other.com
에선 절대 전송받을 수 없다. 이런 제약사항은 안정성을 높이기 위해 만들어졌다. 민감한 데이터가 저장된 쿠키는 관련 페이지에서만 볼 수 있도록 하기 위해서 말이다. 하지만 domain 옵션에 루트 도메인을 명시적으로 설정하면 서브 도메인에서도 쿠키에 접근할 수 있다.document.cookie = "user=John; domain=site.com";
이렇게 설정하면 forum.site.com 같은 서브도메인에서도 쿠키 정보를 얻을 수 있다.
expires나 max-age(만료 기간) 옵션이 지정되어 있지 않으면, 브라우저가 닫힐 때 쿠키도 함께 삭제된다. 이런 쿠키를 Session Cookie 라고 부른다.
date.toUTCString
을 사용하면 해당 포맷으로 쉽게 변경할 수 있다.const date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = "user=John; expires=" + date;
document.cookie = "user=John; max-age=3600";
이 옵션을 설정하면 HTTPS로 통신하는 경우에만 쿠키가 전송된다.
secure
옵션이 없으면 기본 설정이 적용되어 프로토콜 상관없이 읽을 수 있게 된다. 쿠키는 기본적으로 도메인만 확인하지 프로토콜을 따지진 않기 때문이다.
쿠키의 samesite
옵션을 이용하면 “XSRF 보호 토큰” 없이도 크로스 사이트 요청 위조(cross-site request forgery, XSRF) 공격을 막을 수 있다. 속성으로는 none
, strict
, lax
가 있다.
XSRF는 웹 애플리케이션 보안 취약점 중 하나이다. 사용자가 자신의 의지와 동의 없이 악의적인 요청을 다른 웹사이트에 보내는 공격을 말한다.
공격 예시:
공격을 막기 위해 모든 요청을 검수하거나 모든 폼에 보호 토큰을 세팅할 수 있다. 이런 절차는 구현에 시간이 걸린다는 단점이 있다.
strict
사용자가 사이트 외부에서 요청을 보낼 때 samesite=strict
옵션이 있는 쿠키는 절대로 전송되지 않는다.
lax
사용자 경험을 해치지 않으면서 XSRF 공격을 막을 수 있는 느슨한 접근법이다. strict와 마찬가지로 lax도 사이트 외부에서 요청을 보낼 때 브라우저가 쿠키를 보내는 걸 막아주지만 예외사항이 존재한다.
아래 두 조건을 동시에 만족할 때는 samesite=lax 옵션을 설정한 쿠키가 전송된다.
브라우저 크롬의 경우 lax
가 기본값이다.
이 옵션은 자바스크립트 같은 클라이언트 측 스크립트가 쿠키를 사용할 수 없게 한다. document.cookie
를 통해 쿠키를 볼 수도 없고 조작할 수도 없다. httpOnly
옵션이 설정된 쿠키는 document.cookie
로 쿠키 정보를 읽을 수 없기 때문에 쿠키를 보호할 수 있다.
사용자가 방문 중인 도메인이 아닌 다른 도메인에서 설정한 쿠키를 “서드 파티 쿠키(third-party cookie)“라고 부른다. 광고회사는 사용자의 이용 행태를 추적하고, 광고를 제공하기 위해 오래전부터 서드 파티 쿠키를 사용하고 있다.