Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Django에서 POST 요청 시 클라이언트 IP 주소 얻는 방법

이 글에서는 Django로 POST 요청을 받을 때, 해당 요청이 어느 IP 주소에서 들어왔는지 확인하는 방법을 알아보겠습니다. 웹 서비스를 운영하다 보면 보안 관리를 위해 클라이언트의 IP를 추적해야 하는 경우가 종종 있습니다. 예를 들어 특정 IP를 차단하거나, 하나의 IP에서 과도한 요청이 발생하는지 모니터링해야 할 때가 그렇습니다. 다행히 서드파티 패키지를 활용하면 이 작업을 아주 간단하게 처리할 수 있습니다.

사전 준비

먼저 Django 프로젝트와 앱을 생성하고, urls 설정 등 기본적인 환경 구성을 마쳐야 합니다. 앱을 생성했다면 settings.py의 INSTALLED_APPS에 해당 앱을 반드시 추가하세요. 이번 예제에서는 Django 폼이나 모델은 사용하지 않습니다.

django-ipware 설치하기

클라이언트 IP를 손쉽게 가져오기 위해 django-ipware 패키지를 설치합니다.

pip install django-ipware

이 패키지는 별도의 설정 없이 바로 사용할 수 있다는 장점이 있습니다.

예제 코드 작성

템플릿 작성 (Templates → home.html)

Templates 디렉토리의 home.html 파일에 다음과 같이 POST 방식으로 데이터를 전송하는 간단한 폼을 만듭니다.

<!DOCTYPE html>
<html>
    <head>
        <title>tut</title>
    </head>
    <body>

        <form method="post" action='/'
enctype="multipart/form-data">
                <input type="text" id= "text"/>
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>

여기서는 IP 확인 테스트에 사용할 프론트엔드 폼만 간단히 구성했습니다.

urls.py 설정

앱의 urls.py 파일에 뷰를 연결하는 URL 패턴을 추가합니다.

from django.urls import path, include
from . import views
urlpatterns = [
    path('',views.home,name='home'),
]

위 코드는 루트 경로('/')로 들어오는 요청을 home 뷰로 라우팅합니다.

views.py 구현

이제 핵심인 views.py 파일입니다.

from django.shortcuts import render
from ipware import get_client_ip
def home(request):
    if request.method=="POST":
      # 여기서 IP를 가져옵니다
      client_ip, is_routable = get_client_ip(request)
      # client_ip가 실제 IP 주소입니다
print(client_ip, is_routable)
    return render(request,'home.html')

POST 요청이 들어오면 get_client_ip() 함수를 호출하여 요청이 어떤 IP에서 전송되었는지 확인합니다. 이 함수는 두 개의 값을 반환하는데, 첫 번째 값은 클라이언트의 IP 주소이고, 두 번째 값(is_routable)은 해당 IP가 공용 라우팅 가능한 주소인지 여부를 나타냅니다. 로컬 환경(localhost)에서 테스트하면 is_routable은 False가 반환됩니다.

실행 결과

localhost 환경에서 실행했을 때의 출력 결과는 다음과 같습니다.

[23/Aug/2021 13:34:55] "GET / HTTP/1.1" 200 9999
127.0.0.1 False
[23/Aug/2021 13:34:58] "POST / HTTP/1.1" 200 9999

출력 결과를 보면 GET 요청 후 폼을 제출할 때 POST 요청이 발생하고, 콘솔에 클라이언트 IP(127.0.0.1)와 라우팅 가능 여부(False)가 정상적으로 출력되는 것을 확인할 수 있습니다. 이처럼 django-ipware를 활용하면 프록시나 로드밸런서 뒤에 있는 서버 환경에서도 실제 클라이언트의 IP를 정확하게 식별할 수 있어, IP 기반 접근 제어나 요청 빈도 제한 같은 보안 기능을 구현할 때 매우 유용합니다.