쿠키는 서버에서 클라이언트에 데이터를 저장하는 방법 중 하나
서버가 원한다면 클라이언트에서 쿠키를 이용하여 데이터를 가져올 수 있다.
따라서 서버 -> 클라이언트로 쿠키를 이용한 데이터 전송만 가능한것이 아니라
클라이언트 -> 서버로 쿠키를 전송하는것도 가능하다.
쿠키의 장점 : 클라이언트에 데이터를 저장할 수 있습니다.
토큰과 같은 특정 데이터를 서버에 저장하는 것이 아닌, 클라이언트에 저장하여 서버에 부담을 덜어줄 수 있다.
쿠키를 이용하여 데이터를 전송하는 경우, 아무때나 데이터를 가져올 수 있는것이 아니라
특정 조건을 만족하는 경우에만 가져올 수 있다. 이러한 조건들은 '쿠키 옵션'을 이용하여 설정한다.
Domain
www.google.com과 같은 서버에 접속할수 있는 이름을 뜻한다.
localhost 로컬환경 같은 경우(http://www.localhost.com:3000/users/login 과 같은 URL을 사용하는 경우) localhost.com과 같은 이름이 도메인이 될 수 있다.
Path
서버가 라우팅을 할 때 사용하는 경로
http://www.localhost.com:3000/users/login 에서 /users/login 이 path가 된다.
해당하는 path로만 쿠키를 전송할수 있게 설정할 수 있다.
MaxAge or Expires
쿠키의 유효기간을 정하는 옵션
MaxAge는 '앞으로 몇 초 동안' 쿠키가 유효한지 설정하는 옵션
Expires는 '언제까지 유효한지' Date를 지정하는 옵션
해당 시간이 지나면 쿠키는 자동으로 파괴된다.
옵션을 따로 지정하지 않으면 브라우저의 탭을 닫았을때 쿠키가 제거된다.
Secure
기본값은 false
true로 설정한 경우, HTTPS를 이용하여 통신하는 경우에만 쿠키를 전송할 수 있음
HttpOnly
기본값은 false, 자바스크립트에서 쿠키에 접근이 가능 -> XSS 공격에 취약
true로 설정한 경우, 자바스크립트로 쿠키에 접근이 불가
SameSite
Croess-Origin 요청을 받은 경우 '요청에서 사용한 메소드' + '해당 옵션의 조합'으로 쿠키 전송 여부를 결정하게 된다.
Lax : Cross-Origin 요청이면 GET 메소드에 대해서만 쿠키를 전송할 수 있다.
Strict : Cross-Origin이 아닌 same-site 인 경우에만 쿠키를 전송 할 수 있다.
None: 항상 쿠키를 보내줄 수 있습니다. 다만 쿠키 옵션 중 Secure 옵션이 필요
'same-site'?
-> 요청을 보낸 Origin과 서버의 도메인이 같은 경우
위와 같은 '쿠키 옵션'을 지정한 다음 서버에서 쿠키를 처음 전송하게 된다면 헤더에 Set-Cookie라는 프로퍼티에 쿠리르 담아 쿠키를 전송하게 된다.
이후에는 클라 -> 서버 , 서버 -> 클라 에서 쿠키를 전송할때 헤더에 Cookie라는 프로퍼티에 쿠키를 담아 서버에 쿠키를 전송하게 된다.
클라이언트에 정보를 유지할 수 있는 특성을 이용해 Stateless한 특징을 갖고 있는 HTTP, HTTPS에서 상태를 stateful 하게 유지할 수 있습니다.
그러나 쿠키에 민감한 정보를 담는 것은 위험합니다.
쿠키에 들어있는 인증정보를 탈취해서 서버에 요청을 보내게 되면 서버는 인증된 유저의 요청으로 취급하기 때문에 개인정보같은 민감한 정보에 접근이 가능하게 됩니다. 따라서 쿠키에 민감한 정보를 담는것은 지양해야 합니다.