# 21. 로깅과 사용 추적

## 21.1 로그란 무엇인가?

#### 로깅을 하는 이유

1. 서버나 프락시의 문제를 찾기 위해
2. 웹 사이트 접근 통개를 내기 위해

#### 일반적으로 로깅하는 필드의 예시

* HTTP 메서드
* 클라이언트와 서버의 HTTP 버전
* 요청받은 리소스의 URL
* 응답의 HTTP 상태 코드
* 요청과 응답 메시지의 크기(모든 엔터티 본문을 포함)
* 트랜잭션이 일어난 시간
* Referer와 User-Agent 헤더 값

## 21.2 로그 포맷

상용/오픈소스 HTTP 어플리케이션은 대부분 표준 로그 포맷을 한 개 이상 지원한다.

1. 일반 로그 포맷(Common Log Format)
2. 혼합 로그 포맷(Combined Log Format)
3. 넷스케이프 확장 로그 포맷
4. 넷스케이프 확장 2 로그 포맷
5. 스퀴드(Squid) 프락시 로그 포맷

### 일반 로그 포맷

#### 필드

| 필드            | 설명                         |
| ------------- | -------------------------- |
| remotehost    | 호스트명 또는 IP 주소              |
| username      | (ident 검색 수행시) 인증된 요청자의 이름 |
| auth-username | (인증시) 인증된 요청자의 이름          |
| timestamp     | 요청 날짜와 시간                  |
| request-line  | HTTP request 행             |
| response-code | 응답으로 보내는 HTTP 상태 코드        |
| response-size | 응답 엔터티의 Content-Length     |

### 혼합 로그 포맷

일반 로그 포맷에 두 가지 필드가 추가된 것. 아파치 등에서 지원.

#### 필드

| 필드         | 설명                           |
| ---------- | ---------------------------- |
| Referer    | Referer HTTP 헤더 값            |
| User-Agent | User-Agent Referer HTTP 헤더 값 |

### 스퀴드 프락시 로그 포맷

| 필드                 | 설명                                                                           |
| ------------------ | ---------------------------------------------------------------------------- |
| timestamp          | 요청이 도착한 시간                                                                   |
| time-elapsed       | 요청과 응답이 프락시를 통해 오고간 총 시간                                                     |
| host-ip            | 클라이언트의 호스트 IP                                                                |
| result-code/status | 요청에 대해 프락시가 어떤 일을 했는지 스퀴드 방식으로 기술(result) 및 프락시가 클라이언트에 보낸 HTTP 응답 코드 (code) |
| size               | 프락시가 클라이언트에게 보낸 HTTP 응답 헤더와 본문을 포함한 응답의 길이                                   |
| method             | 클라이언트 요청의 HTTP 메서드                                                           |
| url                | 클라이언트 요청의 URL                                                                |
| rfc931-ident       | 클라이언트에 인증된 사용자 이름                                                            |
| hierarchy/from     | 프락시가 클라이언트로 요청을 보내면서 거친 경로(hierarchy) 및 요청을 만들게 한 서버(from)                   |
| content-type       | 프락시 응답 엔터티의 Content-Type                                                     |

## 21.3 적중 계량하기

클라이언트와 서버 사이에 캐시가 있으면 많은 요청이 서버까지 오지 않고 캐시되어 있는 리소스로 처리되고 끝난다. 따라서 원 서버의 로그 파일에 누락이 발생된다.

#### 누락을 해결하는 방법

1. 원 서버가 의도적으로 페이지의 캐시를 파기한다. 콘텐츠에 대한 요청이 모두 원 서버로 가게 해서 모든 접근을 로깅한다.
2. 프락시 캐시의 로그에 접근한다.

### 적중 계량(Hit Metering)

캐시가 정기적으로 캐시 접근 통계를 원 서버에 보고하도록 하는 HTTP 확장이다. 널리 구현되어 있거나 사용되는 규약은 아니다. (2020년 현재 전혀 사용되지 않는다.) 캐시와 서버가 `meter` 헤더에 사용량, 사용 제한, 응답 횟수, timeout 등을 설정하여 사용량 정보를 주고받는다. 캐시는 리소스를 재검사할 때 서버에 적중 횟수를 보고한다.

### 개인 정보 보호

개발자와 관리자는 사용자의 HTTP 트랜잭션을 추적하고 있다는 것을 유념해야 한다. 웹 서버와 프락시는 최종 사용자의 개인 정보를 보호하는데 신경써야 한다. 트랜잭션을 감시하는 경우 관리자는 이 사실을 공지해야 한다. 로깅은 유용한 도구이지만, 로깅을 당하는 사용자들의 인지나 허가가 없으면 로깅은 사생활 침해가 된다.
