>  기사  >  백엔드 개발  >  AWS Lambda에서 Application Load Balancer(ALB)를 사용할 때 실제 클라이언트 IP 가져오기

AWS Lambda에서 Application Load Balancer(ALB)를 사용할 때 실제 클라이언트 IP 가져오기

王林
王林원래의
2024-07-21 04:25:19681검색

Getting the Actual Client IP When Using Application Load Balancer (ALB) in AWS Lambda

저는 AWS를 처음 접했을 때 전자 서명의 일부로 클라이언트의 IP가 필요한 문서에 디지털 서명하는 작업을 수행하면서 흥미로운 문제에 직면했습니다. 처음에는 구현이 완벽하게 작동하는 것처럼 보였을 때 매우 기뻤습니다. 그러나 나의 흥분은 오래 가지 못했습니다. 테스트하는 동안 다른 컴퓨터에서 애플리케이션에 액세스하더라도 동일한 IP 주소가 반환되는 것을 확인했습니다. 그때 제가 받은 IP 주소가 실제 클라이언트 IP가 아니라 로드밸런서의 IP라는 것을 깨달았습니다.

이 발견은 나를 조사와 배움의 길로 이끌었습니다. 무슨 일이 일어나고 있는지, 실제 클라이언트 IP를 검색하는 방법을 이해하기 위해 더 깊이 파고들어야 했습니다. 이 블로그에서는 제 경험을 공유하고 AWS Lambda 및 Python을 사용하여 이를 달성하는 방법에 대한 포괄적인 가이드를 제공하여 ALB(Application Load Balancer)를 사용할 때 클라이언트의 IP 주소를 정확하게 캡처할 수 있도록 하겠습니다.

과제 이해

클라이언트가 ALB를 통해 애플리케이션에 요청하면 로드 밸런서가 중개자 역할을 합니다. 결과적으로 애플리케이션에 표시되는 IP 주소는 클라이언트의 IP 주소가 아닌 ALB의 IP 주소입니다. 이 문제를 해결하기 위해 ALB는 X-Forwarded-For HTTP 헤더에 클라이언트의 IP를 포함합니다. 요청이 여러 프록시를 통과한 경우 이 헤더에 여러 IP 주소가 포함될 수 있습니다.

우리가 처리해야 할 사항은 다음과 같습니다.

  • 클라이언트 IP 추출: X-Forwarded-For 헤더를 검색하고 구문 분석합니다.

  • 여러 IP 처리: 여러 프록시가 관련된 경우에도 올바른 클라이언트 IP를 얻도록 보장하세요.

보안 고려 사항

X-Forwarded-For 헤더는 잠재적인 보안 위험 때문에 주의해서 사용해야 합니다. 항목은 네트워크 내에서 적절하게 보안이 유지되는 시스템에 의해 추가된 경우에만 신뢰할 수 있는 것으로 간주될 수 있습니다. 이렇게 하면 클라이언트 IP가 변조되지 않고 신뢰할 수 있게 됩니다.

올바른 도구 선택

AWS 람다와 Python

AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스입니다. 단순성과 가독성을 갖춘 Python은 Lambda 함수 내에서 이 작업을 처리하기 위한 탁월한 선택입니다.

주요 구성 요소

  1. AWS Lambda 함수: 들어오는 요청을 처리하는 핵심 함수

  2. Application Load Balancer(ALB): 요청을 Lambda 함수로 전달하는 로드 밸런서

구현 세부정보

ALB를 사용하여 AWS Lambda 설정

먼저 Lambda 함수가 설정되어 ALB와 통합되었는지 확인하세요. 필요한 경우 AWS의 공식 가이드인 Application Load Balancer의 대상으로 Lambda 함수 사용을 따르세요.

람다 함수 코드

Lambda 함수에 대한 Python 코드를 살펴보겠습니다. 이 기능은 X-Forwarded-For 헤더에서 클라이언트의 IP 주소를 추출합니다.

import json

def lambda_handler(event, context):
    # Extract the 'X-Forwarded-For' header
    x_forwarded_for = event['headers'].get('x-forwarded-for')

    if x_forwarded_for:
        # The first IP in the list is the client's IP
        client_ip = x_forwarded_for.split(',')[0]
    else:
        # Fallback if header is not present
        client_ip = event['requestContext']['identity']['sourceIp']

    # Log the client IP
    print(f"Client IP: {client_ip}")

    # Respond with the client IP
    return {
        'statusCode': 200,
        'body': json.dumps({'client_ip': client_ip})
    }

설명

  • 헤더 추출: 들어오는 요청에서 X-Forwarded-For 헤더를 검색합니다.

  • 헤더 구문 분석: 클라이언트의 원래 IP를 나타내는 첫 번째 IP를 가져옵니다.

  • 폴백 메커니즘: 헤더가 없는 경우 요청 컨텍스트의 소스 IP를 사용합니다.

  • 로깅 및 응답: 확인을 위해 클라이언트의 IP를 기록하고 반환합니다.

요청 및 응답 예시

요청:

{
    "headers": {
        "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178"
    },
    "requestContext": {
        "identity": {
            "sourceIp": "70.41.3.18"
        }
    }
}

응답:

{
    "client_ip": "203.0.113.195"
}

결론

ALB 뒤의 AWS Lambda 함수에서 실제 클라이언트 IP를 식별하려면 X-Forwarded-For 헤더를 주의 깊게 처리해야 합니다. 이 접근 방식은 정확한 IP 로깅을 보장하고 사용자 상호 작용을 개인화하고 보호하는 애플리케이션의 기능을 향상시킵니다.

참조

  • AWS ALB 설명서:

  • AWS Lambda의 Python:

  • HTTP 헤더 설명

위 내용은 AWS Lambda에서 Application Load Balancer(ALB)를 사용할 때 실제 클라이언트 IP 가져오기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.