[장고] 사용자 IP 확인하기

소요 시간: 3분

사용자 IP 주소는 웹 개발에서 매우 중요한 정보입니다. 이를 통해 중복 조회 방지, 사용자 위치 파악, 언어 설정 및 디바이스 판별 등 다양한 목적으로 활용할 수 있습니다. 이번 글에서는 장고(Django)에서 사용자 IP 주소를 어떻게 읽을 수 있는지 알아보겠습니다.


IP 주소란 무엇인가?

IP 주소는 인터넷에 연결된 각 장치에 부여되는 고유한 주소입니다. 크게 두 가지 종류가 있습니다: 클라이언트 IP와 중간 서버 IP입니다. 클라이언트가 직접 서버에 연결되는 경우 클라이언트 IP를 확인할 수 있지만, 프록시 서버나 로드 밸런서를 통해 연결되는 경우 중간 서버 IP를 확인하게 됩니다.

왜 중간 서버를 거쳐 요청할까?

보안: 클라이언트 IP 주소를 알면 클라이언트에 접근할 수 있는 가능성이 생깁니다. 이를 통해 데이터 유출 등의 위험을 방지할 수 있습니다.

캐시: 프록시 서버는 요청된 페이지를 저장해 두었다가, 같은 페이지 요청이 있을 때 빠르게 제공할 수 있습니다. 이는 인터넷 속도를 향상시키는 중요한 역할을 합니다.


사용자 IP 주소 가져오기

장고에서는 HttpRequest.META 속성을 통해 HTTP 헤더에 접근할 수 있습니다. 이를 통해 사용자 IP 주소를 읽어 올 수 있습니다. 예를 들어, 프로젝트의 루트 폴더에 views.py 파일을 생성하여 사용자 IP 주소를 가져오는 함수를 작성할 수 있습니다.

X-Forwarded-For 헤더를 통한 IP 주소 확인

클라이언트의 IP 주소를 읽기 위해서는 X-Forwarded-For 헤더에 접근해야 합니다. 이 헤더는 클라이언트와 중간 서버들의 IP 주소를 담고 있습니다.

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

X-Forwarded-For 헤더는 중간 서버들이 순차적으로 추가되며, 가장 첫 번째 값이 최초 클라이언트의 IP 주소입니다. 이 헤더는 민감한 개인정보를 포함할 수 있으므로 유출되지 않도록 주의해야 합니다.

REMOTE_ADDR을 통한 IP 주소 확인

장고 공식 문서에서는 REMOTE_ADDR 값을 사용하는 것을 권장합니다. 이는 프록시 서버를 사용하지 않는 경우에 유용합니다.

def get_client_ip(request):
    ip = request.META.get('REMOTE_ADDR')
    return ip

이 방법은 코드가 간단하지만, 프록시 서버를 사용하는 경우 정확한 클라이언트 IP를 얻지 못할 수 있습니다. 또한, Nginx와 같은 리버스 프록시 서버를 사용하는 경우 REMOTE_ADDR 값이 비어 있을 수도 있습니다.


결론

사용자 IP 주소는 웹 개발에서 매우 중요한 정보로, 다양한 목적으로 활용될 수 있습니다. 장고에서는 HttpRequest.META 속성을 통해 IP 주소를 쉽게 얻을 수 있으며, 보안과 정확성을 고려하여 적절한 방법을 선택해야 합니다.

장고에서 사용자 IP 주소를 확인하고 활용하는 방법에 대해 알아보았습니다. 웹 애플리케이션의 보안과 성능을 고려하여 적절한 방법을 선택하고, 민감한 정보의 유출에 주의하시기 바랍니다.

장고 리스트