AWS Lambda에서 Lambda Function URL을 통한 요청 검증 방법
2024-12-08 18:37:26AWS Lambda Function URL을 활용한 요청 검증 소개
AWS Lambda는 서버리스 컴퓨팅 패러다임에서 핵심적인 역할을 하는 서비스로, 이벤트 기반으로 코드를 실행할 수 있는 무한한 가능성을 제공합니다. 그 가운데 Lambda Function URL은 AWS Lambda 함수에 대한 직접적인 HTTP 액세스를 허용하는 기능으로, API Gateway 같은 중간 서비스를 필요로 하지 않고 직접적으로 함수를 호출할 수 있는 간편한 방법을 제공합니다.
Lambda Function URL의 필요성
Lambda Function URL을 사용할 경우, 다음과 같은 이점을 얻을 수 있습니다:
- 단순성: API Gateway 없이 간단한 HTTP 엔드포인트 설정 가능.
- 비용 절감: API Gateway 사용 시 발생하는 추가 비용 없이 Lambda의 표준 요금만으로 운영.
- 빠른 배포: 프로토타이핑 또는 데모의 신속한 배포 가능.
- 네이티브 HTTPS 지원: 추가 설정 없이 안전한 통신 가능.
- 인증 제어: IAM 기반 인증 지원 또는 공개 설정 가능.
Lambda Function URL이 적합한 사용 사례
Lambda Function URL은 다양한 시나리오에서 유용하게 사용할 수 있습니다. 즉:
- 마이크로서비스와 웹훅: HTTP 요청에 응답하는 마이크로서비스를 쉽게 생성.
- 프로토타이핑 및 데모: API Gateway 설정 없이 백엔드를 신속히 노출.
- 자동화 및 내부 도구: 직원이 간단한 URL로 접속할 수 있는 내부 도구 생성.
- 정적 웹사이트 백엔드: Amazon S3 또는 CloudFront에 호스트된 정적 웹사이트와 결합하여 동적 기능 제공.
- IoT 통합: IoT 장치가 직접 HTTP 엔드포인트를 통해 서버리스 함수를 트리거.
AWS Lambda에서 요청 검증 수행 방법
Lambda Function URL을 사용할 때의 요청 검증은 중요합니다. API Gateway와 달리 Lambda Function URL로 들어오는 요청은 별도의 모델과 요청 유효성 검사기가 필요 없습니다. 그 대신, 요청 검증을 직접 구현해야 합니다. 요청 검증은 데이터의 올바름과 형식을 확인하며, 악의적인 입력으로부터 시스템을 보호할 수 있습니다.
요청 모델 정의
처음에 해야 할 일은 요청 데이터의 모델을 정의하는 것입니다. 예를 들어 이름, 이메일, 선택적 전화번호를 포함하는 데이터를 받으려 한다고 가정합니다. 이 경우, Joi 라이브러리를 통해 모델을 정의할 수 있습니다.
const Joi = require('joi');
const eventModel = Joi.object({
name: Joi.string().required(),
email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }),
mobileNumber: Joi.string().optional()
});
이벤트 데이터 검증
모델을 만든 후에는 이벤트 데이터가 모델에 적합한지 검증해야 합니다. 이 과정에서 발생하는 오류를 명확히 처리할 수 있도록 합니다.
const validateEventData = async (data) => {
try {
const value = await eventModel.validateAsync(data);
return value;
} catch (error) {
throw new Error(error.message || error);
}
}
검증 로직을 핸들러에 통합
최종적으로, 요청 검증 로직을 Lambda 핸들러에 통합하여 유효하지 않은 요청을 적절히 처리합니다.
module.exports.handler = async (event, context) => {
try {
const body = validateEventData(event.body);
return { statusCode: "200", body };
} catch (err) {
return {
statusCode: 400,
body: { message: 'Invalid request body', error: err.message || err },
};
}
}
오류의 예
유효하지 않은 데이터 예시로 name 필드를 생략한 경우를 생각해봅시다:
{
"email": "value3@gmail.com",
"mobileNumber": "234567890"
}
이는 다음과 같은 오류 메시지를 생성합니다:
{
"statusCode": 400,
"body": { "message": "Invalid request body", "error": "\"name\" is required" }
}
결론
AWS Lambda를 사용하여 서버리스 어플리케이션을 구축할 때, 강력한 요청 검증을 구현하는 것은 매우 중요합니다. SQL 인젝션 및 스크립트 인젝션과 같은 잠재적인 취약점으로부터 애플리케이션을 보호하기 위해서는 신뢰할 수 있는 검증 메커니즘이 필요합니다. Joi를 이용하여 명확한 검증 스키마를 정의함으로써 데이터 무결성을 강화하고, 입력값이 요구 사항을 충족하지 않을 경우 사용자에게 명확한 오류 메시지를 제공할 수 있습니다.
마지막으로, 입력 검증은 종합적인 보안 전략의 한 부분일 뿐입니다. 적절한 오류 로깅, 입력 정리와 AWS Cognito 같은 인증 메커니즘과 함께 구현하면 애플리케이션의 보안이 더욱 강화됩니다. 오늘부터 입력 검증을 구현하여 AWS Lambda 엔드포인트를 보호하고 사용자들에게 더 안전한 경험을 제공하세요.