프로그래밍/http

[ http ] 08. HTTP 헤더(쿠키)

Yanoo 2021. 12. 8. 23:57
728x90
반응형
  • Set-Cookie : 서버에서 클라이언트로 쿠키 전달(응답)
  • Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달

 

쿠키 미사용

쿠키 미사용 시에 페이지에 접근한다면 어떻게 될까?

일단은 응답을 보낸다

로그인을 한다면 어떻게 될까?

로그인 이후에 welcome 페이지에 접근한다면 어떻게 될까?

홍길동님을 기대했지만 손님이라는 답이 오게 된다. 왜냐면 이 요청이 로그인한 사람인지 아닌지 구분할 방법이 없기 때문이다. (http는 stateless 프로토콜이기 때문!)

 

이에 대한 대안으로 모든 요청에 사용자 정보를 포함하는 방법이 있다.

하지만 이 요청의 큰 문제는 요청을 보낼 때마다 사용자 정보를 보내야 한다는 점이다.

그리고 브라우저를 완전히 종료하고 다시 열면 로그인된 정보가 지워진다.

 

 

쿠키

쿠키를 이용하여 로그인 시도할 때를 봐보자

그림1

로그인을 요청하면 서버는 Set-Cookie에 user는 홍길동이라는 정보를 담은 쿠키를 만들고 클라이언트는 이걸 받아 쿠키 저장소(브라우저 내부에 있음)에 저장한다.

그리고 로그인 이후에 welcome페이지에 들어가면, 자동으로 웹브라우저는 이 페이지를 요청할 때마다 쿠키 저장소 안을 찾아보고 Cookie라는 헤더를 만들어서 user=홍길동이라는 정보를 보낸다. 그래서 서버는 홍길동이 요청했다는 것을 알 수 있게 된다.

 

일단 쿠키의 사용처를 알아보면

  • 사용자 로그인 세션 관리
  • 광고 정보 트래킹

이다. 그리고 쿠키 정보는 항상 서버에 전송되기 때문에 네트워크 트래픽 추가를 유발한다. 그래서 최소한의 정보만 사용하는데 그 예로 세션 id나, 인증 토큰 정도에 쓰인다.

다른 경우가 있긴한데, 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지를 참고하면 된다.

 

주의할 점으로 보안에 민감한 데이터는 저장하면 안된다(주민번호, 신용카드 번호 등)

 

좀 더 깊게 들어가보면

서버의 응답인 set-cookie의 예시를 봐보자

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

여기서 볼 것은 sessionId인데

그림1

위에 나왔던 그림1에서 Set-Cookie: user=홍길동이라고 했지만 보통 이대로 보내지 않고 아이디 정보를 가지고 알고리즘을 통해 세션키와 세션 ID가 만들어 지게 되는데 세션키는 서버가 가지고 있고 Set-Cookie에 세션 ID를 보내게 되는 것이다. 그렇게 해서 클라이언트는 서버에 요청할 때마다 세션 ID를 보냄으로써 서버는 이 ID를 서버가 가지고 있는 세션키로 확인하고, 이 요청이 홍길동인지 구분할 수 있게 된다.

로그인 시
로그인 후 요청 시

 

쿠키 - 생명주기

Expires, max-age

  • Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
    • 만료일이 되면 쿠키 삭제
  • Set-Cookie: max-age=3600(3600초)
    • 0이나 음수를 지정하면 쿠키 삭제
  • 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시까지만 유지
  • 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지

쿠키 - 도메인

Domain

예) domain=example.org

  • 명시: 명시한 문서 기준 도메인 + 서브 도메인 포함
    • domain=example.org를 지정해서 쿠키 생성
      • example.org는 물론이고
      • dev.example.org도 쿠키 접근
    • 생략: 현재 문서 기준 도메인만 적용
      • example.org에서 쿠키를 생성하고 domain 지정을 생략
        • example.org에서만 쿠키 접근
        • dev.example.org는 쿠키 미접근

쿠키 - 경로

예) path=/home

  • 이 경로를 포함한 하위 경로 페이지만 쿠키 접근
  • 일반적으로 path=/ 루트로 지정
  • 예)path=/home 지정
    • /home => 가능
    • /home/level1 => 가능
    • /home/level1/level2 => 가능
    • /hello => 불가능

쿠키 - 보안

Secure, HttpOnly, SameSite

  • Secure
    • 쿠키는 http, https를 구분하지 않고 전송
    • Secure를 적용하면 https인 경우에만 전송
  • HttpOnly
    • XSS 공격 방지
    • 자바스크립트에서 접근 불가(document.cookie)
    • HTTP 전송에만 사용
  • SameSite
    • XSRF 공격 방지
    • 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
728x90
반응형