이번 TIL은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식"을 학습하고, 정리한 내용입니다.
만약, 제 글의 내용을 퍼갈 시에는 " 모든 개발자를 위한 HTTP 웹 기본 지식 "도 출처에 첨부하시기 바랍니다.
쿠키를 사용할 때는 아래 2개의 헤더를 사용한다.
welcome HTTP/
라고 접근하면, "안녕하세요 00님"을 기대한다고 가정하자!!
그리고, 로그인을 하면, 로그인에 성공했다는 메시지를 받을 것이다.
그 이후에, 다시 welcome HTTP/
를 보내면, 내가 기대하는 것은 "안녕하세요 홍길동님"인데, 다시 "손님"이라고 메세지가 온다. 로그인이 풀린 것이다.
서버 입장에서 welcome HTTP/
만 보고, 누구인지 판단할 수 없다. 손님이 보낸 메세지와 다른 게 없기 때문에, "손님"이라고 보낸 것이다.
모든 요청에마다 "사용자 정보"를 포함해서 보내면 된다.
그런데, 이 대안은 심각한 문제가 있다.
모든 요청에 사용자 정보를 다 포함해야 한다는 것이다. 이건 보내는 요청량이 늘어나는 문제를 떠나서, 보안상 문제도 발생하고, 개발도 힘들어진다.
그리고 브라우저를 완전히 종료하고 다시 열면... 어떻게 할 것인가??
요즘에는 "웹 스토리지"가 있어서 거기에 저장을 해놓고 다시 넘기면 되기는 한다.
하지만, 이렇게 요청할마다 모든 사용자 정보를 다 넘기는 것은 여전히 힘든 일이다.
이런 문제를 해결하기 위해서, "쿠키"라는 개념이 도입이 된다.
웹 브라우저에서 로그인 시에, 사용자 정보를 보내면, 서버에서는 로그인이 성공하면, 해당 정보를 "쿠키 헤더"에 담아서 응답을 한다.
웹 브라우져 내부에는 쿠키 저장소가 있다. 그 저장소에다가 user=홍길동
을 저장해둔다.
정리하면, 서버에서 사용자 정보를 담은 "쿠키 해더"를 담아서 응답 메세지를 보내면, 그것을 받은 클라이언트 측의 웹 브라우져는 쿠키 저장소에다가 쿠키를 저장한다.
이제 로그인 이후에, welcome 페이지에 들어간다면, 자동으로 웹 브라우져는 이 서버에 요청을 보낼 때마다 쿠키 저장소에서 해당 쿠키 값을 꺼내서, 요청 메세지에 쿠키를 넣어준다.
서버는 쿠키를 열어보고, 유저가 누구인지 알 수 있다.
이제 더이상 지져분하게 URI에 모든 사용자 정보를 넣어줄 필요가 없다.
쿠키는 지정한 서버에 한해서, 모든 요청 정보에 자동을 포함이 된다.
그런데, 모든 곳에 다 쿠키를 보내면, 보안상 문제가 생기고 여러 잠재적인 문제들이 생길 수 있다.
그래서, 이것을 제약하는 방법들이 있다.
다음 쿠키의 예시를 살펴보자
셋 쿠키니까 서버=> 클라이언트로 보내는 응답용 쿠키라는 것을 알 수있다.
세션 방식으로 로그인을 하는지 세션 ID 라는 것이 담겨있다.
쿠키가 만료되는 시간도 보인다.
path는 " 이러한 경로들에 대해서 허용해주겠구나 " 하는 것을 알 수있다.
domain은 " 이러한 도메인들에 대해서 쿠키가 허용이 되는구나 "를 알 수 있다.
Secure는 쿠키에 뭔가 보안 정보를 넣는 구나 하고 이해하면 된다.
쿠키의 주 사용처
쿠키의 정보는 항상 서버에 전송이 되기 때문에, 다음과 같은 단점들이 있다.
참고로, 쿠키이든 웹 스토리지이든 보안에 민감한 정보들은 절대로 저장하면 안 된다.
쿠키를 무제한 보관할 수는 없다.
expires
max-age
max-age 가 expires 보다 우선순위를 갖는다!!
영속 쿠키
내가 지정한 쿠키가 아무 싸이트에나 들어가면, 문제가 생긴다.
그래서, 쿠키는 도메인을 지정할 수가 있다. 여기에는 2가지 방법이 있다.
도메인으로 먼저 한 번 필터를 하고, 그 다음에 경로로 추가로 필터를 한다.
그리고 경로를 지정해주면, 해당 경로를 포함한 그 하위 페이지만 쿠키 접근이 가능하다.
일반적으로, path=/
(루트 패스)를 지정한다.
왜냐면, 한 도메인 안에서 보통 쿠키를 다 전송하기를 원한다. 근데, 특별한 경우에는 지정할 수있다.
원래, 자바스크립트에서 쿠키에 접근할 수가 있다. 그런데, HttpOnly
를 사용하면, 쿠키에 접근할 수가 없다. 대신에, HTTP 전송에서만 사용할 수가 있다.
요청하는 도메인 = 쿠키에 설정된 도메인
때만 쿠키를 전송할 수 있다.
구 버전에는 max-age를 지원하지 않는다.