본문으로 건너뛰기
클라우드 6분 읽기

서버리스 함수 보안: 짧은 코드가 작은 공격 표면은 아니다

이벤트 트리거, 환경 변수, 실행 권한, 콜드스타트 로그를 중심으로 서버리스 보안 점검 기준을 제시한다. Serverless·Cloud Security·IAM 관점에서 구성 요소의 역할부터 적용 순서, 운영 확인 항목, 복구 기준까지 단계별로 설명한다.

김태영
에디터
2026년 6월 25일
서버리스 함수 보안: 짧은 코드가 작은 공격 표면은 아니다

핵심 요약

서버리스 함수의 공격 표면은 코드 줄 수가 아니라 이벤트 출처, 실행 역할, 비밀 전달, 의존성, 재시도와 외부 연결이 결정한다. 함수별 최소 권한, 트리거 인증, 원문 검증, 비밀 관리자 사용, 동시성·비용 한도, DLQ와 추적 로그를 함께 설계해야 한다.

서버리스 함수는 짧고 일회성처럼 보이기 때문에 “서버를 관리하지 않으니 공격 표면도 작다”는 오해를 만든다. 실제로는 HTTP 게이트웨이, 객체 저장소, 메시지 큐, 스케줄러, 데이터베이스 변경 스트림, SaaS 웹훅 등 여러 이벤트가 같은 함수에 도달한다.

함수는 다시 IAM 역할을 이용해 데이터베이스, 스토리지, 비밀 관리자, 외부 API에 접근한다. 코드가 50줄이어도 연결된 권한과 이벤트 경로는 거대한 서비스보다 넓을 수 있다.

서버리스 보안의 핵심은 함수 내부 코드만 보는 것이 아니라 트리거에서 부수 효과까지 전체 실행 그래프를 보는 데 있다.

공격 표면을 실행 그래프로 그린다

이벤트 생산자
  → API·큐·버킷·스케줄 트리거
  → 이벤트 변환과 재시도
  → 함수 코드·런타임·레이어
  → 실행 역할과 비밀
  → DB·스토리지·외부 API
  → 응답·후속 이벤트·로그

각 구간에서 다음을 기록한다.

  • 누가 이벤트를 만들 수 있는가
  • 이벤트가 인증되고 무결성이 검증되는가
  • 함수가 어떤 리소스와 작업에 접근할 수 있는가
  • 실패 시 몇 번, 얼마나 오래 재시도되는가
  • 중복 실행이 데이터와 비용에 어떤 영향을 주는가
  • 입력·비밀·출력이 어디에 기록되는가

OWASP Serverless Top 10OWASP Serverless FaaS Security Cheat Sheet는 이벤트 주입, 과도한 권한, 비밀 관리, 관측 가능성 같은 위험을 점검하는 기준으로 활용할 수 있다.

1. 이벤트 트리거는 모두 외부 입력이다

HTTP 요청만 입력으로 취급하면 큐 메시지, 파일 메타데이터, 객체 이름, 데이터베이스 레코드, 스케줄 매개변수에서 주입이 발생한다. 이벤트가 클라우드 내부에서 왔다는 사실은 신뢰 근거가 아니다. 공격자가 업로드 권한이나 메시지 발행 권한을 얻으면 내부 트리거를 통해 함수를 실행할 수 있다.

확인할 사항

  • HTTP 웹훅은 원문 body와 공급자 서명을 검증하는가
  • 큐와 이벤트 버스는 허용된 계정·주제·서비스만 발행 가능한가
  • 객체 키와 파일 내용이 경로, 명령, 템플릿에 직접 들어가지 않는가
  • 이벤트 변환 규칙이 보안 필드를 제거하거나 기본값으로 덮지 않는가
  • 스케줄 함수가 수동 호출될 때도 동일한 인증·권한 검사를 거치는가

웹훅은 서명·타임스탬프·재전송 방지를 함께 적용해야 한다. 서명만 맞고 오래된 이벤트를 무제한 재사용할 수 있으면 결제, 배송, 계정 변경 같은 부수 효과가 반복될 수 있다.

2. 실행 역할은 함수 단위로 줄인다

“서버리스 공용 역할” 하나에 여러 함수가 연결되면 가장 약한 함수가 전체 데이터에 접근하는 통로가 된다. 읽기 전용 썸네일 생성 함수가 데이터베이스 삭제 권한까지 가질 이유는 없다.

권한 정책에는 리소스와 작업뿐 아니라 가능한 조건을 넣는다.

  • 특정 버킷과 prefix만 읽기
  • 특정 큐에만 메시지 발행
  • 특정 비밀의 현재 버전만 조회
  • 요청 출처 VPC·서비스·계정 조건
  • 운영과 개발 계정 분리
  • 사람이 함수를 수동 실행하거나 역할을 가장하는 권한 제한

함수 코드 변경 권한과 실행 역할 변경 권한도 분리한다. 공격자가 코드를 바꿀 수 있고 역할이 강하면 배포 한 번으로 광범위한 자격증명을 사용할 수 있다.

3. 환경 변수는 비밀 저장소가 아니다

환경 변수는 배포 설정, 콘솔, 디버그 덤프, 오류 보고, IaC 상태 파일에 노출될 수 있다. 플랫폼이 저장 시 암호화하더라도 실행 중인 함수와 설정 조회 권한자는 값을 볼 수 있을 수 있다.

장기 API 키와 데이터베이스 비밀번호는 비밀 관리자에서 실행 시 가져오고, 함수 역할이 필요한 비밀 하나만 읽도록 제한한다. 가능하면 정적 키보다 워크로드 identity와 짧은 수명의 토큰을 사용한다. 키 회전은 새 값 발급, 양쪽 값의 짧은 중첩, 소비자 전환, 이전 값 폐기 순서로 연습해야 한다.

로그에는 전체 이벤트와 환경 변수를 그대로 출력하지 않는다. 토큰, 쿠키, 서명 헤더, 개인정보 필드를 구조적으로 마스킹한다.

4. 재시도와 중복 실행을 보안 문제로 본다

비동기 함수와 큐 소비자는 실패하면 자동 재시도된다. 처리 도중 외부 시스템에는 반영됐지만 함수가 성공 응답을 남기지 못하면 같은 이벤트가 다시 실행될 수 있다. 공격자는 의도적으로 타임아웃을 유도해 부수 효과와 비용을 반복시킬 수 있다.

다음 통제를 적용한다.

  • 이벤트 ID 또는 업무 키로 idempotency 저장소를 조회한다.
  • “처리 시작”이 아니라 최종 부수 효과와 원자적으로 완료 상태를 기록한다.
  • 최대 재시도 횟수와 최대 이벤트 수명을 설정한다.
  • 실패 메시지는 DLQ로 보내 원인과 민감정보를 통제한다.
  • 순서가 중요한 작업은 파티션 키와 버전 조건을 사용한다.
  • 재처리 도구는 운영 승인과 감사 로그를 요구한다.

5. 동시성과 비용 한도를 폭발 반경으로 사용한다

함수는 수요에 따라 빠르게 확장되므로 공격과 설정 오류가 곧 비용·하류 장애로 이어진다. 공개 엔드포인트에 rate limit이 없거나, 한 이벤트가 여러 함수를 연쇄 호출하면 재귀적 폭증이 발생할 수 있다.

함수별 예약 동시성, 큐 소비 속도, API 게이트웨이 제한, 테넌트별 할당량을 둔다. 하류 데이터베이스 연결 수와 외부 API 쿼터를 기준으로 상한을 정해야 한다. 비용 경보만으로는 늦을 수 있으므로 호출 수, 실행 시간, 오류, throttle, 큐 깊이를 함께 경보한다.

6. 런타임과 의존성을 배포 자산으로 관리한다

서버를 직접 관리하지 않아도 런타임 버전, 패키지, 컨테이너 이미지, 공유 레이어는 애플리케이션 책임이다. 더 이상 지원되지 않는 런타임과 오래된 레이어가 남지 않게 자산 목록을 만든다.

  • 함수 버전과 alias를 사용해 불변 배포 단위를 만든다.
  • 잠금 파일과 해시를 고정하고 빌드 산출물에 SBOM을 생성한다.
  • 공유 레이어의 소유자와 소비 함수를 추적한다.
  • 공급망 변경은 코드와 동일한 리뷰·서명 절차를 거친다.
  • 자동 런타임 업데이트가 호환성을 깨뜨릴 수 있으므로 카나리와 롤백을 준비한다.

컨테이너 기반 함수라면 이미지 서명 정책과 digest 고정을 적용한다.

7. 네트워크 경계를 명시한다

기본적으로 외부 인터넷에 나갈 수 있는 함수는 데이터 유출과 공급망 공격의 경로가 된다. 필요한 외부 도메인과 포트를 정의하고 프록시·egress 방화벽·프라이빗 엔드포인트를 사용한다. VPC 연결 자체가 안전을 보장하지는 않는다. 라우팅, NAT, 보안 그룹, DNS, 프라이빗 서비스 접근을 함께 검토해야 한다.

함수의 공용 URL이 별도로 생성되는 플랫폼에서는 API 게이트웨이를 우회하는 직접 주소가 없는지 확인한다. 인증과 WAF가 게이트웨이에만 있고 함수 URL은 열려 있으면 보호 계층을 건너뛸 수 있다.

자주 발생하는 실패 모드

실패 모드실제 결과예방책
모든 함수를 하나의 관리자 역할로 실행한 함수 취약점이 계정 전체 침해로 확대함수별 최소 권한과 환경 분리
전체 이벤트를 로그에 출력토큰·개인정보·결제 데이터가 로그로 유출구조화 로그와 필드 마스킹
재시도 무제한중복 결제·메일 폭주·비용 급증idempotency, 재시도·수명 제한, DLQ
공용 URL과 게이트웨이 동시 노출WAF·인증 우회직접 URL 비활성화 또는 동일 인증 강제
환경 변수에 장기 키 저장설정 조회·덤프를 통한 키 유출비밀 관리자와 짧은 수명 identity
공유 레이어 자동 변경다수 함수에 동시에 악성·깨진 코드 배포버전 고정, 서명, 소비자 목록
관측 지표가 함수 오류율뿐권한 탐색과 비용 남용을 늦게 발견IAM·트리거·비용·큐 지표 통합

탐지 신호

  • 평소 없던 이벤트 source, 계정, 주제, 버킷에서의 호출
  • 함수 URL·API 경로별 401, 403, 서명 실패, 비정상 user agent
  • IAM AccessDenied 급증 또는 새 리소스 접근 시도
  • 비밀 관리자 조회량과 평소와 다른 비밀 접근
  • 호출 수·실행 시간·메모리·동시성·비용의 급격한 변화
  • 재시도 횟수, DLQ 유입, 이벤트 나이, 큐 적체 증가
  • 외부 목적지 DNS·IP·도메인 변화와 대량 egress
  • 함수 코드·레이어·환경 변수·실행 역할 변경
  • 일부 버전만 오류율이 높거나 이전 alias로 되돌아간 사건

로그마다 요청·이벤트 추적 ID, 함수 버전, alias, 호출 주체, 테넌트, 결과 상태를 남긴다. 민감한 원문은 최소화하고 보존 기간과 접근 권한을 분리한다.

배포 전 체크리스트

  • 모든 트리거와 이벤트 생산자가 자산 목록에 있다.
  • HTTP·웹훅·큐·버킷 이벤트의 인증과 무결성을 검증한다.
  • 함수별 실행 역할이 필요한 작업과 리소스로 제한돼 있다.
  • 코드 배포 권한과 IAM 변경 권한이 분리돼 있다.
  • 장기 비밀은 환경 변수·코드·레이어에 포함되지 않는다.
  • 중복 실행을 견디는 idempotency 설계가 있다.
  • 재시도, 이벤트 수명, 동시성, 호출 비용 상한이 있다.
  • DLQ 접근과 재처리 절차가 승인·감사 대상이다.
  • 런타임·패키지·레이어 버전과 소유자를 추적한다.
  • 공용 함수 URL과 게이트웨이 우회 경로를 점검했다.
  • 외부 egress 목적지를 제한하거나 최소한 관찰한다.
  • 카나리 alias와 자동 중단·롤백 조건을 시험했다.

공개 함수는 API rate limit과 남용 방어를 함께 적용하고, 외부 도메인과 인증서 의존성은 인증서 수명주기 자동화로 관리하는 편이 좋다. CDN 또는 API 게이트웨이 뒤에 배치했다면 원본 직접 노출 점검도 같은 배포 검수에 포함한다.

최종 판단

서버리스는 서버 운영의 일부를 플랫폼에 맡길 뿐, 신뢰 경계를 없애지 않는다. 이벤트 출처, 실행 역할, 비밀, 재시도, 동시성, 의존성, 네트워크가 함수의 실제 공격 표면을 만든다. 함수마다 이 경계를 작게 나누고, 중복·실패·비용 폭증을 정상 운영 시나리오로 가정할 때 짧은 코드가 큰 사고로 번지는 것을 막을 수 있다.

참고 기준

전체 댓글 0

댓글을 불러오는 중입니다...
새로고침

공유하기

관련 기사