[TIL] HTTP : The Definitive Guide "p483 ~ p495" 完

시윤·2026년 5월 16일

[TIL] Two Pages Per Day

목록 보기
162/162
post-thumbnail

Chapter 21. Logging and Usage Tracking

(해석 또는 이해가 잘못된 부분이 있다면 댓글로 편하게 알려주세요.)


✏️ 요약


What to Log?

  • [목적1] 서버나 프록시의 문제를 발견하기 위함
  • [목적2] 웹 사이트 접근에 관한 통계를 생성하기 위함
    • 통계 -> 마케팅, 청구서, 서버나 대역폭 증설을 위한 자료 등으로 활용
  • 일반적으로 로깅되는 항목
    • 서버와 클라이언트 사이의 의도치않은 상호작용 디버깅
      • 클라이언트나 서버의 HTTP 버전
    • 무엇을 위한 요청인가
      • HTTP 메서드
      • 요청 리소스 URL
    • 요청으로 인해 어떤 일이 발생했는가
      • HTTP 응답 코드
    • 특정 시점에 얼마나 많은 바이트가 오고 가는가
      • 요청 및 응답메시지의 크기
      • 트랜잭션이 발생한 시점 (타임스탬프)
    • User-Agent 헤더와 Referer 헤더 값

Common Log Format

NCSA에 의해 정의 -> 대부분의 상업용 & 오픈소스 서버에서 디폴트로 사용하는 로그 포맷

209.1.32.44 - - [03/Oct/1999:14:16:00 -0400] "GET / HTTP/1.0" 200 1024
http-guide.com - dg [03/Oct/1999:14:16:32 -0400] "GET / HTTP/1.0" 200 477
http-guide.com - dg [03/Oct/1999:14:16:32 -0400] "GET /foo HTTP/1.0" 404 0
  • remotehost : 요청자 컴퓨터의 호스트명 or IP 주소
  • username : 애플리케이션 로직 내부 레벨에서의 사용자 이름 (OAuth2, JWT 등)
  • auth-username : 인증이 수행된 후 요청자가 인증한 사용자 이름 (Basic Auth, Digest Auth 등)
  • timestamp : 요청 날짜와 시각
  • request-line : HTTP 요청 라인
  • response-code : HTTP 응답 코드
  • response-size : Content-Length 값

Combined Log Format

Common Log Format에 두 가지 필드가 추가된 형식

209.1.32.44 - - [03/Oct/1999:14:16:00 -0400] "GET / HTTP/1.0" 200 1024 "http://www.joes-hardware.com/" "5.0: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)"
  • Referer : HTTP 헤더의 Referer 값 -> 유입 링크
  • User-Agent : HTTP 헤더의 User-Agent 값 -> 유입 도구(기기, 브라우저 등)

Netscape Extended Log Format

Common Log Format에 프록시나 캐시 등 HTTP 응용 프로그램과 연관된 필드까지 통합한 형식

209.1.32.44 - - [03/Oct/1999:14:16:00-0400] "GET / HTTP/1.0" 200 1024 200 1024 0 0 215 260 279 254 3
  • proxy-response-code : 서버에서 프록시로 전달된 HTTP 응답 코드
  • proxy-response-size : 서버에서 프록시로 전달된 Content-Length 값
  • client-request-size : 클라이언트에서 프록시로 전달된 Content-Length 값
  • proxy-request-size : 프록시에서 서버로 전달된 Content-Length 값
  • client-request-hdr-size : 클라이언트의 요청 헤더 바이트 크기
  • proxy-response-hdr-size : 요청자에게 전달된 프록시의 응답 헤더 바이트 크기
  • proxy-request-hdr-size : 서버에 전달된 프록시의 응답 헤더 바이트 크기
  • server-response-hdr-size : 서버의 응답 헤더 바이트 크기
  • proxy-timestamp : 요청이나 응답이 프록시를 통과하는 데 소요된 시간

Netscape Extended 2 Log Format

Netscape Extended Log Format에 몇 가지 필드가 추가된 형식

209.1.32.44 - - [03/Oct/1999:14:16:00-0400] "GET / HTTP/1.0" 200 1024 200 1024 0 0 215 260 279 254 3 DIRECT FIN FIN WRITTEN
  • route : 클라이언트 요청에 응답하기 위해 프록시가 사용한 경로
    • DIRECT : 원본 서버에서 리소스 조회
    • PROXY(host:port) : host:port에 해당하는 프록시에서 리소스 조회
    • SOCKS(socks:port) : SOCKS 서버를 통해 리소스 조회
  • client-finish-status-code : 클라이언트 -> 프록시 요청이 성공적으로 이루어졌는지 확인하기 위한 상태 코드 (성공 FIN, 실패 INTR, 타임아웃 TIMEOUT)
  • proxy-finish-status-code : 프록시 -> 서버 요청이 성공적으로 이루어졌는지 확인하기 위한 상태 코드 (성공 FIN, 실패 INTR, 타임아웃 TIMEOUT)
  • cache-result-code : 캐시 상태 코드 -> 캐시가 요청에 어떻게 대응하였는지 확인

Squid Proxy Log Format

오픈소스 프로젝트 Squid에서 고안한 로그 형식

99823414 3001 209.1.32.44 TCP_MISS/200 4087 GET http://www.joes-hardware.com - DIRECT/proxy.com text/html
  • Timestamp, time-elapsed, host-ip, action-code, status, size, method, URL, RFC 931 ident, hierarchy, from, content-type 필드로 구성


Hit Metering

Cache Busting을 방지하기 위해, 프록시 캐시에서 집계된 콘텐츠 제공횟수를 정기적으로 원본 서버에 보고하는 프로토콜 (RFC 2227)

  • 현재는 거의 사용되지 않는 기술
  • HTTP extension의 형태
    • 캐시와 서버의 접근 정보 공유
    • 캐싱된 리소스의 사용 빈도 조절
  • 동작 방식
    • 클라이언트 -> 프록시 : 일반적인 HTTP 트랜잭션 수행
    • 프록시 -> 서버 : Meter 헤더에 자신이 Hit Metering을 제공함을 전달
    • 서버 -> 프록시 : Meter 헤더를 통해 프록시에게 usage reports를 전송할 것을 요청
    • 이후 요청에서 프록시 -> 서버 : Meter 헤더를 통해 reports 전달

The Meter Header


A Word on Privacy

  • 로그에는 사용자의 정보가 남을 수 있으므로 privacy에 항상 유의해야 한다
  • 서버 관리자는 고객의 트랜잭션 정보가 모니터링 되고 있음을 사전에 고지해야 한다

✏️ 코멘트


예전에 클라이언트 요청 IP를 확인해야 할 일이 있어서 Nginx 로그를 열어본 적이 있었다. Nginx 위에 WAS를 올리는 방식이 익숙하지 않았던 나는.. 난생 처음 보는 Nginx 구성 파일과 로그에 완전히 정신이 나가버렸다. 사실 좀만 집중해서 보면 그렇게 어려울 것도 없었는데 처음이라 쫄았다.

여타 서버와 마찬가지로 Nginx도 NCSA 표준 포맷으로 로깅이 되어 있었는데, 각각의 필드가 뭘 의미하는지 정확히 알지 못해서 많이 헤맸던 기억이 난다. 로그에 IP 주소가 여러 개 찍혀 있었기 때문이다. 하나는 NCSA 포맷의 remote_addr 값이고, 다른 IP는 Nginx에서 제공하는 http_x_forwarded_for 값이었다. 요청이 로드밸런서나 앞단의 프록시를 거쳐서 들어오는 경우에는 remote_addr 값이 클라이언트의 IP가 아닐 수 있어서 XFF 헤더를 함께 사용하는 상황이었다. 이제는 표준 포맷을 알고 있으니 무엇이 remote_addr고 무엇이 커스텀 헤더인지 쉽게 구분할 수 있을 것 같다.


✏️ 완독 후기


처음 HTTP 책을 읽기 시작한 게 2024년 1월 18일, 오늘 날짜가 2026년 5월 16일이다. 당최 얼마나 게으른 건지 모르겠다. 2년이 넘는 시간 동안 책 한 권을 붙잡고 있었던 것도 여러모로 대단하다. 하루에 두 페이지 읽는 것조차 귀찮아서 미루고 미룬 내 자신도 대단하고, 그런 와중에 또 포기는 안 해서 꾸역꾸역 어떻게든 493페이지를 다 읽어낸 것도 대단하다. 확실히 나도 정상은 아니라고 생각한다.

이 책을 읽는 동안 계절이 두 사이클을 돌았고, 그 사이에 인턴도 하고 졸업도 했다. 요즘 같은 AI 시대에 개발자들 입에 풀칠하고 살기 힘들다지만 다람쥐 책 읽듯 묵묵히 내가 할 수 있는 일을 해나가는 사람이 되겠다. 포기하고 싶은 순간이 와도 포기하지 않고, 작심삼일을 백 번 하더라도 무언가를 반드시 이루고야 마는, 그런 사람이 되겠다.

profile
틈틈이 두 페이지씩 원서 읽기

0개의 댓글