본문 바로가기
백엔드

[Cookie] 쿠키를 주고 받을 때 HTTP 요청과 응답에 어떤 헤더 데이터가 오가는가? 쿠키 값을 어떻게 인코딩하나?

by 책 읽는 개발자_테드 2021. 10. 14.
반응형

쿠키를 주고 받을 때 HTTP 요청과 응답에 어떤 헤더 데이터가 오가는가? 쿠키 값을 어떻게 인코딩하나?

· 서버에서 HTTP 요청을 통해 클라이언트에 여러 쌍의 쿠키들을 저장하라는 명령을 할 때, 헤더의 데이터는 다음과 같음

   - 프로토콜 종류, status Code, Content-Type, Set-Cookie

HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

 

· Set-Cookie HTTP response header는 다양한 속성을 추가해서 사용할 수 있음

Set-Cookie: <cookie-name>=<cookie-value> 
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None

// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

· =: 쿠키는 name-value 쌍으로 시작함 (필수)

·  이름(name): 각각의 쿠키를 구별하는 데 사용 (웹 브라우저는 여러 개의 쿠키를 가질 수 있음)

   - 쿠키 이름은 콤마, 세미콜론, 공백, 등호기호('=')를 제외한 출력 가능한 아스키 문자로 구성

·  값(value): 쿠키의 이름과 관련된 값

   - 서버는 값을 사용해서 원하는 작업 수행

   - 쿠키 값은 콤마, 세미콜론, 공백 문자를 제외한 나머지 출력 가능한 아스키 문자를 사용 

   - 값으로 사용 가능한 문자가 한정되므로 쿠키 값을 생성할 때는 알맞은 방식으로 인코딩함 

      ex) 자바는 URL 인코딩을 사용해 쿠키 값으로 사용할 문자열을 변환 가능

 

· Expires=: 쿠키의 유지 시간, 쿠키가 삭제되는 만료 날짜를 설정 (Optional)

   - 별도 유효 시간을 지정하지 않으면 웹 브라우저를 종료할 때 쿠키를 함께 삭제함

· Max-Age=: 쿠키의 유지 시간, Expires 속상과 다르게 삭제될 시간을 초 단위로 설정함 (Optional)

 

· Domain=: 쿠키를 전송할 도메인 (Optional)

· Path=: 쿠키를 전송할 요청 경로 (Optional)

 

· Secure: 웹브라우저와 웹 서버가 https로 통신하는 경우만 웹브라우저가 쿠키를 서버로 전송하는 옵션(Optional)

· HttpOnly: 자바스크립트의 document.cookie를 이용해서 브라우저에서 쿠키의 접속하는 것을 막는 옵션 (Optional)

   - secure 옵션과 함께 쿠키 탈취를 방어하기 위한 옵션으로 사용됨 

 

· SameSite=: 서로 다른 도메인간의 쿠키 전송에 대한 보안을 설정 (Optional)

   - SameSite 정책으로 세 가지 종료를 선택 가능

   1. None: SameSite가 탄생하기 전 쿠키와 동작 방식이 같음, 크로스 사이트 요청에도 쿠키 전송

   2. Strict: 가장 보수적인 정책, 크로스 사이트 요청에는 항상 전송 x (서드 파티 쿠키는 전송x, 퍼스트 파티 쿠키만 전송)

   3. Lax: Strict에 비해 상대적으로 느슨한 정책, 일반적인 서드 파티 쿠키는 전송되지 않지만, 몇 가지 예외적인 요청에는 전송

   - Lax 쿠키가 전송되는 경우: Top Level Navigation 또는 안전한 HTTP 메서드 요청

  ex) GET 요청 중에 링크 클릭, window, location.replace 등으로 인한 자동 이동, 302 리다이렉트

   - Lax 쿠키가 전송되지 않는 경우:

   - 위 모든 내용은 서드 파티 구현에 한하는 것이고, 퍼스트 파트 쿠키는 Lax 또는 Strict여도 전송됨

 

· 클라이언트에서  HTTP 요청을 통해 서버에 이전에 저장한 쿠키들을 전송할 때, 헤더의 데이터는 다음과 같음

GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

 

쿠키 값의 인코딩

· 쿠키 값은 콤마, 세미콜론, 공백 문자를 제외한 나머지 출력 가능한 아스키 문자를 사용하기 때문에,

값으로 사용 가능한 문자가 한정되므로 쿠키 값을 생성할 때는 알맞은 방식으로 인코딩이 필요하다.

· 이때 쿠키 값을 자바에서는 java.net 패키지의 URLEnCoder 클래스를 통해 인코딩할 수 있다.

   - URL 인코딩은 URI 내에서 유효하고 제한된 US-ASCII 문자만 사용하여 임의의 데이터를 인코딩하는 방법

Cookie cookie = new Cookie("name", URLEncoder.encode("Ted", "utf-8"));

 

https://www.baeldung.com/java-url-encoding-decoding

https://en.wikipedia.org/wiki/Percent-encoding

https://docs.w3cub.com/http/headers/set-cookie

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

https://wiki.c2.com/?EncodeCookieValues 

반응형

댓글