주제:  비밀관리, 암호화, PII, ISMS-P/개인정보보호법 대응
본 글은 실무 체크리스트/템플릿 중심입니다(법률 자문 아님).
한국 기준(개인정보보호법·ISMS-P) + 글로벌 베스트프랙티스(OWASP ASVS)로 정리했어요. ISMS-P는 KISA가 주관하는 통합 인증 체계이며(정보보호+개인정보보호), 공신력 있는 프레임입니다. (KISA)
PIPA(개인정보보호법) 원문/영문 개요는 PIPC에서 확인할 수 있습니다. (pipc.go.kr)
애플리케이션 보안 점검 기준은 OWASP ASVS를 표준으로 삼으세요. (OWASP)
TL;DR (체크리스트)
- 비밀관리: Git 미유출 · KMS/HSM · 주기적 로테이션 · 사용 최소권한
- 암호화: 전송 TLS1.2+ · 저장 AES-256(서버측 암호화+필드 단위) · 키 분리
- 액세스: SSO/OIDC · RBAC/ABAC · 비인가 차단(WAF/레이트리밋)
- 개인정보(PⅡ): 분류·최소수집·목적명시·보관기간·파기 자동화
- 데이터 주체 권리: 열람/정정/삭제/처리정지 워크플로 & SLA
- 로그·가시성: 무결성(append-only), 개인정보 마스킹, trace_id 상관분석
- 보안개발 표준: OWASP ASVS L2(대부분 서비스 권장) 목표로 점검표 운영. (OWASP)
- 법·인증 정합성: ISMS-P 통제항목 맵핑(관리/기술/물리 + 개인정보 단계별 요구)로 증빙 아카이브. (guide.ncloud-docs.com)
- 사고대응: 침해사고 통지·신고 절차(내/외부), 지연 없이 통지 원칙 문서화. (pipc.go.kr)
1) 데이터 분류 & 최소주의(Privacy by Design)
분류 등급 예시
- P0 공개, P1 내부, P2 개인식별정보(PII), P3 민감정보/결제
 테이블·필드별로 등급 라벨을 메타데이터로 유지(예:columns.security_level).
최소수집·목적 제한
- 수집 목적·항목·보유기간을 스키마와 코드에 명시(주석/모델 데코레이터).
- 프런트 수집폼 → 백엔드 DTO에서 불필요 필드 제거 & 서버단 검증.
ISMS-P는 “정보보호 + 개인정보보호”를 통합해 단계별 요구사항을 포함합니다. 서비스가 개인정보를 처리한다면 ISMS-P 프레임으로 관리 체계를 갖추는 것이 표준적 접근입니다. (KISA)
2) 비밀·키 관리(Secrets & KMS)
원칙
- Git 금지(스캔: trufflehog/gitleaks), 런타임 주입(ESO/SSM/Secrets Manager)
- **KMS(Envelope Encryption)**로 데이터 키를 감싸고, 앱은 데이터 키만 사용
- 키 분리: 데이터암호화키(DEK) ↔ 마스터키(CMK/KMS), 역할 기반 접근
FastAPI 예: AWS KMS Envelope
import boto3, os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
kms = boto3.client("kms", region_name=os.getenv("AWS_REGION"))
def encrypt_pii(plaintext: bytes) -> dict:
    # 1) 데이터 키 생성
    resp = kms.generate_data_key(KeyId=os.getenv("KMS_KEY_ID"), KeySpec="AES_256")
    cek_plain, cek_encrypted = resp["Plaintext"], resp["CiphertextBlob"]
    # 2) 데이터 키로 암호화(AES-GCM)
    aes = AESGCM(cek_plain); nonce = os.urandom(12)
    ct = aes.encrypt(nonce, plaintext, None)
    return {"kek": cek_encrypted, "nonce": nonce, "ct": ct}
def decrypt_pii(blob: dict) -> bytes:
    cek_plain = kms.decrypt(CiphertextBlob=blob["kek"])["Plaintext"]
    return AESGCM(cek_plain).decrypt(blob["nonce"], blob["ct"], None)
3) 저장·전송 암호화
- 전송: TLS1.2+, HSTS, 최신 Cipher Suite, mTLS(내부 호출)
- 저장:
- 디스크 단: RDS/Volume 암호화 on(운영비용↓, 설정 간단)
- 필드 단: 이름/전화/이메일 등은 열 수준 암호화 + 검색용 토큰/해시 병행
- 인덱싱: 암호화 필드의 검색은 도우미 컬럼(예: email_hash)으로 해결
 
4) 접근·권한·세션
- SSO/OIDC + RBAC(조직별 롤), 고위험 조작은 2FA/WebAuthn
- 세션은 쿠키(HTTPOnly, Secure, SameSite=Lax), API 간은 JWT + 키 로테이션(5편 참고)
- 승격 흐름: 권한 상승 시 재인증 & 세션 재발급
ASVS는 인증/세션/권한/암호화 등 기술 통제 점검 항목을 제공합니다. 배포 전 ASVS L2 체크리스트를 통과 기준으로 삼으세요. (OWASP)
5) 로그·가시성(개인정보 최소·무결성)
- 개인정보 마스킹: 로그·APM에 이메일/전화번호 원문 기록 금지(해시/부분마스킹)
- 추적 연계: 로그에 trace_id/span_id포함(8편 구현)
- 무결성: 감사로그는 append-only 스토리지 또는 WORM 보관
6) 데이터 주체 권리 프로세스
요청 채널 → 티켓 → 검증 → 처리 → 증빙 보관
- 열람/정정/삭제/처리정지: FastAPI 관리 API + 백오피스 UI로 운영
- 삭제 자동화: 보유기간 만료시 배치/스케줄러로 익명화/물리삭제(검증 로그 남김)
- 침해사고 통지: 법은 “지체 없이 통지”를 요구(세부 기한·내용은 PIPC 고시 참고). 사내 표준 공지 템플릿과 언더라이팅된 연락 흐름을 문서화. (pipc.go.kr)
7) ISMS-P 맵핑(실무용 보일러플레이트)
ISMS-P는 관리·기술·물리 통제와 개인정보 처리 단계별 요구를 포함하는 인증 체계입니다. 아래 증빙 아카이브 구조로 맞추면 준비가 빨라집니다. (KISA)
evidence/
  01_policies/            # 정보보호/개인정보보호 기본정책, 관리체계 범위·조직
  02_risk/                # 위험평가, 통제선정, 잔여위험 승인서
  03_asset/               # 자산목록(데이터 분류/등급 포함), 취약점 진단 리포트
  04_hr/                  # 보안서약, 교육 수료증, 접근권한 Join/Move/Leave 증빙
  05_access/              # RBAC/ABAC 정책, 접근권한 검토기록, 계정점검
  06_ops/                 # 백업/복구, 변경관리, 배포체인(SBOM·서명), 가용성(SLO)
  07_devsec/              # ASVS 점검표, 코드리뷰/정적분석/DAST, 시큐어코딩 규정
  08_crypto/              # KMS 키 수명주기, 암복호 로그, 키 보관·교체 절차
  09_privacy/             # 수집·이용 동의서, 처리방침, 처리위탁·제3자 제공 계약
  10_dsr/                 # 데이터 주체 권리 처리 기록(열람/정정/삭제/정지)
  11_incident/            # 침해대응 계획/훈련/포렌식·통지 증적
  12_vendor/              # 클라우드/외부전송 적정성 확인(계약, 서드파티 감사보고서)
8) 개발·배포 단계 보안 게이트(ASVS 기반)
- PR 단계: SAST(Secrets 스캔 포함) · 의존성 취약점 스캔 · 유닛/계약 테스트
- 빌드 단계: SBOM(syft) · 이미지 스캔(Trivy) · 서명(cosign)
- 릴리즈 단계: 침투테스트/DAST(주요 릴리스) · 정책 위반 시 차단
- 런타임: WAF/레이트리밋(6편), OTel/레드팀·카오스 연습(8편)
9) 프런트/백엔드 실무 스니펫
(A) 개인정보 마스킹 유틸
export const mask = {
  email: (s:string) => s.replace(/(.).+(@.*)/, '$1***$2'),
  phone: (s:string) => s.replace(/(\d{3})\d+(\d{4})/, '$1****$2'),
};
(B) 삭제 자동화(보유기간 준수)
# 매일 03:00 실행, 보유기간 지난 레코드 익명화
async def purge_expired_users(db):
    await db.execute("""
      UPDATE users SET email_hash = NULL, pii_blob = NULL, deleted_at = now()
      WHERE deleted_at IS NULL AND retain_until < now()
    """)
(C) 동의 이력(감사 가능)
# user_consents(user_id, policy_version, scopes[], ts, ip, ua)
10) 벤더/해외 이전(클라우드·CDN·로그)
- 계약서: 위탁/제3자 제공 조항, 보안부속서(DPA), 사고 통지 의무, 하도급 제한
- 해외이전: 수탁자·국가·항목·목적·보관기간·보호조치 공개 및 동의/고지(정책/화면)
- 감사: 연 1회 증빙 수집(클라우드 인증, 취약점 평가, 침해 통계 등)
11) 침해사고 대응(핵심 흐름)
- 탐지(SIEM/알람) → 2) 격리(토큰 무효/키 회전) → 3) 분석(트레이스/로그, 영향 범위)
- 통지·신고(법·이용자·당국, 포맷/기한 준수) → 5) 재발방지(런북/아카이브 업데이트)
한국 PIPC는 개인정보 침해사고 관련 역할·통지정보를 공지·가이던스로 제공합니다. 내부 통지 체크리스트를 미리 만들고 연 1~2회 모의훈련 하세요. (pipc.go.kr)
12) 48시간 액션 플랜
- 데이터 분류표(테이블/필드 단위) + 보유기간 컬럼(retain_until) 추가
- KMS Envelope 암호화 PoC(이메일/전화 필드) + 해시 컬럼 도입
- Secrets 무유출 검사(gitleaks) & 런타임 ESO 주입 전환
- 동의/파기/권리요청 3대 워크플로 API 초안 + 백오피스 카드
- ASVS L2 체크리스트 CI 게이트(중요 항목 미통과 시 차단) (OWASP)
13) 2주 액션 플랜
- ISMS-P 증빙 아카이브 골격 생성(evidence/12폴더) & 소유자 배정 (KISA)
- 개인정보 처리방침/화면 고지 업데이트(항목/목적/보유기간/제3자/해외이전) (pipc.go.kr)
- 침해사고 통지 템플릿·연락망·SLA 문서화 & 모의훈련(연1~2회) (pipc.go.kr)
- 키 수명주기 정책(발급/교체/폐기)·로테이션 크론
- 벤더 DPA/보안부속서 점검·부재 시 표준 템플릿 배포
14) 참고 링크(공식/신뢰 소스)
- KISA ISMS-P 소개(영문) / ISMS 페이지: 인증 개요·유지 연차심사 등. (KISA)
- PIPC(개인정보보호위원회) PIPA 영문본·가이드/공지. (pipc.go.kr)
- OWASP ASVS(홈/표준 PDF/개발자 가이드). (OWASP)
마무리
- 데이터 분류 → 암호화/접근통제 → 권리요청/파기 자동화 → 증빙 아카이브 순으로 가면 ISMS-P와 PIPA 모두에 대응 가능한 지속 가능한 체계를 만들 수 있어요.
- 다음은 12편. 신뢰성·DR — 백업/복구, RTO/RPO, 멀티AZ/리전, 카오스 테스트, 비용관리로 갈게요.