안녕하세요. 이번 시간에는 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가 아닌 다른 결과가 나오게 됩니다. 이는, 유저가 올바르게 헤더 정보를 입력했다고 믿었기 때문입니다. 조심해야 할 부분입니다.
'네트워크' 카테고리의 다른 글
aes 암호화 알고리즘에서 ecb 모드는 왜 쓰면 안 되는지 실습해 봅시다. (0) | 2023.02.16 |
---|---|
pycryptodome 패키지로 대칭키 알고리즘을 간단하게 사용해 봅시다. (0) | 2023.02.14 |
처음 접해서 당황스러웠던 415 응답코드와 content-type (0) | 2021.09.23 |
http와 https가 어떤 차이가 있는지 간단하게 실습해 봅시다. (2) | 2021.08.18 |
path traversal 공격 : 사용자의 입력을 믿으면 어떻게 될까요? (2) | 2021.04.21 |
최근댓글