$ yh.log
AWS Security & Encryption 정리

AWS Security & Encryption 정리

AWSSecurityKMSEncryptionDVA-C02

작성자 : 오예환 | 작성일 : 2026-01-18 | 수정일 : 2026-01-18

1. 암호화의 기본 개념

🤔 암호화가 왜 필요한가요?

비유로 이해하기: 암호화는 봉투에 편지를 넣고 봉인하는 것과 같습니다.

  • 봉투 없이 엽서로 보내면 → 누구나 내용을 볼 수 있음 (위험!)
  • 봉투에 넣고 봉인하면 → 받는 사람만 열어볼 수 있음 (안전!)

암호화의 3가지 유형

1️⃣ 전송 중 암호화 (Encryption in Flight / TLS/SSL)

┌────────────────────────────────────────────────────────────────┐

  Client                    인터넷                    Server
  ┌─────┐                                           ┌─────┐
 ──암호화──→ aGVsbG8gd29... ──복호화──→
 (HTTPS)       (알아볼 없음)   (HTTPS)   │     │   │
  └─────┘                                           └─────┘

  Username: admin
  Password: supersecret

  ⚠️ 중간에서 가로채도 "aGVsbG8gd29..." 보임!

└────────────────────────────────────────────────────────────────┘

** 설명**:

  • HTTPS의 S가 바로 이것! (HTTP + SSL/TLS)
  • 데이터가 네트워크를 타고 이동할 때 암호화
  • 해커가 중간에서 가로채도(MITM 공격) 내용을 볼 수 없음

실생활 예시:

  • 은행 웹사이트 접속 시 주소창에 🔒 자물쇠 표시 = HTTPS 사용 중

2️⃣ 저장 시 암호화 (Server-side Encryption at Rest)

┌────────────────────────────────────────────────────────────────┐
                        AWS 서비스 (예: S3)                      │

  Client ──(HTTPS)──→ 원본 데이터 ──암호화──→ 🔐 암호화된 데이터

        저장

                      데이터               데이터

  조회 시: 🔐 암호화된 데이터 ──복호화──→ 원본 데이터 ──→ Client

└────────────────────────────────────────────────────────────────┘

** 설명**:

  • 서버가 데이터를 받은 후 암호화해서 저장
  • 내보낼 때 복호화해서 전송
  • AWS가 키를 관리 (우리가 신경 쓸 필요 없음!)

실생활 예시:

  • S3에 파일 업로드 → AWS가 알아서 암호화해서 저장

3️⃣ 클라이언트 측 암호화 (Client-side Encryption)

┌────────────────────────────────────────────────────────────────┐

  Client (내 컴퓨터)                                             │
  ┌─────────────────────────────────────────┐
 원본 데이터 + 암호화

 🔐 암호화된 데이터 (내가 직접 암호화!)      │                   │
  └─────────────────────────────────────────┘

 업로드
  ┌─────────────────────────────────────────┐
         S3 / FTP / Any Storage

  🔐 암호화된 데이터만 저장
  (서버도 내용을 모름!)                    │                   │
  └─────────────────────────────────────────┘

  ⚠️ 서버는 절대 복호화할 없음! 키가 있어야만 복호화 가능

└────────────────────────────────────────────────────────────────┘

** 설명**:

  • 내가 직접 암호화해서 업로드
  • 서버는 암호화된 데이터만 저장 (내용 모름!)
  • 가장 안전하지만 키 관리를 내가 해야 함

사용 사례:

  • 매우 민감한 의료 정보
  • 법적으로 제3자가 접근 불가해야 하는 데이터

2. AWS KMS (Key Management Service)

🤔 KMS가 뭔가요?

비유로 이해하기: KMS는 금고 열쇠를 보관하는 은행 금고와 같습니다.

  • 집에 열쇠를 보관하면 도둑이 가져갈 수 있음
  • 은행 금고에 보관하면 안전! + 누가 열쇠를 사용했는지 기록됨

KMS 핵심 특징

특징설명설명
통합대부분 AWS 서비스와 연동EBS, S3, RDS 등에서 "암호화" 체크만 하면 됨
IAM 통합누가 키를 쓸 수 있는지 제어"이 사용자만 이 키 사용 가능"
감사CloudTrail로 키 사용 기록"누가 언제 어떤 키를 사용했는지" 추적
API 제공SDK, CLI로 프로그래밍 가능코드에서 직접 암호화/복호화 호출

⚠️ 절대 하면 안 되는 것!

# ❌ 절대 하지 마세요!
password = "MySecretPassword123"  # 코드에 비밀번호 직접 저장
 
# ✅ 이렇게 하세요!
import boto3
 
kms = boto3.client('kms')
encrypted_password = "AQICAHh..."  # KMS로 암호화된 값
 
# 필요할 때 복호화
decrypted = kms.decrypt(CiphertextBlob=encrypted_password)
password = decrypted['Plaintext']

** 팁**: "코드에 비밀번호 절대 금지!" → KMS로 암호화하거나 Secrets Manager 사용


3. KMS Key 유형

🤔 왜 여러 종류가 있나요?

용도와 보안 수준에 따라 다른 키가 필요합니다.

대칭 키 vs 비대칭 키

유형설명비유
대칭 키 (Symmetric)암호화/복호화에 같은 키 사용같은 열쇠로 잠그고 여는 금고
비대칭 키 (Asymmetric)공개 키(암호화) + 개인 키(복호화)누구나 넣을 수 있는 우체통 + 나만 열 수 있는 열쇠

대칭 키 (AES-256) - 가장 많이 사용!

암호화: 원본 데이터 + 🔐 암호화된 데이터
복호화: 🔐 암호화된 데이터 + 같은 원본 데이터
 
⚠️ 자체는 절대 없음! KMS API를 통해서만 사용

** 설명**:

  • AWS 서비스들은 대부분 대칭 키 사용
  • 키를 직접 다운로드 불가 (보안상)
  • 반드시 KMS API 호출해서 암호화/복호화

비대칭 키 (RSA, ECC)

┌─────────────────────────────────────────────────────────┐

  공개 (Public Key)       개인 키 (Private Key)       │
  - 다운로드 가능          - 다운로드 불가
  - 암호화에 사용              - 복호화에 사용
  - 누구에게나 공개 가능       - KMS 내부에서만 사용

└─────────────────────────────────────────────────────────┘
 
사용 예시: AWS 외부에서 암호화가 필요할
- 외부 파트너가 공개 키로 암호화
- 우리만 개인 키로 복호화 (KMS API 통해)

사용 사례:

  • AWS API를 호출할 수 없는 외부 시스템과 연동
  • 디지털 서명 (Sign/Verify)

KMS Key 종류별 비용

종류비용관리 주체예시
AWS Owned Keys무료AWSSSE-S3, SSE-SQS
AWS Managed Keys무료AWSaws/rds, aws/ebs
Customer Managed Keys$1/월고객직접 생성한 키
Imported Keys$1/월고객외부에서 가져온 키
  • API 호출 비용: $0.03 / 10,000 호출

키 자동 교체 (Rotation)

키 종류자동 교체
AWS Managed Key자동 (1년마다)
Customer Managed Key활성화 필요 (자동 + 수동)
Imported Key수동만 (Alias로 관리)

** 팁**: 보안을 위해 키를 주기적으로 교체해야 합니다. Customer Managed Key는 반드시 자동 교체를 활성화하세요!


4. KMS 작동 방식

🤔 어떻게 암호화/복호화가 이뤄지나요?

기본 흐름 (4KB 이하 데이터)

┌─────────────────────────────────────────────────────────────────┐
                         암호화 (Encrypt)                        │

  1. Client: "이 비밀번호 암호화해줘" + IAM 자격 증명

  2. KMS: IAM 권한 확인

  3. KMS: CMK로 암호화

  4. Client: 암호화된 데이터 받음 (저장해서 사용)                   │

└─────────────────────────────────────────────────────────────────┘
 
┌─────────────────────────────────────────────────────────────────┐
                         복호화 (Decrypt)                        │

  1. Client: "이 암호화된 데이터 복호화해줘" + IAM 자격 증명

  2. KMS: IAM 권한 확인

  3. KMS: CMK로 복호화

  4. Client: 평문 데이터 받음 (메모리에서만 사용, 저장 금지!)       │

└─────────────────────────────────────────────────────────────────┘

** 주의**: Encrypt/Decrypt API는 최대 4KB 데이터만 처리 가능! 더 큰 데이터는 → Envelope Encryption 사용


5. Envelope Encryption (봉투 암호화)

🤔 왜 필요한가요?

문제: KMS Encrypt API는 4KB까지만 암호화 가능 해결: 데이터를 암호화할 **데이터 키(DEK)**를 생성하고, 그 키를 KMS로 암호화

비유로 이해하기

일반 암호화 (4KB 이하):
📄 작은 편지 🔐 금고에 직접 넣음
 
봉투 암호화 (4KB 이상):
📦 상자 🔑 상자 전용 열쇠로 잠금
 🔐 열쇠만 금고에 보관
 📦+🔐 상자와 암호화된 열쇠를 함께 저장

암호화 과정 (GenerateDataKey API)

┌─────────────────────────────────────────────────────────────────┐
                     봉투 암호화 과정

  1. Client KMS: "데이터 키 생성해줘" (GenerateDataKey)         │

  2. KMS Client:
     ├─ 평문 DEK (Data Encryption Key): "abc123..."
     └─ 암호화된 DEK: "🔐xyz789..."

  3. Client에서:
     ├─ 평문 DEK로 파일(10MB) 암호화 🔐 암호화된 파일
     ├─ 평문 DEK 즉시 삭제! (메모리에서 제거)                     │
     └─ 저장: [암호화된 DEK] + [암호화된 파일]

  결과물 (Envelope):                                              │
  ┌──────────────────────────────────┐
  🔐 암호화된 DEK (작음, KMS로만 복호화 가능)                  │
  🔐 암호화된 파일 (큼, DEK로만 복호화 가능)                   │
  └──────────────────────────────────┘

└─────────────────────────────────────────────────────────────────┘

복호화 과정

┌─────────────────────────────────────────────────────────────────┐
                     봉투 복호화 과정

  1. 저장된 Envelope에서:
     ├─ 🔐 암호화된 DEK 추출
     └─ 🔐 암호화된 파일 추출

  2. Client KMS: "이 DEK 복호화해줘" (Decrypt API)              │

  3. KMS Client: 평문 DEK 반환

  4. Client에서:
     ├─ 평문 DEK로 파일 복호화 원본 파일
     └─ 평문 DEK 즉시 삭제!

└─────────────────────────────────────────────────────────────────┘

시험 핵심!

📝 4KB 이상 데이터 암호화 = Envelope Encryption = GenerateDataKey API


6. AWS Encryption SDK

🤔 이게 뭔가요?

비유로 이해하기: Envelope Encryption을 자동으로 해주는 라이브러리입니다. 직접 GenerateDataKey 호출하고, 파일 암호화하고... 복잡하죠? SDK가 한 줄로 다 해줍니다!

지원 언어

  • Java
  • Python
  • C
  • JavaScript
  • CLI 도구

예시 코드 (Python)

# Encryption SDK 없이 (복잡함!)
kms = boto3.client('kms')
response = kms.generate_data_key(KeyId='alias/my-key', KeySpec='AES_256')
plaintext_key = response['Plaintext']
encrypted_key = response['CiphertextBlob']
# ... 직접 암호화 로직 구현 ...
 
# Encryption SDK 사용 (간단함!)
import aws_encryption_sdk
 
client = aws_encryption_sdk.EncryptionSDKClient()
encrypted_data, header = client.encrypt(
    source=my_large_file,
    key_provider=my_key_provider
)
# 끝! DEK 생성, 암호화, 저장 다 자동으로!

Data Key Caching

문제: 매번 KMS API 호출 → 느림 + 비용 + Throttling 해결: Data Key를 재사용 (캐싱)

┌─────────────────────────────────────────────────────────────────┐
                     DEK 캐싱

  캐싱 없이:
  파일1 암호화 KMS 호출 (DEK 생성)                              │
  파일2 암호화 KMS 호출 (DEK 생성)                              │
  파일3 암호화 KMS 호출 (DEK 생성)                              │
 3번 호출, 느림, 비용 증가

  캐싱 사용:
  파일1 암호화 KMS 호출 (DEK 생성, 캐시에 저장)                  │
  파일2 암호화 캐시된 DEK 사용 (KMS 호출 함!)                 │
  파일3 암호화 캐시된 DEK 사용 (KMS 호출 함!)                 │
 1번만 호출, 빠름, 비용 절감

  ⚠️ 보안 트레이드오프: 같은 재사용은 보안상 약간 위험

└─────────────────────────────────────────────────────────────────┘

캐시 설정 옵션:

  • max age: 캐시 유지 시간
  • max bytes: 암호화할 최대 데이터 크기
  • max messages: 암호화할 최대 메시지 수

7. KMS API 요약

주요 API

API용도데이터 크기
Encrypt데이터 암호화≤ 4KB
Decrypt데이터 복호화≤ 4KB
GenerateDataKeyDEK 생성 (평문 + 암호화된 키)큰 데이터용
GenerateDataKeyWithoutPlaintext암호화된 DEK만 생성나중에 사용
GenerateRandom랜덤 바이트 생성-

Request Quotas (API 제한)

⚠️ KMS API 호출 한도 (초당 요청)
 
대칭 키:
- 기본: 5,500 RPS
- 일부 리전: 10,000 RPS (서울 )
- us-east-1 등: 30,000 RPS
 
비대칭 키:
- RSA: 500 RPS
- ECC: 300 RPS
 
한도 초과 시: ThrottlingException Exponential Backoff로 재시도!

해결책:

  1. Exponential Backoff: 재시도 간격을 점점 늘림
  2. DEK Caching: Encryption SDK 사용
  3. 한도 증가 요청: AWS Support에 문의

8. KMS Key Policy

🤔 Key Policy가 뭔가요?

비유로 이해하기: 금고의 접근 권한 목록입니다.

  • "김철수는 금고 열 수 있음"
  • "박영희는 금고 보기만 가능"
  • "외부인은 접근 불가"

S3 버킷 정책과의 차이

S3 버킷 정책KMS Key Policy
없어도 기본 접근 가능없으면 접근 불가!
선택 사항필수

기본 Key Policy

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:root"
  },
  "Action": "kms:*",
  "Resource": "*"
}

의미: 같은 AWS 계정의 모든 사용자/역할이 IAM 권한 있으면 접근 가능

Custom Key Policy (Cross-Account 등)

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::OTHER-ACCOUNT:root"
  },
  "Action": ["kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey"],
  "Resource": "*"
}

사용 사례: 다른 AWS 계정에서 이 키 사용 허용

Cross-Account 스냅샷 복사

┌─────────────────────────────────────────────────────────────────┐
                  계정 A 계정 B 스냅샷 공유

  1. 계정 A: Customer Managed Key로 암호화된 스냅샷 생성

  2. 계정 A: Key Policy에 계정 B 접근 허용 추가

  3. 계정 A: 암호화된 스냅샷을 계정 B와 공유

  4. 계정 B: 스냅샷 복사 (계정 B의 CMK로 재암호화)                │

  5. 계정 B: 복사된 스냅샷으로 볼륨 생성

└─────────────────────────────────────────────────────────────────┘

9. S3 Bucket Key

🤔 이게 뭔가요?

문제: S3에 파일 많이 올리면 KMS API 호출이 엄청 많아짐 → 비용↑, Throttling 해결: S3가 **자체 키(Bucket Key)**를 만들어서 KMS 호출 줄임

작동 방식

┌─────────────────────────────────────────────────────────────────┐
                    S3 Bucket Key 없이

  파일1 업로드 KMS 호출 (DEK 생성)                              │
  파일2 업로드 KMS 호출 (DEK 생성)                              │
  파일3 업로드 KMS 호출 (DEK 생성)                              │
  ... 파일 100개 KMS 100번 호출!

└─────────────────────────────────────────────────────────────────┘
 
┌─────────────────────────────────────────────────────────────────┐
                    S3 Bucket Key 사용

  1. S3가 KMS에서 Bucket Key 생성 (1회)                          │
  2. Bucket Key로 파일의 DEK 생성 (S3 내부)                    │

  파일1 업로드 Bucket Key로 DEK 생성 (KMS 호출 함!)          │
  파일2 업로드 Bucket Key로 DEK 생성 (KMS 호출 함!)          │
  파일3 업로드 Bucket Key로 DEK 생성 (KMS 호출 함!)          │
  ... 파일 100개 KMS 호출 거의 없음!

  결과: KMS 호출 **99% 감소**, 비용 **99% 절감**

└─────────────────────────────────────────────────────────────────┘

** 팁**: S3 + SSE-KMS 사용 시 반드시 Bucket Key 활성화! (기본 활성화)


10. CloudHSM

🤔 KMS랑 뭐가 다른가요?

비유로 이해하기:

  • KMS: 은행이 관리하는 공용 금고 (편리하지만 은행도 접근 가능)
  • CloudHSM: 내가 직접 관리하는 개인 금고 (완전한 통제권)

KMS vs CloudHSM

항목KMSCloudHSM
관리AWS가 소프트웨어 관리내가 하드웨어 관리
키 소유AWS도 접근 가능나만 접근 가능
하드웨어공유 (Multi-Tenant)전용 (Single-Tenant)
인증FIPS 140-2 Level 3FIPS 140-2 Level 3
비용저렴 (무료 티어 있음)비쌈 (무료 티어 없음)
고가용성AWS 관리내가 Multi-AZ 구성

CloudHSM 아키텍처

┌─────────────────────────────────────────────────────────────────┐

        ┌──────────────────┐    SSL    ┌──────────────────┐
  CloudHSM Client ←──────→    CloudHSM
   (우리 )       │          │   (AWS 하드웨어)  │     │
        └──────────────────┘          └──────────────────┘

  AWS 역할:             우리 역할:
  - 하드웨어 제공        - 생성/관리
  - 물리적 보안          - 사용자 관리
                         - 암호화 작업

└─────────────────────────────────────────────────────────────────┘

사용 사례

사례이유
규정 준수FIPS 140-2 Level 3 필수
완전한 키 통제AWS도 키에 접근 불가해야 할 때
SSL/TLS 가속고성능 암호화 필요
Redshift 암호화CloudHSM 지원
SSE-C고객이 키를 완전 관리

11. SSM Parameter Store

🤔 이게 뭔가요?

비유로 이해하기: 안전한 메모장입니다.

  • 설정 값 (DB URL, API 엔드포인트)
  • 비밀 정보 (비밀번호, API 키)
  • 버전 관리까지!

특징

특징설명
저장설정 + 비밀 정보
암호화KMS로 선택적 암호화
버전 관리변경 이력 추적
계층 구조폴더처럼 정리 가능
IAM세밀한 접근 제어
EventBridge변경 시 알림

계층 구조 예시

/my-department/
├── my-app/
   ├── dev/
   ├── db-url "localhost:5432"
   └── db-password "dev-secret" (암호화)
   └── prod/
       ├── db-url "prod-db.aws.com:5432"
       └── db-password "prod-secret" (암호화)
└── other-app/
    └── ...
 
특수 경로:
/aws/reference/secretsmanager/secret_ID Secrets Manager 참조
/aws/service/ami-amazon-linux-latest/... AWS 공개 파라미터

사용 예시 (Python/Lambda)

import boto3
 
ssm = boto3.client('ssm')
 
# 단일 파라미터 조회
response = ssm.get_parameter(
    Name='/my-app/prod/db-password',
    WithDecryption=True  # 암호화된 경우 복호화
)
password = response['Parameter']['Value']
 
# 경로 기반 조회 (하위 전체)
response = ssm.get_parameters_by_path(
    Path='/my-app/prod/',
    WithDecryption=True
)
for param in response['Parameters']:
    print(param['Name'], param['Value'])

Standard vs Advanced 티어

항목StandardAdvanced
파라미터 수10,000100,000
값 크기4 KB8 KB
정책✅ (TTL 등)
비용무료$0.05/월/파라미터

Parameter Policies (Advanced만)

// 60일 후 자동 삭제
{
  "Type": "Expiration",
  "Version": "1.0",
  "Attributes": {
    "Timestamp": "2024-12-31T00:00:00.000Z"
  }
}
 
// 만료 15일 전 알림
{
  "Type": "ExpirationNotification",
  "Version": "1.0",
  "Attributes": {
    "Before": "15",
    "Unit": "Days"
  }
}

12. AWS Secrets Manager

🤔 Parameter Store랑 뭐가 다른가요?

비유로 이해하기:

  • Parameter Store: 범용 메모장 (설정 + 비밀)
  • Secrets Manager: 비밀번호 전용 금고 (자동 교체!)

핵심 차이: 자동 비밀 교체

┌─────────────────────────────────────────────────────────────────┐
                  Secrets Manager 자동 교체

  1. 30일마다 자동 트리거

  2. Lambda 함수 호출 (AWS 제공 또는 커스텀)                      │

  3. 비밀번호 생성

  4. RDS/Redshift/DocumentDB 비밀번호 변경

  5. Secrets Manager에 비밀 저장

  6. 앱은 항상 최신 비밀 사용 (코드 변경 없이!)                   │

└─────────────────────────────────────────────────────────────────┘

Parameter Store vs Secrets Manager

항목Parameter StoreSecrets Manager
주 용도설정 + 비밀비밀 전용
자동 교체❌ (수동 구현)✅ (내장)
RDS 통합✅ (자동 교체)
암호화선택필수
비용저렴/무료비쌈
API 호환

Multi-Region Secrets

┌─── us-east-1 (Primary) ───┐    ┌─── us-west-2 (Secondary) ───┐

  Secrets Manager  Secrets Manager
  ┌──────────────────┐  ┌──────────────────┐
  MySecret-A  MySecret-A
  (primary)       │ ────┼───→│  │  (replica)       │      │
  └──────────────────┘  └──────────────────┘

└────────────────────────────┘    └─────────────────────────────┘
 
- 자동 동기화
- 재해 복구 replica를 standalone으로 승격 가능

13. CloudFormation과 비밀 관리

Dynamic References

# CloudFormation 템플릿에서 직접 참조
Resources:
  MyDBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      MasterUsername: admin
      MasterUserPassword: "{{resolve:secretsmanager:MyRDSSecret:SecretString:password}}"

참조 형식

서비스형식
SSM (평문){{resolve:ssm:parameter-name:version}}
SSM (암호화){{resolve:ssm-secure:parameter-name:version}}
Secrets Manager{{resolve:secretsmanager:secret-id:secret-string:json-key:version}}

RDS + Secrets Manager 자동 관리

# Option 1: ManageMasterUserPassword (권장!)
Resources:
  MyDBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: mysql
      ManageMasterUserPassword: true # RDS가 알아서 비밀 생성 & 관리!

14. CloudWatch Logs 암호화

설정 방법

# 기존 로그 그룹에 KMS 키 연결
aws logs associate-kms-key \
  --log-group-name /my-app/logs \
  --kms-key-id arn:aws:kms:us-east-1:123456789012:key/xxx
 
# 새 로그 그룹 생성 시
aws logs create-log-group \
  --log-group-name /my-app/new-logs \
  --kms-key-id arn:aws:kms:us-east-1:123456789012:key/xxx

⚠️ 콘솔에서는 설정 불가! 반드시 API/CLI 사용


15. AWS Nitro Enclaves

🤔 이게 뭔가요?

비유로 이해하기: EC2 안에 완전히 격리된 작은 방을 만드는 것입니다.

  • 주인(EC2 호스트)도 그 방 안을 볼 수 없음
  • 네트워크 접근 불가
  • 디스크 저장 불가
  • 오직 암호화된 채널로만 통신

특징

특징설명
격리완전히 독립된 VM (커널, 메모리, CPU 분리)
네트워크외부 네트워크 접근 불가
저장소영구 저장 불가
인증Cryptographic Attestation (코드 검증)
KMS 통합Enclave만 특정 키에 접근 가능

사용 사례

사례이유
PII 처리개인정보 보호
금융 데이터신용카드 처리
의료 정보HIPAA 준수
개인 키 보호서명 작업

핵심 요약

암호화 유형 선택

상황추천
AWS 서비스 암호화KMS (기본)
완전한 키 통제 필요CloudHSM
4KB 이상 데이터Envelope Encryption
설정 + 비밀 저장SSM Parameter Store
DB 비밀번호 자동 교체Secrets Manager

API 기억하기

API용도
Encrypt/Decrypt4KB 이하 데이터
GenerateDataKey4KB 이상 (Envelope)