CS/Network

HTTP: 클라이언트 식별과 쿠키

kkumta 2023. 3. 20. 18:06

도서 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