안녕하세요. 이번 시간에는 X-FORWARDED-FOR 헤더에 대해서 간단하게 알아봅시다.

 


 저는 root address에 접근했을 때, index 함수가 실행되게 해 놓았는데요. HTTP_X_FORWARDED_FOR라는 정보가 있는 경우에, 6 ~ 7번째 줄을 수행하고, 그렇지 않으면 REMOTE_ADDR을 얻어옵니다. django의 문서에 따르면 이것은 client의 ip 주소입니다. 요래 거쳐온 경우를 생각해 봅시다.

 

 

 client에서 보낸 요청이 1을 거쳐서 서버로 들어갔다 해 보겠습니다. 장고 서버 입장에서 보았을 때에는 클라이언트가 client로 표시된 것이 아닙니다. 단지, 1을 거쳐서 갔기 때문에, 1이 되는데요. 이 때 remote_addr은 1의 ip가 찍힐 겁니다. 실제 client의 ip를 볼 수 없을 텐데요.

 

 보다 유용한 client의 ip 정보를 얻기 위해 사용하는 것이 X-FORWARDED-FOR 헤더라고 할 수 있어요. syntax에 따르면

 

 

 client가 서버에 요청했다고 해 보겠습니다. 1로 타고 갈 때, client ip가 헤더에 넘겨지게 됩니다.

 

 

 그리고 1에서 다시 django server로 넘어갈 때, client ip와 1의 ip가 넘어가는 식입니다. <client>, <proxy1>, ... 의 형식으로 넘어옵니다. 여기서 중요한 것은 , 앞에 있는 가장 좌측에 있는 것이 실제 client의 ip라는 점입니다. 실제 요청을 보낸, client의 정보를 얻어오기 위해서 유용하게 쓰일법한 헤더입니다. 그래서, 이것만 얻어온다면 무난하게 해결할 수 있을 것 같습니다.

 


 제 로컬에서 django server를 켜 놓고, postman으로 요청을 보내겠습니다. 아무런 헤더도 넘기지 않은 경우, 127.0.0.1을 돌려줍니다.

 

 request.META에 'HTTP_X_FORWARDED_FOR'가 없었습니다. 그러므로, 'REMOTE_ADDR'이 있는지 없는지를 검사합니다.

 

 

 그런데, 'REMOTE_ADDR'이라는 key 값이 있습니다. 고로, 'REMOTE_ADDR' 이라는 값을 돌려줍니다.

 

 문제는, X-Forwarded-For 정보를 헤더에 보낸 경우입니다.

 

 

 이 때에는 header에 1.2.3.4라는 정보가 들어갔습니다. HTTP_X_FORWARDED_FOR 정보가 있으면 그 값을 client의 ip로 취하는데요. 문제는 이 값이 변조되었다는 것입니다.

 

 

 그래서 제 실제 ip가 아닌 다른 결과가 나오게 됩니다. 이는, 유저가 올바르게 헤더 정보를 입력했다고 믿었기 때문입니다. 조심해야 할 부분입니다.