---
type: knowledge
domain: engineering
status: active
last-reviewed: 2026-07-06
---

# 보안 원리

> 한 줄 정의
> 공격자 관점에서 시스템을 보는 실전 원리. 에이전트 특화 안전장치는 [[가드레일]]·[[Prompt Injection]], 배포 전 실행 점검은 [[보안-체크리스트]] — 이 문서는 그 판단의 원천.

## 공격면 = 입력이 있는 모든 곳

폼, API 파라미터, 헤더, 쿠키, 파일 업로드, 웹훅 콜백, 그리고 이제 **LLM 프롬프트**까지 — 외부에서 값이 들어오는 모든 지점이 공격면이다. "우리 서비스를 누가 공격해"는 통계적으로 틀린 가정이다: 스캐너는 표적을 고르지 않는다.

## 실무 빈도순 5대 취약점 (OWASP 압축)

| 취약점 | 공격자의 첫 시도 | 유일하게 옳은 방어 |
|--------|----------------|------------------|
| 접근 제어 실패 (IDOR) | URL·파라미터의 ID를 남의 것으로 바꿔본다 | 모든 요청에서 **소유권 서버 검증** — "숨김"은 보호가 아니다 |
| 인젝션 | 입력에 `' OR 1=1 --` | 문자열 조립 금지, **파라미터화 쿼리**가 유일한 답 |
| XSS | 닉네임에 `<script>` | **출력 시점 이스케이프**, innerHTML 금지 → [[프론트엔드 원리]] |
| 인증 실패 | 로그인 무차별 대입, 세션 재사용 | rate limit, 로그아웃·비번 변경 시 세션 무효화 |
| 민감 데이터 노출 | 로그·에러 메시지·응답 뒤지기 | 전송·저장 암호화, 로그에 PII·토큰 금지 → [[PII Redaction]] |

접근 제어 실패가 1위인 이유: 프레임워크가 자동으로 못 막아주는 유일한 항목이라서다. 인젝션·XSS는 도구가 반쯤 막아주지만 "이 문서가 이 유저 것인가"는 매번 개발자가 검증해야 한다.

## STRIDE — 설계 시점 위협 모델링

새 기능마다 6축 질문을 던진다 (전부가 아니라 해당 축만):

| 축 | 질문 |
|----|------|
| **S**poofing | 남인 척할 수 있나? (인증) |
| **T**ampering | 데이터를 조작할 수 있나? (무결성·서명) |
| **R**epudiation | "내가 안 했다"고 잡아뗄 수 있나? (감사 로그) |
| **I**nfo Disclosure | 봐선 안 될 것을 볼 수 있나? (암호화·마스킹) |
| **D**oS | 시스템을 멈출 수 있나? (rate limit·리소스 상한) |
| **E**levation | 권한을 올릴 수 있나? (인가·최소 권한) |

설계 시점 위협 모델링이 가장 싸다 — 보안은 기능이 아니라 **속성**이라 나중에 붙일 수 없다.

## 시크릿 — 커밋된 순간 유출이다

- 시크릿은 코드에 존재하지 않는다: 환경변수 또는 시크릿 매니저, 필수 시크릿은 기동 시점 존재 검증.
- 한 번이라도 커밋됐다면 **히스토리 삭제가 아니라 로테이션**이 대응이다 — 포크·클론·캐시에 이미 퍼졌다고 간주한다.
- `.env`는 `.gitignore`에, `.env.example`은 키 이름만.

## 최소 권한 · 방어 심층화

- **최소 권한**: 사람·서비스 계정·에이전트 도구 모두 — "일단 admin 주고 시작"이 사고 보고서의 첫 문장이 된다. 필요할 때 넓히는 것이 사고 후 좁히는 것보다 항상 싸다.
- **방어 심층화**: 한 겹이 뚫려도 다음 겹이 받는다. 검증은 클라이언트+서버 양쪽 — 클라이언트 검증은 UX이고 **서버 검증만이 보안**이다.

## 공급망 — 의존성도 공격면

- lockfile로 버전 고정, 정기 audit, 안 쓰는 의존성 제거 (의존성 하나 = 신뢰 위임 하나).
- 유사 이름 패키지(typosquatting) 주의 — 설치 전 이름 철자·다운로드 수·저장소 확인.

## 에이전트 시대의 추가 공격면

- **도구 권한 계층화**: 에이전트 도구를 읽기 / 쓰기 / 외부 발신으로 분리하고, 외부 발신(메일·결제·배포)은 사람 게이트 뒤에 둔다.
- **외부 콘텐츠는 데이터다**: 웹페이지·문서·타 모델 응답 속 지시문은 따르지 않는다 → [[Prompt Injection]]. 간접 인젝션은 입력 검증의 LLM 버전이다.
- **확신 기준 보고**: 확신 낮은 보안 경고 남발은 늑대 소년 효과로 진짜 경고를 죽인다 — 높은 확신(예: 8/10 이상) 취약점만 보고하고 나머지는 "추가 조사 필요"로 분리한다.

## 관련 문서

- [[가드레일]] · [[Prompt Injection]] · [[PII Redaction]] — 에이전트 레이어
- [[백엔드 원리]] — 인증·인가 구현
- [[보안-체크리스트]] — 배포 전 실행 점검
- [[QA 원리]] — 파괴자 투어와 접점
