쿠키 생성 옵션
- 쿠키는 생성할 때 몇가지 옵션을 줄 수 있다.
HTTP 헤더에 들어간 쿠키 옵션 예제
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Partitioned
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure
// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
Set-Cookie
헤더의 쿠키값 설정 뒤에; 옵션1=xx; 옵션2=yy
형태로 적용이 가능하다.
각 옵션별 설명
- 값을 갖는 옵션도 있고, 값을 갖지 않는 옵션도 있다.
- 모든 옵션은
Optional
이다.- 그러나 설정하지 않는다고 값을 가지지 않는 것은 아니고, 브라우저 정책에 따른 기본 값이 들어가게 된다.
Domain=<domain-value>
(Optional
)
- 어떤 도메인에 요청을 보낼 때, 이 쿠키를 함께 사용할 것인지 명시한다.
- 단 하나의 도메인만 적어야 하며 여러 도메인을 적는 것은 불가능하다.
- 생략한다면, 정확한 도메인에서만 쿠키를 사용하고, 서브 도메인에서는 쿠키를 공유하지 않는다.
cafe.naver.com
에서 생성한 쿠키를 서브도메인과 공유하고 싶다면naver.com
과 같이 도메인을 적어주면 된다.- 과거의 브라우저에서는
.naver.com
과 같이 적어야 했지만, RFC 6265 section 4.1.2.3 을 확인해보면 현대 브라우저에서는 맨 앞의 점이 없어도 무방하다고 나온다.
Expires=<date>
(Optional
)
- 쿠키가 언제까지 유효한지 명시한다.
- HTTP-date timestamp 형식에 맞추어야 한다.
- 자바스크립트
Date
객체에서toUTCString()
메서드를 쓴 결과를 이용하면 쉽다. new Date().toUTCString()
->'Fri, 27 Jan 2023 10:52:47 GMT'
- 자바스크립트
- 생략한다면, 세션이 만료될 때 쿠키도 함께 만료된다.
- 현대 브라우저는 모든 창을 껐다가 다시 켜도 세션을 복구하는 기능이 있어서, 브라우저 창을 끈다고해도 세션이 만료되지 않을 수 있다.
- 쿠키의 만료일자는 클라이언트와 관련 있으며, 서버와는 관련 없다.
- 서버는 보통 쿠키로 준 세션 값 등을 디비에 저장하다 일정 시간이 지나거나 조건이 충족되면 만료시킬 뿐이다.
HttpOnly
(Optional
)
- Document.cookie 를 통해 자바스크립트로 쿠키에 접근하는 것을 막는다.
HttpOnly
로 만든 쿠키도 여전히XMLHttpRequest.send()
혹은fetch()
를 호출할 때, 자바스크립트 요청과 함께 전송된다. 이는 XSS 공격을 완화하는데 도움이 된다.
Max-Age=<number>
(Optional
)
- 초로 쿠키의 유효기간을 나타낼 때 쓴다.
Expire
와 동일한 역할인데,Expire
와 함께 쓰면,Max-Age
가 적용된다.
Partitioned
(Optional
)
- 최근 추가된 실험적 기능으로 쿠키가 분리된 저장소(Partitioned storage)에 저장되어야 함을 나타낸다.
- 최근 쿠키를 통한 개인정보 침해 우려가 있어 새로 나온 기능인 것 같다.
- CHIPS
Path=<path-value>
(Optional
)
- 사이트의 특정한 경로에만 쿠키를 적용하고 싶을 때 쓴다.
/docs
라는 경로를 입력하면,/docs/abc
와 같은 하위 경로에도 적용된다.
SameSite=<samesite-value>
(Optional
)
- 쿠키를 도메인이 다른 사이트와 통신하는데도 적용할지 설정한다.
- CSRF 공격 에 대한 방어가 어느정도 된다.
- 적어도 타 도메인에서 유해한 URL 로 유도 시에는 브라우저에 저장된 쿠키를 사용하지 않기 때문이다.
<same-sitevalue>
자리에 들어갈 수 있는 값은 아래와 같다.Strict
: 같은 주소의 요청에만 쿠키를 보낸다.Lax
: 안전한 HTTP 메서드 (GET) 정도만 예외를 두고Strict
와 동일하게 처리된다.- 외부 사이트에서 링크를 타고 들어오는 경우가
Lax
에서 해당하는 예외라고 볼 수 있다. <same-sitevalue>
를 생략한 경우Lax
가 기본 값이 된다.
- 외부 사이트에서 링크를 타고 들어오는 경우가
None
: cross-site 와 same-site 구분하지 않고, 무조건 쿠키를 같이 보낸다.- 단,
Secure
속성이 반드시 같이 있어야 한다. https
를 통하지 않은SameSite=None
쿠키는 해커에 의해 원본 값이 탈취될 수 있다.
- 단,
Secure
(Optional
)
https:
스키마를 통한 통신 요청에만 쿠키를 같이 보낸다.- 단,
localhost
도메인은 예외이다. (아마 개발자를 위한 배려일 것이다.)
- 단,
보안을 위한 쿠키 옵션 권장사항
- 보안을 위해
Secure
와HttpOnly
는 항시 적용하는 것이 좋다.HttpOnly
를 적용하지 않으면, 자바스크립트를 통해 쿠키가 탈취당한다.Secure
를 적용하지 않으면, Man in the middle 공격을 통해 쿠키가 탈취당한다.
- 쿠키는 언제든 엔드 유저에게 보여지며 변경될 수 있는 값이란 것을 명심해야 한다.
- 중요한 정보를 저장하려면, JWT 같은 메커니즘을 이용하는 것이 도움이 된다.
- 인증 정보와 같은 중요한 쿠키엔 반드시 life time 을 명시하는 것이 좋으며,
SameSite
속성도Strict
혹은Lax
로 설정해두는 것이 좋다.
레퍼런스
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
반응형
'네트워크 > HTTP' 카테고리의 다른 글
HTTP 요청 메세지의 구조 (0) | 2023.04.15 |
---|---|
HTTP Content-Type 헤더란? (0) | 2023.04.14 |
HTTP MIME type 이란? (0) | 2023.04.14 |
HTTP 쿠키 (HTTP Cookie) 란? (0) | 2023.01.27 |
400 Bad Request, 401 Unauthorized, 403 Forbidden 상태코드 구분하기 (0) | 2022.06.21 |