AWS 05-2 비밀·인증서·방어막 — KMS·Secrets Manager·ACM·Private CA·WAF·Shield
고친 사람 github-actions[bot]
DB 비밀번호 20개를 AWS 에 맡기는 길은 둘입니다. 하나(Secrets Manager)는 비밀 하나에 월 $0.40 을 받고, 다른 하나(Systems Manager 의 Parameter Store)는 저장에 0원입니다. 둘 다 암호화해서 보관하고, 앱은 둘 다 API 한 번으로 값을 꺼냅니다. 그래도 비싼 쪽을 고를 이유가 있습니다. 돈을 더 내고 사는 것은 비밀번호를 정해진 주기마다 알아서 바꿔 주는 일입니다.
이 편은 질문 셋을 차례로 답합니다. 비밀을 어디에 두나(KMS·Secrets Manager), 인증서를 누가 발급하고 갱신하나(ACM·Private CA), 밖에서 오는 공격을 누가 막나(WAF·Shield). 요금과 한도는 전부 2026-09-24 서울(ap-northeast-2) 기준이고, 리전을 안 적은 값은 출처가 리전을 밝히지 않은 것입니다.
지도
웹 요청 하나가 ALB 를 지나 앱과 DB 에 닿기까지 이 편의 여섯 서비스가 어디에 끼는지부터 봅니다. ALB(Application Load Balancer)는 HTTP 요청을 여러 서버에 나눠 주는 AWS 의 로드 밸런서이고 04-2편(밖에서 들어오는 길)에서 봅니다.
flowchart TD
U["사용자 요청"] --> SH["Shield<br/>대량 공격을 흡수"]
SH --> W["WAF<br/>요청을 규칙으로 거름"]
W --> A["ALB<br/>ACM 인증서로 HTTPS"]
A --> APP["앱"]
APP --> SM["Secrets Manager<br/>DB 비밀번호"]
SM --> K["KMS<br/>비밀을 푸는 키"]
APP --> DB["DB"]
APP --> IN["사내 서비스<br/>Private CA 인증서"]
Shield 와 WAF 는 요청이 지나가는 길목에 서고, ACM 인증서는 ALB 에 붙습니다. Secrets Manager·KMS 는 앱이 필요할 때 불러 쓰는 서비스이고, Private CA 는 앱이 사내 서비스와 주고받는 연결의 인증서를 냅니다. 본문은 그림의 아래쪽부터 거꾸로 올라갑니다. 모든 비밀의 밑바닥에 KMS 의 키가 있기 때문입니다.
1. KMS — 키는 맡기고 암호화를 부탁한다
데이터를 암호화하면 이번에는 그 키를 어디에 둘지가 문제가 됩니다. 키를 같은 서버 디스크에 두면 서버를 턴 사람이 키도 가져갑니다. KMS(Key Management Service)는 키를 AWS 안에 두고 밖으로 내보내지 않는 쪽을 택합니다. 키는 HSM(하드웨어 보안 모듈, 키를 평문으로 꺼낼 수 없게 만든 전용 장비) 안에 있고, 이 장비는 미국 정부의 암호 모듈 보안 표준 FIPS 140-3 에서 보안 수준 3 인증을 받았습니다. 앱은 키를 받지 않고 「이것을 암호화해 달라」는 API 를 부릅니다(AWS KMS cryptography essentials).
큰 데이터는 봉투에 넣는다
그런데 암호화 API Encrypt 는 한 번에 4,096바이트까지만 받습니다(Encrypt). 1 GB 파일을 KMS 로 보낼 수는 없습니다. 그래서 쓰는 방식이 봉투 암호화(envelope encryption)입니다. 데이터는 데이터 키(그 데이터 하나만 암호화하는 일회용 키)로 암호화하고, 데이터 키는 KMS 키로 한 번 더 암호화합니다.
봉투 암호화 순서
1. GenerateDataKey 호출 → 데이터 키 두 벌
(평문 한 벌 + KMS 키로 암호화한 한 벌)
2. 평문 데이터 키로 파일을 내 서버에서 암호화
3. 평문 데이터 키는 메모리에서 지운다
4. 암호화한 데이터 키를 암호문 옆에 저장
복호화
5. 데이터 키를 KMS 로 풀어 받고, 그 키로 파일을 푼다
암호화한 데이터 키는 KMS 없이는 쓸모가 없어서 데이터 옆에 둬도 안전합니다(GenerateDataKey). 큰 데이터는 KMS 를 거치지 않고, KMS 와는 데이터 키만 오갑니다. 2절의 Secrets Manager 도 비밀 하나하나를 이 순서로 저장합니다.
키는 세 종류, 누가 정책을 쥐나로 갈린다
KMS 키는 누가 만들고 누가 다루나에 따라 셋으로 나뉩니다. 고객 관리형 키는 내가 만들고 권한·교체(키 재료를 새것으로 바꾸기)·삭제를 전부 정하는 키입니다. AWS 관리형 키는 서비스가 내 계정에 만들어 대신 쓰는 키로, aws/ebs·aws/ssm 같은 이름이 붙고 나는 보기만 합니다. AWS 소유 키는 AWS 서비스 쪽 계정에 있어서 내 계정에는 보이지도 않습니다. AWS 관리형 키는 2021년부터 새 서비스에는 더 만들지 않고, 새 서비스는 기본 암호화에 AWS 소유 키를 씁니다(AWS KMS keys). 셋을 가르는 것은 권한과 기록입니다. 권한은 키 정책(key policy)이 쥡니다. 키 정책은 키 하나에 꼭 하나씩 붙는 리소스 정책으로, 누가 그 키를 어떻게 쓸 수 있는지 적습니다. 기록은 CloudTrail(AWS API 호출을 남기는 서비스, 06편 관측·운영에서 봅니다)에 남습니다.
| 고객 관리형 키 | AWS 관리형 키 | AWS 소유 키 | |
|---|---|---|---|
| 키 정책 | 내가 정한다 | 서비스가 정하고 나는 본다 | 서비스만 본다 |
| 사용 기록 | CloudTrail 에 남는다 | CloudTrail 에 남는다 | 못 본다 |
| 교체 | 켜고 끄는 것을 내가 정한다 | 매년 자동, 못 바꾼다 | 서비스마다 다르다 |
| 요금 | 키 월 요금 + 요청 요금 | 월 요금 없음. 요청 요금은 붙을 수 있다(서비스가 대신 내는 경우가 있다) | 없음 |
키 정책은 IAM 정책보다 앞섭니다. IAM 정책이 아무리 허용해도 키 정책이 IAM 정책을 쓰도록 열어 두지 않으면 효과가 없고, 기본 키 정책은 그렇게 열어 둡니다. 키 정책은 리전마다 따로입니다(Key policies in AWS KMS). IAM 은 05-1편(누가 무엇을 할 수 있나)에서 봅니다. 다른 계정과 암호화한 데이터를 나누려면 고객 관리형 키가 필요합니다. AWS 관리형 키로 암호화한 리소스는 다른 계정과 못 나누고, 고객 관리형 키는 키 정책에 상대 계정을 적고 상대 계정의 IAM 정책이 그 권한을 넘겨받아야 합니다(Allowing users in other accounts to use a KMS key). 요금은 키를 두는 값과 요청 값으로 나뉩니다. 요청 단가는 키 종류에 따라 다릅니다. 대칭 키는 암호화와 복호화에 같은 키를 쓰는 방식으로 봉투 암호화가 쓰는 쪽이고, 비대칭 키는 공개 키·개인 키 쌍으로 서명 등에 쓰는 방식이며, 데이터 키 쌍 요청은 KMS 밖에서 쓸 비대칭 키 쌍을 만들어 받는 요청입니다.
KMS · 서울 · 2026-09-24
고객 관리형 키 키 하나 월 $1 (시간 단위 일할)
자동·수동 교체 첫·두 번째 교체마다 월 $1 추가
세 번째부터는 추가 없음
대칭 키 요청 1만 건당 $0.03
비대칭 키 요청 1만 건당 $0.15 (RSA 2048 은 $0.03)
무료 한도 모든 리전 합쳐 월 2만 건
AWS 관리형·소유 키 만들고 두는 값 없음
비대칭 키 요청과 데이터 키 쌍 생성 요청은 무료 한도에 안 들어갑니다(AWS KMS Pricing). 키를 지우는 일은 되돌릴 수 없습니다. 삭제를 예약하면 7~30일(기본 30일)을 기다린 뒤 지우고, 지워진 키로 암호화한 데이터는 다시 풀 수 없습니다(Delete an AWS KMS key). 고객 관리형 키는 권한과 기록을 쥐는 대신 키 월 요금과, 잃으면 데이터도 잃는 책임을 같이 집니다.
| 이럴 때 맞다 | 이럴 때 안 맞다 | 대신 치르는 것 |
|---|---|---|
| 키 권한을 직접 정하고 사용 기록을 감사해야 할 때 | 규제·감사 요구 없이 기본 암호화면 될 때(→ 서비스 기본 키) | 키 하나 월 $1, 교체를 켜면 첫 두 번 교체마다 월 $1 추가 |
| 암호화한 데이터를 다른 계정과 나눠야 할 때 | 한 계정 안에서만 쓸 때(→ AWS 관리형 키로 충분) | 키 정책과 상대 계정 IAM 정책을 둘 다 관리한다 |
| 키를 끄거나 지워 그 키의 데이터를 한꺼번에 못 읽게 해야 할 때 | 키를 잘못 지울 위험을 관리할 사람이 없을 때 | 키를 지우면 그 키로 암호화한 데이터는 영영 못 푼다 |
감사·계정 간 공유 요구가 없다면 서비스 기본 키(AWS 소유 또는 AWS 관리형)로 두고, 키 정책을 직접 짜야 할 이유가 생길 때 고객 관리형 키로 옮깁니다.
2. Secrets Manager — 비밀번호를 맡기고 바꾸는 일까지
DB 비밀번호를 환경 변수나 설정 파일에 두면 서버 이미지·저장소·로그 어딘가에 남기 쉽습니다. Secrets Manager 는 비밀번호·API 키 같은 값을 비밀(secret)이라는 단위로 보관합니다. 비밀 하나에는 JSON 으로 사용자 이름·비밀번호·호스트를 한데 담을 수 있습니다. 앱은 IAM 권한으로 GetSecretValue 를 불러 값을 받습니다. 값은 1절의 봉투 암호화로 저장되고, 꺼낼 때마다 Secrets Manager 가 KMS Decrypt 를 부릅니다. 키는 기본값인 AWS 관리형 키 aws/secretsmanager 나 고객 관리형 키 가운데 고릅니다(Secret encryption and decryption in AWS Secrets Manager). 보관만이면 다른 선택지도 있습니다. Secrets Manager 가 따로 받는 몫은 교체(rotation)입니다. 교체는 비밀에 든 값과 DB 쪽 실제 비밀번호를 같이 새것으로 바꾸는 일입니다. 방식은 둘입니다. 관리형 교체는 그 서비스가 교체를 알아서 설정하고 돌리는 방식으로, RDS·Aurora 에서는 마스터 사용자 비밀번호를 Secrets Manager 에 맡길 때 됩니다. Lambda 가 필요 없습니다(Managed rotation for AWS Secrets Manager secrets). 앱 전용 DB 계정이나 외부 API 키 같은 나머지 비밀은 Lambda 함수로 교체합니다. Secrets Manager 가 정한 일정마다 같은 함수를 네 단계(create_secret → set_secret → test_secret → finish_secret)로 불러, 새 값을 만들고 DB 에 반영하고 접속을 시험한 뒤 새 값을 현재 버전으로 올립니다(Rotation by Lambda function). 이 함수는 내가 짜고, DB 에 닿는 네트워크에 둬야 합니다. Lambda 는 Lambda 편(01-3)에서 봤습니다. 일정은 짧게는 4시간마다, 길게는 999일마다로 정합니다(Rotation schedules). 요금은 비밀 개수와 API 호출 수로 받고, 교체 자체에는 값을 안 매깁니다(AWS Secrets Manager pricing).
Secrets Manager · 서울 · 2026-09-24
비밀 하나 월 $0.40 (시간 단위 일할)
API 호출 1만 건당 $0.05
교체로 생기는 새 버전 요금 없음
+ Lambda 교체라면 Lambda 요금
비교 대상 — Parameter Store
Parameter Store 는 설정값을 이름표 붙여 보관하는 Systems Manager 의 한 기능입니다(Systems Manager 는 06편). 값 형식 가운데 SecureString 을 고르면 KMS 로 암호화해 두고, 키를 따로 안 고르면 AWS 관리형 키 aws/ssm 을 씁니다. 꺼낼 때 WithDecryption 을 주면 Parameter Store 가 KMS Decrypt 를 대신 부릅니다(How AWS Systems Manager Parameter Store uses AWS KMS). 등급은 표준과 고급 둘입니다.
Parameter Store · 서울 · 2026-09-24
표준 계정·리전당 1만 개, 값 4 KB 저장 요금 없음
고급 10만 개, 값 8 KB 하나 월 $0.05
API 표준 + 기본 처리량이면 없음
고급이거나 처리량을 올리면 1만 건당 $0.05
한도와 요금 출처는 Choosing parameter tiers in Parameter Store 와 AWS Systems Manager Pricing 입니다. 짧고 자주 읽는 값은 Parameter Store 에, 여러 값을 묶었거나 4 KB 를 넘거나 자동 교체가 이득인 비밀은 Secrets Manager 에 맞습니다(WKLD.03 Use ephemeral secrets or a secrets-management service).
비밀 20개를 한 달 두면
두 서비스를 같은 일에 대 봅니다. DB 비밀번호·외부 API 키 20개를 두고, 컨테이너들이 뜰 때와 캐시가 식을 때 꺼내 한 달에 10만 번 읽는다고 칩니다. Parameter Store 쪽은 표준 등급 SecureString, 기본 처리량입니다. 두 서비스 모두 읽을 때마다 KMS Decrypt 를 부르므로 KMS 줄은 읽는 횟수가 같으면 양쪽에 같게 붙습니다.
비밀 20개 · 월 10만 번 읽기 · 서울 · 한 달
Secrets Manager
저장 20 × $0.40 = $8.00
API 10만 ÷ 1만 × $0.05 = $0.50
합계 = $8.50
Parameter Store 표준 (저장·API) = $0
KMS (양쪽 각각)
기본 키 aws/secretsmanager·aws/ssm 추가 요금 없음
고객 관리형 키 월 $1 + (10만 − 2만) ÷ 1만 × $0.03
= $1 + $0.24
기본 키의 추가 요금 없음은 WKLD.03 기준입니다. $0.24 는 계정의 KMS 무료 한도 2만 건을 이 일에 다 쓴다고 친 값이라 가장 적게 나올 때입니다. 무료 한도를 다른 곳에서 다 썼으면 $0.30 까지 오릅니다.
두 서비스의 한 달 차이는 $8.50 입니다. 이 값으로 사는 것은 자동 교체, Parameter Store 표준의 4 KB(고급이면 8 KB)를 넘는 값, 다른 계정과 비밀 나누기입니다. 비밀번호를 사람이 가끔 바꿔도 되는 곳이면 Parameter Store 로 충분하고, 비밀번호가 새더라도 다음 교체까지만 유효해야 하는 곳이면 $8.50 이 싼 보험입니다. 다만 교체가 공짜로 따라오는 것은 RDS·Aurora 마스터 사용자 비밀번호뿐이고, 앱 전용 계정의 비밀번호를 바꾸려면 교체 Lambda 함수를 직접 짜야 합니다. 결국 첫 행은 관리형 교체가 되는 비밀입니다.
| 이럴 때 맞다 | 이럴 때 안 맞다 | 대신 치르는 것 |
|---|---|---|
| RDS·Aurora 마스터 사용자 비밀번호를 자동으로 바꿀 때(관리형 교체) | 바꿀 일이 드문 설정값·작은 비밀(→ Parameter Store 표준, 0원) | 비밀 하나 월 $0.40 |
| 앱 전용 DB 계정·외부 API 키를 주기마다 바꿔야 할 때(Lambda 교체) | 교체 함수를 짜고 운영할 사람이 없을 때 | 네 단계 교체 함수를 짜고 DB 에 닿는 네트워크에 둬야 한다 |
| 여러 값을 묶었거나 Parameter Store 한도(4 KB, 고급 8 KB)를 넘는 비밀 | 짧은 값 하나를 요청마다 새로 읽을 때 | API 1만 건당 $0.05, 캐시를 안 두면 호출이 불어난다 |
교체가 필요 없고 값이 Parameter Store 한도 안이면 Parameter Store 표준으로 시작하고, 교체 요구가 생긴 비밀만 Secrets Manager 로 옮깁니다. 앱 코드는 Parameter Store API 로 이름 앞에 /aws/reference/secretsmanager/ 를 붙여 Secrets Manager 비밀도 꺼낼 수 있어서, 읽는 코드는 한쪽 API 로 맞춰 둘 수 있습니다(Referencing AWS Secrets Manager secrets from Parameter Store parameters).
3. ACM — 공개 인증서는 공짜, 대신 붙일 곳이 정해져 있다
HTTPS 는 HTTP 를 TLS 로 암호화한 것이고, TLS 연결을 열려면 서버가 인증 기관(CA)이 서명한 X.509 인증서를 내밀어야 합니다. 인증서는 유효 기간이 정해져 있어서 갱신을 잊으면 브라우저가 경고를 띄웁니다. ACM(AWS Certificate Manager)은 AWS 가 운영하는 공개 CA(Amazon Trust Services)에서 인증서를 받아 주고 갱신까지 맡습니다. 인증서는 도메인 소유만 확인하는 DV(도메인 검증) 인증서이고, 확인은 DNS 레코드나 메일로 합니다. 유효 기간은 198일입니다(AWS Certificate Manager public certificate characteristics and limitations). 자동 갱신은 DNS 로 검증했고, 서비스에 붙어 있거나 내보낸 인증서에 됩니다. 메일로 검증했으면 만료가 다가올 때 알림 메일만 오고, 밖에서 가져와 넣은(import) 인증서는 자동 갱신 대상이 아닙니다(Managed certificate renewal). DNS 검증용 CNAME 레코드는 계속 남겨 둬야 갱신됩니다(AWS Certificate Manager DNS validation).
통합 서비스에 붙이는 공개 인증서는 0원입니다. 대신 그 인증서의 개인 키를 꺼낼 수 없어서, ACM 이 직접 붙여 주는 서비스에만 씁니다. 로드 밸런서(ELB), CloudFront, API Gateway(API 앞에 세우는 관문 서비스) 사용자 지정 도메인, Elastic Beanstalk(로드 밸런서를 통해), App Runner, Amplify, Cognito 가 여기 듭니다. CloudFront 에 붙일 인증서는 버지니아 북부(us-east-1)에서 발급하거나 가져와야 합니다(Managed automation with integrated services). CloudFront 는 AWS 의 CDN 이고 04-2편에서 봅니다. 이 서비스들은 TLS 를 종료합니다. 암호화된 연결을 그 서비스에서 풀고 앱에는 따로 정한 방식으로 넘긴다는 뜻이라, 뒤 구간을 따로 암호화하지 않으면 로드 밸런서에서 앱까지는 평문 HTTP 입니다.
EC2 인스턴스 안의 웹 서버가 직접 HTTPS 를 받는다면 이 무료 인증서를 못 넣습니다. 통합 서비스 밖에서 ACM 인증서를 쓰는 길은 돈을 내는 두 가지입니다. 내보내기 가능한 공개 인증서는 인증서와 개인 키를 파일로 꺼내 어느 서버에나 설치하는 방식입니다. 유효 기간 198일에 만료 45일 전 ACM 이 갱신하지만, 새 인증서를 서버에 다시 까는 일은 내 몫입니다(AWS Certificate Manager exportable public certificates). ACME 인증서는 ACM 이 운영하는 ACME 서버에서 받는 유료 인증서입니다. ACME 는 인증서 발급·갱신을 자동화하는 표준 프로토콜이고, 서버에 도는 ACME 클라이언트(Certbot·cert-manager 같은 프로그램)가 발급부터 만료 전 갱신·설치까지 합니다. 유효 기간은 45일입니다(ACME certificate automation).
두 유료 인증서는 발급할 때와 갱신할 때마다 값을 받고, ACME 구간은 한 달 발급량으로 셉니다(AWS Certificate Manager Pricing).
ACM · 2026-09-24 (리전 구분 없는 공시가)
통합 서비스용 공개 인증서 요금 없음
내보내기 가능 일반 도메인 $7 · 와일드카드 $79
ACME 일반 도메인 첫 1,000개 $1 · 다음 3,000개 $0.50
그 뒤 $0.25 · 와일드카드 첫 500개 $5 · 그 뒤 $2.50
API 호출 월 1만 건(내보내기)·3만 건(ACME) 무료
그 뒤 1만 건당 $0.50
도메인 하나를 EC2 에 1년 붙인다고 셈하면 둘이 갈립니다. ACME 는 45일짜리라 만료 직전에만 갱신해도 1년에 9번(365 ÷ 45 = 8.1, 올림) 발급해 최소 $9 이고, 클라이언트가 더 일찍 갱신하면 그만큼 늘어납니다. 내보내기 가능 인증서는 153일(198 − 45)마다 갱신해 1년에 발급 1번 + 갱신 2번 = $21 입니다. ACME 가 싸고 설치까지 클라이언트가 하므로 EC2 한 대라면 ACME 를 고르고, 내보내기 가능 인증서는 ACME 클라이언트를 못 돌리는 장비에 씁니다. 무료 인증서의 대가는 개인 키를 못 꺼낸다는 것 하나이고, 그래서 판정은 TLS 를 어디서 종료하느냐에서 시작합니다.
| 이럴 때 맞다 | 이럴 때 안 맞다 | 대신 치르는 것 |
|---|---|---|
| ALB·CloudFront·API Gateway 에서 TLS 를 종료할 때 | EC2 안의 웹 서버가 직접 HTTPS 를 받을 때(→ ACME $9부터·내보내기 $21, 1년) | 통합 서비스에만 붙고, 뒤 구간 암호화는 따로 챙긴다 |
| DNS 검증을 걸어 갱신을 ACM 에 맡길 때 | DNS 레코드를 못 고쳐 메일로만 검증할 때(알림 메일만 온다) | 검증용 CNAME 레코드를 계속 남겨 둬야 한다 |
| 도메인 소유 확인(DV)이면 되는 웹 서비스 | 도메인뿐 아니라 회사가 실제로 있는지까지 CA 가 확인한 인증서(OV·EV)가 필요할 때 | DV 인증서만 발급한다 |
로드 밸런서나 CloudFront 를 앞에 둘 계획이 없고 서버 한 대로 끝낼 거라면, 서버에서 ACME 클라이언트를 돌려 ACM 의 유료 ACME 인증서를 받는 쪽이 설치까지 자동이라 단순합니다.
4. Private CA — 사내용 인증 기관을 빌린다
사내 서비스끼리 TLS 로 통신하거나, 클라이언트도 인증서를 내밀어 서로 확인하는 mTLS(상호 TLS)를 쓰려면 인증서가 서비스 수만큼 필요합니다. 이 인증서는 브라우저가 믿어 줄 필요가 없고 우리 회사 서비스끼리만 믿으면 됩니다. 그래서 공개 CA 대신 내가 운영하는 사설 CA 를 세워 직접 발급합니다. 사설 CA 를 직접 운영하면 루트 키를 지키는 일이 가장 무겁습니다. AWS Private CA 는 그 CA 를 AWS 가 대신 운영하는 서비스이고, 나는 CA 를 만들어 인증서를 발급받기만 합니다. 발급받는 길은 둘입니다. ACM 에서 인증서를 요청하면서 내 Private CA 를 고르면, ACM 이 사설 인증서를 받아 ALB 등에 붙이거나 내보낼 수 있게 해 주고 갱신까지 맡습니다. Private CA 의 IssueCertificate API 로 바로 받으면 갱신은 내 몫입니다(Managed certificate renewal). CA 는 두 모드 가운데 고릅니다. 범용 모드는 유효 기간 제약 없이 인증서를 발급하는 CA 입니다. 짧은 수명 인증서 모드는 유효 기간 7일까지의 인증서만 발급하는 대신 CA 월 요금이 낮습니다. 수명이 짧을수록 키가 새도 피해 기간이 줄어듭니다. 요금은 CA 월 요금과 인증서 장당 요금으로 받습니다(AWS Private CA Pricing).
Private CA · 서울 · 2026-09-24
범용 모드 CA 월 $400
인증서 장당 첫 1,000장 $0.75 · 1만 장까지 $0.35
그 뒤 $0.001
짧은 수명 모드 CA 월 $50 · 인증서(7일 이하) 장당 $0.058
OCSP(켤 때만) 응답한 인증서 하나 월 $0.06
+ 조회 10만 건당 $0.20
무료 체험 리전마다 첫 CA 는 30일 CA 요금 없음
CA 월 요금은 만든 날과 지운 날 기준으로 일할하고, 지운 CA 에는 요금이 없습니다. OCSP 는 인증서가 폐기됐는지 실시간으로 묻는 프로토콜입니다. 규모로 셈하면 모드가 갈립니다. 서비스 100개에 인증서를 매주 새로 주면 한 달 약 430장이라 짧은 수명 모드는 $50 + 430 × $0.058 ≈ 월 $75 이고, 범용 모드는 인증서 값과 상관없이 CA 만으로 월 $400 입니다. 재발급 자동화가 있으면 짧은 수명 모드가 CA 값만 8분의 1이고, 서비스가 몇 개뿐이면 어느 모드든 CA 월 요금이 인증서 값보다 큽니다.
| 이럴 때 맞다 | 이럴 때 안 맞다 | 대신 치르는 것 |
|---|---|---|
| 사내 서비스 수백 개에 인증서를 돌리고 유효 기간을 자유롭게 정할 때(범용 모드) | 서비스가 몇 개뿐일 때 | CA 하나 월 $400 + 장당 $0.75부터 |
| 인증서를 7일 안쪽으로 자주 바꾸는 자동화가 있을 때(짧은 수명 모드) | 재발급 자동화가 없을 때 | CA 월 $50 + 장당 $0.058, 7일마다 재발급 |
| 사내 클라이언트끼리만 믿으면 될 때 | 브라우저·외부 고객이 믿어야 할 때(→ ACM 공개 인증서) | 사설 CA 인증서를 쓰는 쪽마다 그 CA 를 믿도록 설정해야 한다 |
서비스 몇 개만 서로 확인하면 되는 규모라면 CA 를 세우기 전에 네트워크 격리와 IAM 인증으로 막을 수 없는지부터 봅니다.
5. WAF — 들어오는 요청을 규칙으로 거른다
인증서까지 붙였으면 이제 문 앞에 누가 오는지 볼 차례입니다. SQL 인젝션을 담은 요청, 한 IP 에서 초당 수백 번 들어오는 로그인 시도는 앱까지 오기 전에 걸러내는 편이 쌉니다. WAF(Web Application Firewall)는 HTTP 요청의 IP·헤더·쿼리 문자열·본문을 보고 통과시키거나, HTTP 403 이나 정해 둔 응답으로 막는 웹 방화벽입니다. 규칙을 담는 그릇이 웹 ACL 입니다(새 콘솔에서는 보호 팩이라고도 부릅니다). 웹 ACL 에 규칙(rule)을 넣고, 규칙 여러 개를 묶은 규칙 그룹도 넣습니다. 직접 짜기 어려운 규칙은 AWS 가 만들어 두고 고쳐 가는 관리형 규칙 그룹을 씁니다. 흔한 웹 취약점을 막는 핵심 규칙 세트(Core rule set), 알려진 나쁜 입력, SQL 데이터베이스, 악성 IP 평판 목록 같은 것이 있습니다(AWS Managed Rules rule groups list). 속도 제한은 속도 기반 규칙(rate-based rule)이 맡습니다. IP 같은 기준으로 요청을 묶어 세다가 정한 수를 넘으면 막습니다(Using rate-based rule statements in AWS WAF). 규칙은 복잡할수록 WCU(웹 ACL 용량 단위)를 더 먹고, 웹 ACL 하나에 1,500 WCU 까지가 기본 요금 안입니다.
웹 ACL 은 CloudFront·ALB·API Gateway REST API 등에 붙고, API Gateway HTTP API 와 NLB(Network Load Balancer)에는 안 붙습니다(AWS WAF). 옛 버전인 WAF Classic 은 2026-10-07 에 지원이 끝나므로 지금 버전 AWS WAF 로 만듭니다(Services in Sunset).
요금은 웹 ACL·규칙 개수와 요청 수로 받고, 봇 차단 같은 기능은 따로 붙습니다(AWS WAF Pricing).
WAF · 서울 · 2026-09-24
웹 ACL 하나 월 $5 (시간 단위 일할)
규칙·규칙 그룹 하나 월 $1
(관리형 규칙 그룹도 하나에 $1)
요청 100만 건당 $0.60
1,500 WCU 초과 500 WCU 마다 100만 건당 $0.20
본문 검사 확장 16 KB 마다 100만 건당 $0.30
Bot Control 월 $11 (구독 $10 + 규칙 그룹 $1)
월 1,000만 건 넘으면 100만 건당 $1
``` 본문 검사 확장은 기본 16 KB 를 검사하는 CloudFront·API Gateway·Cognito 등에만 해당하고, ALB·AppSync 는 본문 앞 8 KB 만 검사하며 늘릴 수 없습니다([Oversize web request components in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-oversize-request-components.html)).
기본 구성 하나를 셈해 봅니다. ALB 앞에 웹 ACL 하나, 관리형 규칙 그룹 셋(핵심 규칙 세트·알려진 나쁜 입력·IP 평판 목록), IP 당 속도 기반 규칙 하나를 두고 한 달 1,000만 건을 받으면 $5 + 4 × $1 + 10 × $0.60 = **월 $15** 입니다. 세 그룹과 속도 규칙의 WCU 는 700 + 200 + 25 + 2 = 927 로 1,500 안이라 추가 요금이 없습니다([Baseline rule groups](https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-baseline.html) · [IP reputation rule groups](https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-ip-rep.html)). 봇 차단(Bot Control)을 더하면 월 $11 이 붙습니다.
규칙을 촘촘히 걸수록 정상 요청도 걸릴 수 있어서, 바꾼 규칙은 운영 트래픽에 걸기 전에 시험하고 조정해야 합니다([Testing and tuning your AWS WAF protections](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing.html)). 월 $15 로 HTTP 요청을 앱 앞에서 거르는 대신, 붙는 곳이 HTTP 입구로 정해져 있고 오탐을 살필 사람이 필요합니다.
| 이럴 때 맞다 | 이럴 때 안 맞다 | 대신 치르는 것 |
|---|---|---|
| [[SQL 인젝션]]·알려진 취약점 요청을 ALB·CloudFront 앞에서 거를 때 | HTTP 가 아닌 트래픽이거나 NLB·HTTP API 앞일 때(→ 붙지 않는다) | 기본 구성 월 $15, 요청이 늘면 100만 건당 $0.60 |
| 로그인·API 에 IP 당 속도 제한을 걸 때 | 요청 내용을 앱 로직으로 알아야 가를 수 있는 부정 사용 | 속도 기반 규칙도 규칙 하나 월 $1 |
| 관리형 규칙 그룹으로 규칙 작성을 맡길 때 | 오탐을 시험·조정할 사람이 없을 때 | 정상 요청이 막히지 않는지 계속 살펴야 한다 |
HTTP 가 아닌 트래픽을 걸러야 하면 VPC 경계에서 패킷을 보는 Network Firewall(04-1편)로 갑니다.
## 6. Shield — DDoS 를 막는 두 단계
**DDoS**(분산 서비스 거부 공격)는 수많은 기기에서 한꺼번에 트래픽을 쏟아 서비스를 멈추게 하는 공격입니다. 네트워크 계층에서 [[UDP]] 패킷이나 연결 요청을 쏟는 공격이 흔하고, 멀쩡해 보이는 HTTP 요청을 대량으로 보내는 애플리케이션 계층 공격도 있습니다. **Shield Standard** 는 모든 AWS 고객에게 추가 요금 없이 자동으로 켜져 있습니다. 네트워크·전송 계층의 흔한 DDoS 를 막고, Route 53(AWS 의 DNS 서비스) 호스팅 영역·CloudFront 배포·Global Accelerator(고정 IP 로 받은 트래픽을 AWS 망으로 실어 나르는 서비스) 표준 가속기 앞에서 가장 넓게 막습니다([AWS Shield Standard overview](https://docs.aws.amazon.com/waf/latest/developerguide/ddos-standard-summary.html)). 설정할 것이 없으니 모든 서비스가 이미 쓰고 있고, 할 수 있는 일은 공격을 받을 입구를 CloudFront 처럼 AWS 네트워크 바깥쪽 끝에서 받는 서비스로 모으는 설계입니다.
**Shield Advanced** 는 돈을 내고 붙이는 윗단계입니다. 보호할 리소스를 직접 지정해야 하고, CloudFront, Route 53 호스팅 영역, Global Accelerator, EC2 탄력적 IP(그 IP 에 딸린 EC2·NLB 포함), ALB, Classic Load Balancer 를 지정할 수 있습니다([List of AWS resources that AWS Shield Advanced protects](https://docs.aws.amazon.com/waf/latest/developerguide/ddos-advanced-summary-protected-resources.html)). 받는 것은 넷입니다. 애플리케이션 계층 공격을 감지하면 WAF 규칙을 자동으로 거는 **자동 완화**, 공격 중에 부를 수 있는 **SRT**(Shield Response Team, AWS 의 DDoS 대응 팀), 공격 때문에 불어난 요금을 서비스 크레딧으로 돌려주는 **비용 보호**, 그리고 보호 대상 리소스의 **WAF 기본 요금 면제**입니다. SRT 를 부르려면 Business 이상 지원 플랜에 따로 가입해 있어야 합니다([AWS Shield Advanced capabilities and options](https://docs.aws.amazon.com/waf/latest/developerguide/ddos-advanced-summary-capabilities.html)).
Advanced 요금은 구독료가 거의 전부이고, 전송량에 따로 붙는 값이 있습니다([AWS Shield Pricing](https://aws.amazon.com/shield/pricing/)).
```text
Shield · 2026-09-24
Standard 추가 요금 없음
Advanced 월 $3,000, 1년 약정
(Organizations 조직 전체에 한 번)
Advanced 전송량 CloudFront GB 당 $0.025
ELB·EC2 GB 당 $0.05 (서울 첫 100 TB)
보호 리소스의 WAF 기본 요금 면제, 월 500억 건까지
면제는 1,500 WCU 와 기본 본문 크기 안의 기본 요금에만 해당하고, Bot Control·CAPTCHA 등은 따로 냅니다(AWS Shield Advanced overview). Advanced 는 한 달 $3,000 을 1년 내내 냅니다. 5절의 WAF 기본 구성(월 $15)을 200개 돌릴 값이라, 멈췄을 때 잃는 돈이 이보다 클 때만 셈이 맞습니다.
| 이럴 때 맞다 | 이럴 때 안 맞다 | 대신 치르는 것 |
|---|---|---|
| DDoS 로 멈추면 손실이 월 $3,000 을 크게 넘는 서비스 | 잠깐 멈춰도 되는 작은 서비스(→ Standard + WAF 속도 기반 규칙) | 월 $3,000 · 1년 약정 |
| 공격 중에 AWS 대응 팀을 불러야 할 때 | Business 이상 지원 플랜이 없을 때 | 지원 플랜 요금이 따로 든다 |
| 공격으로 불어난 요금을 돌려받아야 할 때 | 요금 급증을 감당할 수 있을 때 | 현금이 아니라 서비스 크레딧으로 받는다 |
Advanced 까지 갈 규모가 아니면 CloudFront 를 앞에 세우고 WAF 속도 기반 규칙을 거는 것으로 Standard 가 안 막는 애플리케이션 계층 공격을 먼저 막습니다.
이럴 땐 무엇
| 상황 | 서비스 | 이유 |
|---|---|---|
| S3·EBS 를 기본 암호화만 해 두면 된다 | 서비스 기본 키(S3 는 S3 관리 키, EBS 는 기본 암호화를 켜면 aws/ebs) |
둘 다 키 월 요금 없음 |
| 키 권한을 직접 짜고 사용 기록을 감사해야 한다 | KMS 고객 관리형 키 | 키 정책과 CloudTrail 기록, 키 하나 월 $1 |
| RDS·Aurora 마스터 사용자 비밀번호를 자동으로 바꾼다 | Secrets Manager 관리형 교체 | 교체 함수가 필요 없다, 비밀 20개에 월 $8.50 |
| 앱 전용 DB 계정 비밀번호를 주기마다 바꾼다 | Secrets Manager + 교체 Lambda 함수 | 교체 함수는 직접 짠다 |
| 바꿀 일이 드문 설정값과 작은 비밀 | Parameter Store 표준 SecureString | 저장·기본 API 0원 |
| ALB·CloudFront 에 HTTPS 를 붙인다 | ACM 공개 인증서 | 발급·갱신 0원 |
| EC2 한 대의 웹 서버에 HTTPS 를 붙인다 | ACM ACME 인증서 | 1년 $9부터, 설치까지 클라이언트가 한다 |
| 사내 서비스끼리 mTLS 를 건다 | Private CA | 재발급 자동화가 있으면 짧은 수명 모드 월 $50부터 |
| 로그인에 IP 당 속도 제한, SQL 인젝션 차단 | WAF + 관리형 규칙 그룹 | 기본 구성 월 $15 |
| DDoS 로 멈추면 손실이 큰 서비스 | Shield Advanced | 대응 팀·비용 보호, 월 $3,000 · 1년 약정 |
S3 기본값은 Default encryption FAQ, EBS 기본 키는 Enable Amazon EBS encryption by default 기준입니다. 자주 붙는 서비스는 IAM(키·비밀 접근 권한), CloudTrail(KMS·Secrets Manager 사용 기록), Lambda(비밀 교체), CloudFront·ALB·API Gateway(인증서와 WAF 가 붙는 입구), Route 53(DNS 검증), CloudWatch(WAF 지표·로그)입니다. 여러 서비스를 엮어 끝까지 따라가는 설명은 조합 편(이 시리즈 20번대)에서 합니다.
한 장 요약
KMS 는 키를 HSM 밖으로 안 내보내고, 큰 데이터는 데이터 키로 암호화한 뒤 그 키만 KMS 로 싸는 봉투 암호화로 다룹니다. 비밀 20개를 두는 값은 Secrets Manager 월 $8.50, Parameter Store 표준 0원이고, 그 차이로 사는 자동 교체는 RDS·Aurora 마스터 비밀번호가 아니면 교체 함수를 직접 짜야 합니다. ACM 공개 인증서는 ALB·CloudFront·API Gateway 에 붙이면 0원이고, EC2 안에 넣으려면 ACME 인증서로 1년 $9부터 냅니다. 사내 mTLS 인증서는 Private CA 가 내고, 재발급 자동화가 있으면 짧은 수명 모드로 CA 값이 월 $50 까지 내려갑니다. WAF 는 기본 구성 월 $15 로 HTTP 요청을 거르고, Shield Standard 는 공짜로 늘 켜져 있으며 Advanced 는 월 $3,000 에 1년 약정입니다.
관련 항목
비밀과 키를 맡는 같은 갈래
AWS KMS · AWS Secrets Manager · Parameter Store · AWS Systems Manager · AWS CloudHSM
KMS 를 이루는 개념
봉투 암호화 · 데이터 키 · HSM · FIPS 140-3 · 키 정책 · 고객 관리형 키 · AWS 관리형 키 · AWS 소유 키 · 키 교체 · 대칭 키 암호 · 비대칭 키 암호 · AES-GCM
Secrets Manager 교체를 이루는 것
비밀 교체 · 관리형 교체 · AWS Lambda · Amazon RDS · Amazon Aurora · SecureString · API 키 · 환경 변수
인증서를 발급하고 믿게 하는 체계와 지키는 연결
인증서 · X.509 · 인증 기관 · 공개 키 기반 구조 · AWS Certificate Manager · AWS Private CA · Amazon Trust Services · 도메인 검증 인증서 · 와일드카드 인증서 · ACME · 인증서 폐기 · OCSP · TLS · HTTPS · mTLS · TLS 종료 · 전자 서명 · 중간자 공격 · Nitro Enclaves
인증서와 WAF 가 붙는 입구
Application Load Balancer · Network Load Balancer · Amazon CloudFront · API Gateway · AWS App Runner · AWS Amplify · Amazon Cognito · Amazon Route 53 · AWS Global Accelerator
WAF·Shield 가 막는 공격과 쓰는 장치
AWS WAF · 웹 애플리케이션 방화벽 · 웹 ACL · 관리형 규칙 그룹 · 속도 기반 규칙 · 속도 제한 · WCU · SQL 인젝션 · 크로스 사이트 스크립팅 · 봇 트래픽 · CAPTCHA · HTTP 403 · 방화벽 · AWS Shield · DDoS · SYN 플러드 · UDP 반사 공격 · 애플리케이션 계층 DDoS · Shield Response Team · AWS Firewall Manager
이 서비스들의 사용을 기록하고 권한을 주는 쪽
AWS IAM · AWS CloudTrail · CloudWatch · 최소 권한 · 감사 로그 · AWS Organizations