security 20

Security Series를 마치며

이 글의 목적애플리케이션 보안 본편 19편을 마쳤다. 이 글은 시리즈 전체를 압축·연결하고 다음에 어디로 갈지 짚는 에필로그다.19편 동안 본 개념을 한 장 지도로 다시 본다앱 보안에서 뻗어 나가는 주제와 블로그 내 다른 시리즈를 연결한다보안 지식이 어떤 직업·역할과 맞닿는지 정리한다손으로 확인하는 방법과 읽을거리를 남긴다1. 19편이 만든 큰 그림앱 보안은 도구 하나가 아니라 신뢰 경계·주체·취약점·운영·인프라를 겹쳐 막는 일이다.Part핵심 질문기억할 키워드0 오리엔테이션무엇을 지키나CIA, 위협 모델, authn vs authz1 기초설계·전송·세션least privilege, TLS, cookie·hash2 인증·인가누구인가·무엇을JWT, OAuth·OIDC, RBAC·OPA3 OWASP어디가 뚫..

Cloud IAM

학습 목표클라우드 IAM의 principal·action·resource·condition 평가를 설명할 수 있다.User·long-lived key와 role·임시 자격증명의 차이를 설명할 수 있다.workload identity(IRSA·GKE WI·Azure WI)로 Pod가 클라우드 API에 접근하는 흐름을 설명할 수 있다.2편 least privilege·8편 인가·17편 Zero Trust와 클라우드 권한을 연계할 수 있다.문제 상황EKS 노드 IAM AdministratorAccess — Pod 탈취 = 계정 전체앱 컨테이너 env에 AWS_ACCESS_KEY_ID — 13편 시크릿 유출·회전 불가개발자 개인 IAM User로 프로덕션 S3 접근 — 퇴사 후 키 잔존CI 장기 access k..

Supply Chain 보안

학습 목표소프트웨어 공급망 위협(의존성·빌드·레지스트리·CI)을 설명할 수 있다.SBOM의 목적·형식(CycloneDX·SPDX)·생성·활용을 설명할 수 있다.SLSA 레벨과 빌드 출처(provenance)·무결성 개념을 설명할 수 있다.의존성·컨테이너 스캔을 16편 CI 게이트에 통합하는 패턴을 설명할 수 있다.아티팩트 pin·서명(digest·cosign) 개요를 설명할 수 있다.문제 상황log4j CVE — transitive 의존성 어디 쓰는지 모름·패치 수개월npm 패키지 탈취 — maintainer 계정 해킹·악성 버전 배포GitHub Action @main — 공급망 공격 시 빌드 파이프라인 침해베이스 이미지 latest — 프로덕션 에 알 수 없는 OS CVE 누적12편 vulnerable..

Zero Trust

학습 목표경계 방어(castle-and-moat)와 Zero Trust 모델의 차이를 설명할 수 있다.never trust, always verify — 매 요청·세션 마다 신원·디바이스·컨텍스트를 검증하는 원칙을 설명할 수 있다.ZTNA(Zero Trust Network Access)가 VPN 전체 네트워크 신뢰와 어떻게 다른지 설명할 수 있다.micro-segmentation·NetworkPolicy·서비스 메시 mTLS로 워크로드 간 최소 통신을 설계할 수 있다.16편 체크리스트·8편 인가·3편 mTLS와 연계한 Zero Trust 도입 단계를 설명할 수 있다.문제 상황사내 VPN 접속 = 내부망 전체 스캔 가능 — 노트북 탈취 시 DB·관리 콘솔 동시 노출평문 ClusterIP — Pod 하나 뚫..

보안 체크리스트

학습 목표1~15편 주제를 단계·계층별 배포 전 체크리스트로 통합할 수 있다.SDLC 게이트(설계·빌드·스테이징·운영)에서 자동·수동 점검을 구분할 수 있다.CI/CD 보안 파이프라인(시크릿 스캔·SAST·의존성·스테이징 검증) 개요를 설명할 수 있다.OWASP ASVS 레벨과 시리즈 범위 매핑 개념을 설명할 수 있다.Go/No-Go 배포 판단·예외 기록 프로세스를 설명할 수 있다.문제 상황각 편 체크리스트는 있지만 프로덕션 배포 전 한 장 통합 표 없음금요일 17시 보안 팀 수동 리뷰 — 병목·누락 반복staging TLS 끔·debug true — prod 설정 드리프트 미발견JWT 만료 없음(5편)·SQLi 테스트 없음(9편)·Vault 미연동(13편) — 개별 이슈는 알지만 게이트 없음감사 로그 ..

로깅과 감사

학습 목표운영 로그와 감사(audit) 로그의 목적·필드·보존 차이를 설명할 수 있다.PII·시크릿이 로그에 유입되는 경로와 마스킹·수집 전 필터 패턴을 설명할 수 있다.인증·인가·관리 이벤트를 감사 로그로 남기는 기준을 설명할 수 있다.trace_id·correlation_id로 Observability와 보안 조사를 연계할 수 있다.보존·접근 통제·SIEM 연동 개요를 설명할 수 있다.문제 상황로그인 실패 수천 건 — 누가·언제·어느 IP인지 집계 불가 (비구조화)logger.info(f"user email={email} card={pan}") — PII·카드 번호 평문 저장GDPR 삭제 요청 — 로그에 이메일 잔존·검색 불가관리자 role 변경 기록 없음 — 내부 어뷰 추적 실패13편 시크릿이 ac..

API 보안

학습 목표REST/JSON API에서 인증·인가 다음에 필요한 운영·경계 통제를 설명할 수 있다.rate limiting 알고리즘·키 단위·429 응답 설계를 설명할 수 있다.스키마 검증으로 Injection·mass assignment·타입 혼동을 경계에서 차단하는 이유를 설명할 수 있다.CORS가 브라우저 정책임을 설명하고 preflight·credentials 오설정 위험을 설명할 수 있다.API 게이트웨이·앱·WAF에서 defense in depth 역할을 구분할 수 있다.문제 상황공개 API 키 없이 호출 — 스크래퍼가 분당 수천 요청·DB 고갈POST /users에 {"role":"admin"} 추가 — mass assignment로 권한 상승 (11편)page=999999&size=10000..

시크릿 관리

학습 목표시크릿(비밀번호·API 키·토큰·TLS key)을 코드·Git·로그에서 분리하는 이유를 설명할 수 있다.환경변수 주입의 장단점과 K8s Secret 한계(base64·etcd)를 설명할 수 있다.Vault·클라우드 Secret Manager·External Secrets Operator 패턴을 설명할 수 있다.Rotation·least privilege·audit이 시크릿 수명주기에서 맡는 역할을 설명할 수 있다.앞서 Platform ConfigMap·Secret과 Security 관점 연계를 설명할 수 있다.문제 상황const API_KEY = "sk-live-..." — GitHub public push 한 번에 키 폐기.env를 커밋 — history에 영구 남음 (git filter-re..

OWASP Top 10

학습 목표SSRF(Server-Side Request Forgery)가 서버가 공격자 지정 URL을 요청해 내부망·메타데이터에 닿게 하는 방식을 설명할 수 있다.Security Misconfiguration의 대표 실패(디버그 노출·기본 계정·불필요 서비스)를 설명할 수 있다.Vulnerable and Outdated Components에서 의존성·이미지 CVE 관리·패치 흐름을 설명할 수 있다.OWASP Top 10 2021 전 항목이 시리즈 어디와 연결되는지 지도로 정리할 수 있다.Part 3 운영 가능한 체크리스트 관점으로 SSRF·설정·컴포넌트를 점검할 수 있다.문제 상황URL 미리보기 API ?url=http://169.254.169.254/latest/meta-data/ — 클라우드 IAM r..

Broken Access Control

학습 목표Broken Access Control이 OWASP Top 10 1위 취약점 클래스임을 설명할 수 있다.IDOR(Insecure Direct Object Reference)에서 객체 ID만 바꿔 타인 리소스에 접근하는 방식을 설명할 수 있다.수평(같은 role·다른 리소스)과 수직(낮은 role·높은 권한 API) 권한 상승을 구분할 수 있다.Mass assignment·missing function-level access control·forced browsing 패턴을 설명할 수 있다.서버 측 매 요청 검증·deny by default·자동 IDOR 테스트로 방어할 수 있다.문제 상황로그인한 일반 사용자가 GET /api/invoices/1001 → 200 + 남의 청구서invoice_id만..