Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

봄디의 개발일지

[HTTP] HTTP 헤더 - 쿠키 본문

HTTP

[HTTP] HTTP 헤더 - 쿠키

bomdy 2024. 10. 13. 22:00

쿠키를 사용할 때는 2개의 헤더를 사용합니다.

  • Set-Cookie : 서버에서 클라이언트로 쿠키 전달 (응답)
  • Cookie : 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청 시 서버로 전달

1️⃣ 만약 쿠키를 사용하지 않는다면 ?

쿠키 미사용 - 로그인

 

쿠키를 사용하지 않고 로그인을 할 경우, 처음 로그인 할 때는 user=홍길동 이라는 정보를 서버에 전달하기 때문에

서버에서도 홍길동님이 로그인했습니다. 라는 정보를 응답합니다.

 

쿠키 미사용 - 로그인

 

그러나, 로그인 이후에  /welcome 이라는 페이지를 접근할 경우 안녕하세요, 홍길동님 이라는 결과를 기대했는데

안녕하세요, 손님 이라고 서버에서 응답을 하게 된다.

그 이유는 서버에서는 /welcome 에 접근한 사용자가 홍길동이라는 사실을 모르기 때문이다.   

HTTP 는 Stateless 이기 때문이다 !

 

✅ HTTP 는 Stateless 이다. 

HTTP 는 무상태 프로토콜이기에 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어집니다. 

클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못합니다.

HTTP 에서는 클라이언트와 서버는 서로 상태를 유지하지 않습니다. 

 

✅ 대안 - 모든 요청과 링크에 사용자 정보를 포함해야할까 ?

모든 요청에 사용자 정보를 포함할 경우 서버에서는 안녕하세요, 홍길동님 과 같은 원하는 결과를 응답해줄 수 있습니다. 

그러나, 모든 요청에 사용자 정보가 포함되도록 개발을 해야하고,  보안 등등의 문제점이 발생합니다. 

 

따라서 서버에서는 쿠키를 사용합니다. 


2️⃣ 쿠키 (Cookie)

로그인 - 쿠키 사용

 

 

user=홍길동으로 로그인을 하면, 서버에서는 Set-Cookie 를 사용해서 로그인 정보가 담긴 쿠키 헤더를 만들어서 응답을 합니다.

웹 브라우저 내부에는 쿠키 저장소가 존재하는데 저장소에 user=홍길동 정보를 저장합니다. (key  는 user 이고, value 는 홍길동)

 

로그인 이후 - welcome 페이지 접근

 

로그인 이후에 /welcome 페이지에 접근할 때 자동으로 웹브라우저는 서버에 요청할 때마다 쿠키를 찾습니다. 

쿠키 값을 꺼내서 Cookie: user=홍길동 정보를 헤더에 포함시켜 서버로 전송합니다. 

서버에서는 헤더를 열어서 user=홍길동 이라는 정보를 보고 사용자를 알 수 있게 됩니다.  

 

모든 요청에 쿠키의 정보를 자동으로 포함하게 됩니다.  

그러나, 모든 곳에 쿠키 정보를 포함시켜 보내면 보안 등의 문제점이 발생할 수 있습니다. 

 

set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure

 

따라서 이런 식으로 제약하는 방법이 있습니다. 

 

✅ 쿠키 - 생명주기 (Expires, max-age)

Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT

이렇게 쿠키에 만료일을 지정하여 만료일이 되면 쿠키가 삭제되도록 할 수 있습니다. 

 

Set-Cookie: max-age=3600 (3600초)

혹은 이런식으로 max-age 로 초단위로 설정할 수도 있습니다. 

max-age 값을 0이나 음수로 지정하면 쿠키가 삭제되고, 유효기간이 지나도 쿠키는 삭제됩니다. 

 

쿠키는 2가지 종류가 있습니다. 

  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료 시까지만 유지
  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지

쿠키 - 도메인 (Domain)

쿠키에 도메인을 적을 수 있습니다. 도메인을 지정하는 방법은 2가지 방법이 있습니다. 

  • 명시 : 명시한 문서 기준 도메인 + 서브 도메인 포함
  • 생략 : 현재 문서 기준 도메인만 적용

✔ 명시 : 명시한 문서 기준 도메인 + 서브 도메인 포함

 

domain=example.org 이렇게 도메인을 지정해서 쿠키를 생성할 경우, 

example.org 는 물론이고 dev.example.org 도 쿠키에 접근할 수 있는 방법입니다. 

 

✔ 생략 : 현재 문서 기준 도메인만 적용


example.org
에서 쿠키를 생성하고 domain 지정을 생략한 경우에는

example.org 에서만 쿠키를 접근할 수 있고, dev.example.org 는 쿠키를 접근할 수 없습니다.

 

✅ 쿠키 - 경로 (Path)

path=/home

 

위와 같이 path 를 지정한 경우에는 이 경로를 포함한 하위 경로 페이지만 쿠키를 접근할 수 있습니다.

 

/home ➡ 가능 , /home/level1 ➡ 가능 , /home/level1/level2 ➡ 가능, /hello ➡ 불가능

 

일반적으로는 path=/ 루트로 지정합니다. 

 

✅ 쿠키 - 보안 (Secure, HttpOnly, SameSite)

✔ Secure

 

쿠키는 보통 http 와 https 를 구분하지 않고 전송합니다.

Secure 를 적용하면 https 인 경우에만 전송하게 됩니다. 

 

✔ HttpOnly

 

HttpOnly 는 XSS 공격을 방지하는 것입니다. 

자바스크립트에서 원래 쿠키에 접근할 수 있는데, httponly 를 사용하면 자바스크립트에서는 쿠키에 접근할 수 없게 됩니다. 

대신에 http 전송에서만 사용할 수 있습니다. 

 

✔ SameSite

 

samesite 는 XSRF 공격을 방지하는 것입니다. 

요청하는 도메인과 쿠키에 설정된 도메인이 같은 경우에 쿠키를 전송할 수 있습니다. 


🔍 참고글

인프런 김영한 강사님의  [모든 개발자를 위한 HTTP 웹 기본 지식] 섹션 8. HTTP 헤더1 - 일반 헤더 강의를 참고하여 작성했습니다.