HTTP는 상태를 저장하지 않는 프로토콜인데 (매 요청이 일회성이고 독립적이다) 사용자를 식별하려면 어떻게 할까?
사용자 식별을 위해 존재하는 HTTP 헤더들은 다음과 같다.
헤더 이름 | 헤더 타입 | 설명 |
---|---|---|
From | 요청 | 사용자의 이메일 주소 |
User-Agent | 요청 | 사용자의 브라우저 |
*Referer | 요청 | 사용자가 현재 링크를 타고 온 원래 주소 |
Authorization | 요청 | 사용자 이름과 비밀번호 |
Client-ip | 확장(요청) | 클라이언트 IP 주소 |
X-Forwarded-For | 확장(요청) | 클라이언트 IP 주소 |
Cookie | 확장(요청) | 서버가 생성 |
헤더에는 없지만, HTTP는 TCP이므로 서버에서 클라이언트의 IP를 알 수 있다.
하지만 다음과 같은 문제점 때문에 보통 클라이언트 IP로 사용자를 식별하진 않는다.
HTTP가 기본적으로 지원하는 인증 방법이다. 브라우저에서 로그인 창이 띄워지고 서버로 보낼 수 있다. (이 기본 인증은 패킷 헤더에 아무런 보안 없이 노출되기 때문에 누구나 알 수 있는 문제가 있다.)
브라우저에서는 해당 헤더와 401(Unauthorized)를 받으면 알아서 로그인 창을 띄우게 되어 있다.
브라우저에서 입력한 값은 고정된 길이의 값으로 변환되어 요청의 Authorization 헤더에 붙어 간다.
사용자를 식별하고 세션을 유지하는 방식 중에서 현재까지 가장 널리 사용하는 방식이다. (모든 브라우저에서 지원한다)
쿠키의 파기 시점에 따라 두 종류로 구분된다.
Discard
나 파기까지 남은 시점을 가리키는 Expires
혹은 Max-Age
파라미터가 없으면 세션 쿠키이다.사용자가 웹 사이트에 방문하면 웹 서버는 사용자에게 Set-Cookie 응답 헤더로 사용자에게 쿠키를 전달한다(쿠키는 key=value 형태의 리스트이다).
브라우저는 서버로부터 온 Set-Cookie 헤더에 있는 쿠키 콘텐츠를 브라우저 쿠키 DB에 저장한다.
사용자가 미래에 같은 사이트를 방문하면, 브라우저는 이전에 서버로 부터 받은 쿠키를 Cookie 요청 헤더에 적어서 보낸다.
개발자 도구 > 애플리케이션 > 쿠키
에서 볼 수 있다쿠키 헤더를 포함한 요청에 대한 응답은, 개인 정보가 포함되어 있을 것이므로 캐시되면 안된다.
이런 경우 해당 문서에 Cache관련 헤더를 추가하거나 파기 시간이 0인 쿠키 헤더를 설정해서 매번 재검사하게 해야 한다.