도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다.
HTTP는 Stateless(비상태성) 특징을 가지고 있어 요청을 보낸 클라이언트를 식별할 수 없다. 그러나 현대의 웹 사이트들은 개인화된 서비스를 제공하고 싶어한다. 때문에 클라이언트를 식별하기 위한 새로운 방법이 필요하다. 이 방법들에는 HTTP 헤더, 클라이언트 IP 주소, 사용자 로그인 인증, fat URL, 쿠키 등이 있다.
HTTP 헤더
사용자에 대한 정보를 전달하는 HTTP 요청 헤더가 있다.
FROM
- 사용자의 이메일 주소이다.
- 각 사용자가 서로 다른 이메일 주소를 가지므로, 사용자 식별이 가능하다.
- 악의적인 서버가 이메일 주소를 모아 스팸 메일을 발송할 수 있기 때문에, 요청을 보내는 브라우저 측에서 잘 사용하지 않는 헤더이다.
User-Agent
- 사용자가 쓰고 있는 브라우저의 이름과 버전 정보, 운영체제 정보 등을 포함한다.
- 특정 브라우저나 운영체제의 특성에 맞춰 콘텐츠를 최적화하는 데 유용하다.
- 특정 사용자를 식별하기는 힘들다.
Referer
- 사용자가 현재 페이지로 유입하게 한 웹페이지의 URL을 가리킨다.
- 사용자를 식별할 수는 없지만, 사용자가 이전에 어떤 페이지를 방문했는지 알 수 있으므로 사용자의 취향을 더 잘 파악할 수 있다.
클라이언트 IP 주소
클라이언트 IP 주소는 보통 HTTP 헤더에 없지만, 웹 서버는 HTTP 요청을 보내 반대쪽 TCP 커넥션의 IP 주소를 알아낼 수 있다. 다만, 아래의 이유로 인해 사용자 식별에 사용되지 않는다.
- 사용자 개인이 아닌, 컴퓨터 자체를 가리킨다. 이때문에 여러 사용자가 한 컴퓨터를 사용한다면 의미 없다.
- 많은 ISP가 동적으로 IP 주소를 할당하기 때문에, 로그인한 시각에 따라 IP 주소가 바뀐다.
- 많은 사용자가 NAT 방화벽을 통해 실제 IP 주소를 숨긴다.
- HTTP 프락시, 게이트웨이를 사용하는 경우, 웹 서버에 전달되는 IP 주소는 프락시 서버의 IP 주소이다.
사용자 로그인
클라이언트에게 사용자 이름과 비밀번호로 인증할 것을 요구한다.
서버에서 사용자에게 로그인을 요구하고 싶다면, 401 Login Required 응답 코드와 WWW-Authenticate 헤더를 사용자에게 보낸다. 사용자는 로그인을 하고, 다음 요청부터 Authorization 헤더에 로그인 정보를 담아 보낸다.
자세한 내용은 12장: 기본 인증에서 다룬다.
뚱뚱한 URL
사용자의 상태 정보를 포함하고 있는 URL이다. 다음과 같은 문제 때문에 잘 사용되지 않는다.
- URL이 길어 사용자에게 혼란을 준다.
- 특정 사용자와 세션에 대한 상태 정보를 포함하기 때문에, URL을 다른 사용자에게 보낸다면 누적된 개인 정보가 함께 공유된다.
- URL이 달라지기 때문에, 기존 캐시에 접근할 수 없다.
- 뚱뚱한 URL에 해당되는 HTML 페이지를 다시 그려야 하기 때문에, 서버 부하가 가중된다.
- 사용자가 링크를 타고 다른 사이트로 이동하는 등의 행동을 하면 기존 URL에서 이탈되기 때문에, 상태 정보가 사라진다.
- 사용자가 특정 뚱뚱한 URL을 북마크에 넣어놓지 않는 이상, 로그아웃하면 모든 정보를 잃는다.
쿠키
사용자를 식별하고 세션을 유지하는 방식 중에서 현재까지 가장 널리 사용되는 방식이다.
쿠키의 종류
- 세션 쿠키: 임시 쿠키로, 사용자가 브라우저를 닫으면 삭제된다.
- 지속 쿠키: 디크스에 저장되기 때문에, 사용자가 브라우저를 닫아도 삭제되지 않는다. 사용자가 주기적으로 방문하는 사이트에 대한 설정 정보나 로그인 상태를 유지하기 위해 사용된다.
- Discard 파라미터가 설정되어 있거나, Expires 혹은 Max-Age 파라미터가 없으면 세션 쿠키가 된다.
특징
- 브라우저가 서버 관련 정보를 저장하고, 사용자가 해당 서버에 접근할 때마다 그 정보를 함께 전송하도록 한다.
- 보통 브라우저는 쿠키를 생성한 서버에게만 쿠키에 담긴 정보를 전달한다.
- 광고 관리에 활용될 경우, 같은 광고사에서 제공하는 서로 다른 웹 사이트에 사용자가 방문하면, 브라우저는 앞서 만든 지속 쿠키를 다시 광고사 서버로 전송한다. 광고사는 이 기술에 Referer 헤더를 접목하여 사용자의 프로필과 웹 사이트를 사용하는 습관에 대한 방대한 데이터를 구축할 수 있다.
Version 0 쿠키 헤더
Set-Cookie 헤더
| Set-Cookie 속성 | 설명과 예시 |
| 이름=값 | 필수 속성으로, 이름과 값 모두 세미콜론, 쉼표, 등호, 공백을 포함하지 않는 문자열이다. Set-Cookie: name=Mary |
| Expires | 쿠키의 생명주기를 가리키는 날짜 문자열을 기술한다. 파기 일자에 다다르면 해당 쿠키는 삭제되고 전달되지 않는다. 사용할 수 있는 타임 존은 GMT뿐이다. Set-Cookie: name=Mary; expires=Wednesday, 09-Nov-23 17:17:17 GMT |
| Domain | 브라우저는 이 속성에 기술된 도메인을 사용하는 서버 호스트 명으로만 쿠키를 전송한다. 두 개에서 세 개 영역을 가지는 도메인을 기술해야 한다. -> 특정 최상위 단계에 있는 도메인에 해당하는 것들은 2개의 영역만 기술하면 된다. Set-Cookie: SHIPPING=FEDEX; domain="joes-hardware.com" |
| Path | 서버에 있는 특정 문서에만 쿠키를 할당할 수 있다. 만약 Path 속성에 기술된 값이 URL 경로의 앞부분과 일치하면, 쿠키를 전달한다. 만약 경로를 명시하지 않으면, Set-Cookie 응답을 전달하는 URL의 경로가 사용된다. Set-Cookie: lastorder=00183; path=/orders |
| Secure | 이 속성이 포함되어 있으면, 쿠키는 HTTP가 SSL 보안 연결을 사용할 때만 쿠키를 전송한다. Set-Cookie: private_id=519; secure |
Cookie 헤더
클라이언트가 서버에 요청을 보낼 때, Domain, Path, Secure 정보가 현재 요청하려고 하는 사이트에 일치하면서, 아직 파기하지 않은 쿠키들을 함께 보낸다. 모든 쿠키는 이어 붙여 보낸다.
Cookie: session-id=002-234234-546345; session-id-time=10043892
'CS > Network' 카테고리의 다른 글
| HTTP: 보안 HTTP (0) | 2023.03.24 |
|---|---|
| HTTP: 기본 인증 (0) | 2023.03.20 |
| HTTP: 캐시 (0) | 2023.03.13 |
| HTTP: 웹 서버 (0) | 2023.03.13 |
| HTTP: HTTP 메시지 (0) | 2023.03.06 |