Django 포스팅
Doyeon0430 | 2023년 05월 20일
이번시간에는 Django에서 클라이언트 IP를 가져오는 법을 설명하겠습니다.
장고에서 IP를 가져올 때 REMOTE_ADDR와 x_forwarded_for라는 2가지 방법이 사용 할 겁니다.
물론 django-ipware를 통해 가져올 수 있지만 패키지를 설치해야하는 번거로움이 있기때문에
위의 2가지 방법을 통해 손쉽게 IP를 가져오겠습니다.
일반적으로 클라이언트가 웹 서버에 접속할 때 프록시 서버나 로드 밸런서를 거쳐서 오게 됩니다.
그러다보니 IP를 서버를 잡을지 클라이언트를 잡을지 혼동이 생깁니다.
가장 기본적으로 제공하는 REMOTE_ADDR가 혼동을 가지고 있습니다.
1. view.py
def detail(request, mywork_id):
detail = get_object_or_404(Mywork, pk=mywork_id)
context = {'client_ip': client_ip}
return render(request, 'mywork/detail.html',context)
이 방법을 통해 간단하게 ip주소를 가져와봤습니다.
2. 로컬 클라이언트 ip 가져오기
3. 서버를 통한 클라이언트 ip 가져오기
위와 같이 서버를 통과하면 클라이언트의 IP가 안나오는 걸 볼 수 있습니다.
이 문제를 해결하기 위해 x_forwarded_for를 사용합니다.
Django에서 X-Forwarded-For(XFF) 헤더를 사용해 클라이언트의 IP를 가져오는 방법입니다.
1. view.py
def detail(request, mywork_id):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip_list = x_forwarded_for.split(',')
client_ip = ip_list[0].strip()
else:
client_ip = request.META.get('REMOTE_ADDR')
context = { 'client_ip': client_ip,}
return render(request, 'mywork/detail.html',context)
위의 코드를 살펴보면 x_forwarded_for가 해더 값을 가져오게 됩니다.
그리고 if문을 통해 서버에 해더값이 있으면 해더값을 저장합니다.
[클라이언트 IP → 서버 IP → 서버 IP] 이런식으로 값이 입력됩니다.
여기서 첫 번째 IP주소가 클라이언트 주소이기 때문에 strip을 0으로 지정했습니다.
만약 헤더값이 추출안되면 REMOTE_ADDR를 사용하도록 설정합니다.
서버 IP가 아닌 자신의 주소가 등록된 걸 볼 수 있습니다.
이걸 이용해 홈페이지에서도 IP를 가져올 수 있습니다.
글을 마치며 클라이언트 IP를 가져오는 방법을 알아봤습니다.
댓글 (0)
간편 댓글 작성