HTTP 프로토콜의 X-Forwarded-For 헤더 이해하기
웹서버에 접근하는 X-Forwarded-For란?
X-Forwarded-For(XFF)는 HTTP 헤더로 클라이언트가 프록시나 로드 밸런서를 거쳐 웹 서버에 접속할 때 원래 클라이언트의 IP 주소를 식별하기 위해 사용 됩니다.
로그밸런스도 프록시서버의 변형된 형태가 있기 때문에 쉽게 프록시 서버라고 생각을 하면 쉽습니다.
일반적으로 웹 서버는 직접 연결된 IP만 볼 수 있는데 프록시 뒤에 있으면 프록시 서버의 IP만 보이게 되는데 이런 경우 XFF 헤더가 실제 사용자 IP를 전달하는 역할을 합니다.
▷ 헤더 형식
X-Forwarded-For: 클라이언트IP 프록시1 프록시2 ...
여러 프록시를 거치면 쉼표로 구분되어 순서대로 기록되기 때문에 가장 왼쪽이 원본 클라이언트 IP입니다.
PHP에서 클라이언트 IP 가져오기
▷ 보안 주의사항
XFF 헤더를 맹신하면 안되는것으 리퍼러처럼 변경이 임의로 가능하기 때문에 그렇습니다. user-agent도 그렇듯이 HTTP의 헤더는 다 변경이 가능 합니다.
- IP 스푸핑: 공격자가 헤더를 조작해 차단을 우회하거나 다른 사용자로 위장
- 로그 오염: 잘못된 IP가 로그에 기록됨
- 접근 제어 우회: IP 기반 인증을 무력화
따라서 IP 기반 보안(rate limiting 접근 제어 등)에는 반드시 신뢰할 수 있는 프록시 목록을 설정하고 가능하면 다른 인증 방식과 병행하는 것이 좋기는 한데 불특정 다수에게 서비스 하는 경우 막을 수는 없습니다. 하지만 사설IP로 보인다 해도 상관없이 그렇게 들어오는 경우 어플리케이션 레벨에서 차단 하면 됩니다.
조작이든 아니든 관계없이 특정 문자이면 막아 버리면 그만 입니다. 즉, 당장 막는데는 문제가 없다!!
