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 Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스입니다. 단순성과 가독성을 갖춘 Python은 Lambda 함수 내에서 이 작업을 처리하기 위한 탁월한 선택입니다.
AWS Lambda 함수: 들어오는 요청을 처리하는 핵심 기능입니다.
애플리케이션 로드 밸런서(ALB): 요청을 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 헤더 설명
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3