Spring에서 X-Forwarded-For 값을 가져오는 2가지 방법

결론부터 말하면 두가지 방법이 있다.

1. X-Forwarded-For헤더에 직접 접근하여 가져오는 방법

2. HttpServletRequest의 getAddr()이 클라이언트 IP를 전달하도록 스프링 설정을 하는 방법

 

API를 호출한 사용자의 IP를 얻기 위해서 HttpServletRequest의 getAddr() 함수를 사용한다. 그러나 API요청이 Forward Proxy에 의해 전달 될 경우 HttpServletRequest의 getAddr() 호출 시 Forward Proxy의 IP가 찍히게 된다.

 

이런 경우 X-Forwarded-For라는 HTTP 헤더를 통해 프록시 서버를 통해 요청을 전달 받더라도, 진짜 Client IP를 전달 받을 수 있다.

(proxy에서 X-Forwarded-For에 클라이언트 IP를 넣어주겠다는 설정이 있어야 한다. Nginx의 경우 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;)

X-Forwarded-For는 HTTP proxy등을 통해 웹 서버에 접속하는 클라이언트의 IP 주소를 식별하기 위한 표준헤더이다.
문법 : X-Forward-For: <client>, <proxy1>, <proxy2> 
- 여러 프록시들을 거칠 때 IP주소들이 차례대로 열거된다. 가장 오른쪽에 있는 IP가 마지막으로 거친 proxy의 IP 주소이다.

 

여기 까지 되면, X-Forward-For 헤더 값에 접근해서 클라이언트의 IP를 가져올 수 있다.

String ip = request.getHeader("x-forwarded-for");

 

그런데, 스프링 설정으로 HttpServletRequest의 getAddr()가 호출 되었을때, X-Forwarded-For값이 전달되도록 할 수 있다.

server.forward-headers-strategy=NATIVE

스프링에서 제공하는 ForwardedHeaderFilter를 사용하려면 server.forward-headers-strategy=FRAMEWORK 속성을 사용하면 된다.

 

'study' 카테고리의 다른 글

서킷브레이커  (0) 2022.04.13
Spring AOP - Transactional, Async  (0) 2022.03.25
[Java]LocalDateTime, OffsetDateTime, ZonedDateTime, Instant  (0) 2022.03.16
[Java]컬렉션(Collections) 정리  (0) 2021.12.02
[Spring]프로토타입과 스코프  (0) 2021.12.02

댓글



Designed by JB FACTORY