로깅
로깅에 대해 학습하고 기록한 글입니다.
이전 글에서 nginx 로그를 남기때 프록시 처리된 IP가 기록되는 상황을 해결하기 위해 http_x_forwarded_for 헤더 정보를 참고해야 한다는 점을 알게 되었습니다.
http_x_forwarded_for 헤더
해당 헤더는 커스텀 헤더로 사실상 표준으로 자리잡은 헤더 입니다. 프록시나 로드밸런서를 통해 접속하는 클라이언트의 원 IP를 식별하기 위한 헤더입니다. 이는 반드시 지켜야 한다거나, 해당 헤더가 무조건 존재한다는 보장이 없기 때문에 우선 Cloud flare 공식문서를 찾아 보았습니다.
https://developers.cloudflare.com/fundamentals/reference/http-request-headers/
Cloudflare HTTP request headers · Cloudflare Fundamentals docs
Cloudflare passes all HTTP request headers to your origin web server and adds additional headers as specified below.
developers.cloudflare.com
링크에서는 Cloud flare 에서 사용하는 헤더를 목록을 나열하고 설명하고 있습니다. 스크롤을 조금 내리다보면 제가 원하던 헤더도 존재한다는 것을 알 수 있습니다.
이제 해당 헤더를 조회하면 원 IP를 얻을 수 있다는 것을 알게되었습니다.
그럼 이제 nginx에서 로그를 남길 때 해당 헤더 값을 조회해서 IP를 기록하는 필드를 해당 값으로 치환하면 될 것 같습니다.
아래처럼 로그 포멧에 http_x_forwarded_for 헤더를 추가해주면 됩니다
log_format custom '$http_x_forwarded_for - - "$request" '
단 해당 헤더는 여러단계의 프록시를 거치거나 유저가 임의로 헤더를 설정하면 여러개의 IP가 기록됩니다.
예를들어 A -> B -> C 형태로 프록시 처리되고 Cloudflare 에서 해당 요청을 받게되면 A,B,C의 IP가 모두 기록되어있는 형태가 됩니다.
그래서 Cloud flare 에서는 해당 헤더 이외에도 CF-Connecting-IP 라는 커스텀 헤더를 사용합니다.
마찬가지로 $http_cf_connecting_ip 형태로 받아오면 됩니다.
CF-Connecting-IP
해당 커스텀 헤더는 요청자의 원본 아이피를 보장하는 헤더입니다.
프록시를 몇단계를 거치던 하나의 원본 아이피를 기록 하는 헤더입니다.
이외에도 기타 부수적인 정보를 얻을 수 있는 표준 헤더들을 Cloud flare 에서 제공하고 있습니다.
https://developers.cloudflare.com/ruleset-engine/rules-language/fields/#field-ip-src-city
Fields reference · Cloudflare Ruleset Engine docs
The Cloudflare Rules language supports a range of field types:
developers.cloudflare.com
쿠키, 레퍼, 리전 등 로그에 남기면 좋을만한 헤더들을 다양하게 지원하고 있습니다.