Web server

Cookie

Mia_ 2023. 1. 4. 19:33

Cookie

: 어떤 웹 사이트에 들어갔을 때 서버가 일방적으로 클라이언트에 전달하는 작은 데이터

- 서버에서 클라이언트에 영속성이 있는 데이터를 저장하는 방법

- 서버가 원한다면 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있음 

 

- 해당 도메인에 대해 쿠키가 존재하면, 웹 브라우저는 도메인에게 http 요청 시 쿠키를 함께 전달

 

- 쿠키를 사용하는 것은 단순히 서버에서 클라이언트에 쿠키를 전송하는 것만 의미 하지 않고

- 클라이언트에서 서버로 쿠키를 다시 전송하는 것도 포함

 

- But, 데이터를 저장한 이후 아무 때나 데이터를 가져올 수는 없음!

- 데이터를 저장한 이후 특정 조건들이 만족되어야 다시 가져올 수 있기 때문


Cookie 옵션

'Set-Cookie':[
            'cookie=yummy', 
            'Secure=Secure; Secure',
            'HttpOnly=HttpOnly; HttpOnly',
            'Path=Path; Path=/cookie',
            'Doamin=Domain; Domain=miamia.com'
        ]

1. Domain 

- 도메인이란 흔히 사용하는 www.google.com 과 같은 서버에 접속할 수 있는 이름

- 쿠키 옵션에서 도메인은 포트 및 서브 도메인(www 같은 도메인 앞에 추가로 작성되야 하는 부분) 정보, 세부 경로를 포함하지 않음 

- 따라서 요청해야 할 URL이 http://www.localhost.com:3000/users/login 이라하면 여기서 Domian 은 localhost.com이 됨 

- 만약 쿠키 옵션에서 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키를 전송할 수 있음 

- 이를 통해 naver.com에서 받은 쿠키를 google.com에 전송하는 일을 막을 수 있음 

 

2. Path

- path는 세부 경로로써 서버가 라우팅 할 때 사용하는 경로를 의미

- 만약 요청해야 하는 URL이 http:localhost.com:3000/users/login인 경우라면 여기에서 Path, 즉 세부 경로는 /users/login이 됨

- 이를 명시하지 않으면 기본적으로 / 으로 설정되어 있음

 

- path 옵션의 특징은 설정된 경로를 포함하는 하위 경로로 요청을 하더라도 쿠키를 서버에 전송할 수 있음 

- 즉 path가 /users로 설정되어 있고 요청하는 세부 경로가 /users/miamia인 경우라면 쿠키 전송이 가능

- 하지만 /posts/miamia로 전송되는 요청은 path 옵션(/users)을 만족하지 못하기 때문에 서버로 쿠키를 전송할 수 없음

 

3. MaxAge or Expires

- 쿠키가 유효한 기간을 정하는 옵션 

- MaxAge는 쿠가가 유효한 시간을 초 단위로 설정하는 옵션

- Expires는 언제까지 쿠기가 유효한지 날짜를 정할 수 있음, 이때 옵션 값은 클라이언트 시간을 기준으로 함

 

- 쿠키 옵션 여부에 따라 세션 쿠키(Session Cookie)와 영속성 쿠키(Persistent Cookie)로 나눔

세션 쿠키 : MaxAge 또는 Expires 옵션이 없는 쿠키로 브라우저가 실행 중일 때 사용할 수 있는 임시 쿠키 / 브라우저를 종료하면 해당 쿠키는 삭제 됨 

영속성 쿠키 : 브라우저 종료 여부와 상관 없이 MaxAge 또는 Expires에 지정된 유효 시간 만큼 사용가능한 쿠키

 

4. Secure

- 사용하는 프로토콜에 따른 쿠키의 전송 여부를 결정하는 옵션

- 만약 Secure 옵션이 true로 설정된 경우 HTTPS를 이용하는 경우에만 쿠키를 전송할 수 있음

- Secure 옵션이 없다면 http, https 에 모두 쿠키를 전송할 수 있음

 

5. HttpOnly

- 자바스크립트에서 브라우저에 쿠키 접근 여부를 결정함

- 만약 해당 옵션이 true로 설정된 경우 자바스크립트로 쿠키에 접근이 불가

- 명시되지 않은 경우 기본으로 false로 지정 되어 있음

- 만약 이 옵션이 false 인 경우 document.cookie를 통해 자바스크립트에서 쿠키 접근이 가능하므로 XSS 공경에 취약함

 

6. SameSite

- Cross-Origin 요청을 받은 경우 요청에서 사용한 메소드와 해당 옵션(ex. GET, POST, PUT, PATCH ...)의 조합을 기준으로 서버의 쿠키 전송 여부를 결정하게 됨

 

Lax : Cross-Origin 요청이라면 GET 메소드에 대해서만 쿠키를 전송할 수 있음

Strick : 단어 그대로 가장 엄격한 옵션으로 Cross-Origin이 아닌 same-site인 경우에만 쿠키를 전송할 수 있음

None : Cross-Origin에 대해 가장 관대한 옵션으로 항상 쿠키를 보내줄 수 있음 / 다만 쿠키 옵션 중 Secure 옵션이 필요

 

- 이 때 same-site는 요청을 보낸 Origin과 서버의 도메인, 프로토콜, 포트가 같은 경우를 말함

- 이중 하나라도 다르다면 Cross-Origin으로 구분

 

- 서버에서 이러한 옵션들을 지정한 다음 서버에서 클라이언트로 쿠키를 전송하게 된다면 헤더에 set-Cookie라는 프로퍼티로 쿠키를 담아 전송함

 

- 이후 클라이언트에서 서버에게 쿠키를 전송해야 한다면 클라이언트는 헤더에 Cookie라는 프로퍼티에 쿠키를 담아 서버에 쿠키를 전송하게 됨


쿠키를 이용한 상태 유지 

 

- 이러한 쿠키의 특성을 이용하여 서버는 클라이언트에 인증정보를 담은 쿠키를 전송하고 

- 클라이언트는 전달 받은 쿠키를 서버에 요청과 같이 전송하여 Stateless한 인터넷 연결을 Sateful하게 유지 할 수 있음

 

- 하지만 쿠키는 기본적으로 오랜 시간 유지될 수 있고, HttpOnly 옵션을 사용하지 않았다면 자바스크립트를 이용해서 쿠키에 접근 할 수 있기 때문에 쿠키에 민감한 정보를 담는 것은 위험함