
(해석 또는 이해가 잘못된 부분이 있다면 댓글로 편하게 알려주세요.)
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 값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 값 -> 유입 도구(기기, 브라우저 등) 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 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에서 고안한 로그 형식
99823414 3001 209.1.32.44 TCP_MISS/200 4087 GET http://www.joes-hardware.com - DIRECT/proxy.com text/html


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

Meter 헤더에 자신이 Hit Metering을 제공함을 전달Meter 헤더를 통해 프록시에게 usage reports를 전송할 것을 요청Meter 헤더를 통해 reports 전달
예전에 클라이언트 요청 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 시대에 개발자들 입에 풀칠하고 살기 힘들다지만 다람쥐 책 읽듯 묵묵히 내가 할 수 있는 일을 해나가는 사람이 되겠다. 포기하고 싶은 순간이 와도 포기하지 않고, 작심삼일을 백 번 하더라도 무언가를 반드시 이루고야 마는, 그런 사람이 되겠다.