모든 개발자를 위한 HTTP 웹 기본 지식 강의 수강 후, 정리한 글입니다.
Authorization은 클라이언트 인증 정보를 서버에 전달하는 방식이다.
WWW-Authenticate는 리소스 접근시 필요한 인증 방법을 정의하는 것이다.
Set-Cookie는 서버에서 클라이언트로 쿠키를 전달하는 것이고, Cookie는 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달하는 것이다.
즉, "Set-Cookie" 헤더는 웹 서버에서 전송되고, 브라우저는 "Cookie"라는 HTTP 헤더를 통해 쿠키를 서버에 다시 보낸다.
쿠키를 사용할 때와 미사용할 때를 비교해보면, 쿠키를 사용하는 이유를 이해하기 쉽다.
한 홈페이지에 접속하여 로그인한다고 생각해보자.
① 처음 welcome 페이지에 접근하면, "안녕하세요. 손님"이라는 200 OK 응답을 받을 수 있다.
② 홈페이지에 로그인하면, "홍길동님이 로그인했습니다."라는 200 OK 응답을 받는다.
③ 로그인한 상태에서 welcome 페이지에 다시 접근하면, 로그인했음에도 불구하고 "안녕하세요. 손님"이라는 200 OK 응답을 받는다.
HTTP는 기본적으로 무상태 프로토콜(stateless)이라 한번 연결된 후에는 연결을 끊어버리기 때문에 로그인한 사용자인지 구분할 수가 없다. 즉, 서버는 이전 요청을 기억하지 못한다.
그래서 쿠키가 필요하다!
그렇다면, 모든 요청과 링크에 사용자 정보를 포함하면 되지 않는가? 라는 의문이 생길 수도 있다.
GET /welcome?user=홍길동 HTTP/1.1
GET /board?user=홍길동 HTTP/1.1
GET /order?user=홍길동 HTTP/1.1
이런식으로 한다면, 보안에서 문제가 생길 수 있기 때문에 쿠키를 사용하도록 하자.
① 로그인시에 서버가 클라이언트에 Set-Cookie: user=홍길동
HTTP 헤더에 포함하여 보내면, 웹 브라우저 내부에 있는 쿠키 저장소에 user=홍길동
을 저장한다.
② 로그인 이후에 welcome 페이지에 다시 접근하면, 쿠키 저장소에서 조회하여 HTTP 헤더에 Cookie: user=홍길동
을 포함하여 서버에 요청한다. 서버는 "안녕하세요. 홍길동님."라는 200 OK 응답을 보낸다.
하지만, 모든 요청에 쿠키 정보를 자동 포함하여 주민번호, 신용카드 번호와 같은 개인정보를 보내면 보안 문제가 생길 수 있다. 그래서 sessionId
를 사용한다.
예시) set-cookie: sessionId=qwer1234; expires=Fri, 01-Jan-2024 00:00:00 GMT; path=/; domain=.google.com; Secure
sessionId=qwer1234
사용처
쿠키 정보는 항상 서버에 전송됨
expires=Fri, 01-Jan-2024 00:00:00 GMT
expires
max-age
세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시까지만 유지
영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지
domain=example.com
명시
생략
path=/home
이 경로를 포함한 하위 경로 페이지만 쿠키 접근할 수 있다. 보통 path=/
의 루트로 지정한다.
예시로 path=/home을 지정한다고 하면, 다음의 경로에 접근할 수 있다.
아래의 경우는 접근 불가능하다.
Secure
HttpOnly
SameSite
🗒️ 무상태 프로토콜
1. HTTP는 무상태(Stateless) 프로토콜
2. 클라이언트와 서버는 서로 상태를 유지하지 않는다.
3. 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
4. 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
🗒️ 웹 스토리지: 서버에 전송할 필요는 없을 때 사용