Secure Web App Coding (보안 웹앱 코딩)
OWASP Top 10:2025, ASVS 5.0, Cheat Sheet Series 및 일부 WSTG 자료를 실용적인 웹앱 보안 지침으로 전환합니다.
기본 (인라인): 조용히 안전한 코드를 작성하고, 근처에서 발견한 가장 영향력이 큰 이슈 하나만 표시합니다.
감사: "review", "audit", "harden", "is this secure?" 또는 사고 후속 조치 시 — assets/audit-checklist.md를 읽고 우선순위가 매겨진 결과를 생성합니다.
모드는 $secure-webapp <mode>로 호출합니다:
$secure-webapp audit: 전체 우선순위 리뷰;assets/audit-checklist.md를 읽습니다.$secure-webapp quick-check: 가장 위험한 항목만 점검 — 인가, 인증/세션, 시크릿, 인젝션/XSS, 업로드, SSRF, 토큰. 전체 체크리스트 보고서는 생성하지 않습니다.$secure-webapp harden: 수정이 허용된 곳에 직접 안전한 변경 사항을 적용합니다. 아키텍처를 유지하는 작은 패치를 적용하고, 확인 후 제품 승인이 필요한 사항을 표시합니다.$secure-webapp remediate: 감사→수정 반복 루프; 먼저assets/remediate-checklist.md를 전체 읽습니다.$secure-webapp design-review: 구현 전 위협 모델링 — 가정, 신뢰 경계, 오용 사례, 필수 통제, 미해결 질문.$secure-webapp report:docs/security-audit-report-YYYY-MM-DD.md에 공식 보고서를 작성합니다. 먼저assets/report-template.md를 전체 읽고 모든 단계를 따릅니다. 이 세션에서 사전 감사가 필요합니다. 채팅이 아닌 파일에 작성합니다.$secure-webapp update:npx --yes github:hov172/secure-webapp-skill --global을 실행하여 이 설치를 자체 업데이트합니다. 버전을 확인하고 최신 릴리스가 있을 때만 재설치합니다. 플래그:--claude/--codex/--gemini,--check,--force.$secure-webapp maintain: 소스 저장소의 클론에서 스킬 패키지 자체를 업데이트합니다 —scripts/README.md참조.
작업에 필요한 참조 자료만 로드하세요. 한 번에 모두 로드하지 마세요.
라우팅
| 작업 내용 | 로드할 파일 |
|---|---|
| 신뢰할 수 없는 문자열이 HTML/DOM/SQL/쉘/NoSQL/LDAP/정규식/CSV로 해석됨 | references/input-handling.md |
| 로그인, 회원가입, 비밀번호, MFA, 재설정, 무차별 대입, 세션, 쿠키, 로그아웃 | references/auth-and-sessions.md |
| 권한, 역할, 소유권 확인, IDOR, 테넌트 격리 | references/authorization.md |
| JWT, API/리프레시 토큰, 서명 및 검증, OAuth/OIDC, PKCE, state | references/tokens-and-oauth.md |
| REST/GraphQL/WebSocket 엔드포인트, 속도 제한, 매스 어사인먼트, 응답 형태, 업로드/다운로드, 경로 탐색, 사전 서명된 URL | references/apis-and-files.md |
| Secure/HttpOnly/SameSite, CSP, CORS, CSRF, 헤더, iframe, postMessage | references/frontend-and-headers.md |
환경 변수, .env, 키, 시크릿 매니저, 디버그 모드, 기본값 | references/secrets-and-config.md |
| 암호화, 비밀번호 해싱, 알고리즘, 키 관리, PII | references/data-and-crypto.md |
| 종속성, lockfiles, SBOM, CI/CD, GitHub Actions, 서명된 아티팩트 | references/supply-chain.md |
| 사용자 제어 외부 URL, SSRF, 경쟁 조건, 역직렬화, 프로토타입 오염 | references/secure-coding.md |
| 로깅, 오류 응답, 스택 트레이스, 감사 추적, Fail-closed, 롤백 | references/logging-and-errors.md |
| 새 기능 설계, 위협 모델링, 멀티 테넌시, 보안 중심 설계 결정 | references/insecure-design.md |
| LLM/AI 기능, 프롬프트 구성, RAG, 에이전트 도구 호출, MCP 서버, 모델 출력 렌더링 또는 실행 | references/ai-and-llm.md |
항시 감시 목록
웹 코드에서 발견 시 하나의 구체적인 수정 방법과 함께 간단히 표시하세요:
- 리소스 라우트에 서버 측 인증/소유권 확인 누락.
WHERE owner_id = :current_user와 같은 쿼리 수준 스코핑을 선호합니다. - 하드코딩된 시크릿, 자격 증명, JWT 시크릿, API 키 또는 커밋된
.env파일. - 문자열로 구성된 SQL/NoSQL/쉘 쿼리. 파라미터화된 쿼리, 안전한 빌더 또는 argv API를 사용하세요.
- 평문 또는 빠른 해시 비밀번호. argon2id, scrypt 또는 bcrypt를 사용하고, PBKDF2는 필요한 경우에만 사용하세요.
- 고정되지 않은 알고리즘,
exp/iss/aud검증 누락, 코드 내 시크릿을 사용한 JWT 검증. - 사용자 콘텐츠와 함께
dangerouslySetInnerHTML,v-html또는innerHTML사용. 텍스트로 렌더링하거나 위생 처리하세요. - 와일드카드 또는 에코된 출처(origin)를 가진 자격 증명 CORS. 엄격한 허용 목록을 사용하세요.
- 로그인, 회원가입, 재설정, MFA/OTP 또는 비용이 많이 드는 엔드포인트에 속도 제한 누락.
- 자세한 프로덕션 오류, 스택 트레이스, SQL/ORM 세부 정보 또는 디버그 모드가 클라이언트에 노출됨.
- 검증되지 않은
next,returnTo또는 URL 매개변수로 인한 오픈 리다이렉트. - 허용 목록 및 DNS/리다이렉트 후 프라이빗 IP 차단 없이 사용자 제공 URL에서 발생하는 SSRF.
- 비밀번호, 토큰, 세션 ID, 시크릿 또는 불필요한 PII를 포함하는 로그.
- 클라이언트 전용 보안 통제: 숨겨진 필드, 비활성화된 버튼, 클라이언트 역할 클레임, 프론트엔드 전용 검증.
- 크기, 유형, 경로, 저장소 또는 생성된 이름 통제가 없는 파일 업로드.
- 인증, 인가, 속도 제한, 기능 플래그 또는 트랜잭션 주변의 Fail-open 예외 경로.
- 잔액, 할당량, 결제, 재고, 쿠폰 또는 일회성 토큰 상태 변경의 비원자성.
- 모델/LLM 출력이 검사 없이 싱크(sink)에 도달 —
innerHTML, 쉘, SQL, 파일 경로,fetchURL 또는 다운스트림 에이전트. 신뢰할 수 없는 입력으로 취급하세요. - 최종 사용자가 아닌 서비스 계정에 대해 인가된 에이전트 도구 호출, 또는 프롬프트 인젝션을 RCE, SQLi, SSRF로 전환하는 일반
run_shell/execute_sql/http_request도구. - 신뢰할 수 없는 텍스트가 시스템 프롬프트에 연결됨; 모델 컨텍스트에 시크릿 또는 다른 사용자의 데이터 포함.
- 고정(pinning) 및 lockfile이 예상되는 위치의 가변(mutable) 종속성 또는 CI 액션 참조 — 이동된 태그는 해당 작업의 시크릿으로 공격자 코드를 실행합니다. 배포 자격 증명, 서명 키 또는 게시 권한을 보유한 작업은 높음(High)으로 평가하세요. OIDC가 존재하는 장기 클라우드 자격 증명도 마찬가지입니다. 모노레포의 모든 워크스페이스를 감사하고,
--audit-level이high보다 약한 경우 플래그를 지정하세요.
동작 방식
- 기본적으로 긴 설명 없이 안전한 코드를 작성합니다. 필요할 때 보안 관련 선택 사항을 간략히 언급합니다.
- 앱의 중요도에 맞게 엄격함을 조정합니다. 일회용 프로토타입에 엔터프라이즈급 통제를 강요하지 마세요.
- 의도적으로 안전하지 않은 코드를 생성하지 마세요. 안전한 대안을 제시하고 제약 조건을 한 문장으로 설명하세요.
- 새로운 신뢰 경계 기능의 경우 확인할 사항: 신뢰할 수 없는 입력, 인가, 실패 모드, 저장된 데이터, 오용 경로.
- 감사 시 실제 코드를 검사하고, 필수적인 범위 질문만 하며, 심각도 + 위치 + 증거 + 수정 방법을 우선순위와 함께 보고합니다.
- 요청받지 않은 한 OWASP 요구 사항 번호를 인용하지 마세요.
- 침투 테스트를 수행한다고 주장하지 마세요. 이는 코드 및 설계 리뷰입니다.
범위
주류 웹 스택 — Next.js, Express, Django, Flask, FastAPI, Rails, Spring, Laravel, Go 및 이와 유사한 환경. 참조 자료가 다루지 않는 틈새 영역의 경우 추측하지 말고 관련 OWASP 출처를 가리키세요.
에이전트에 구애받지 않음: Claude Code, Codex, Gemini CLI 및 스킬을 로드하거나 AGENTS.md/GEMINI.md를 읽는 모든 도구에서 작동합니다. 이 파일이 특정 도구를 명명하는 경우, 사용자 환경의 동등한 도구를 사용하세요.