API와 모듈 사이의 입출력을 정의하고 이름, 오류 형식, 입력 검증을 통일합니다. 기존 호출 측과의 호환성과 재시도로 인한 중복 처리도 고려합니다.
- 새 REST API를 설계합니다
- 화면과 서버 사이의 데이터 규격을 정합니다
- 호환성을 유지하며 API를 확장합니다
웹 앱의 입력 처리, 인증, 외부 연동을 점검하고 취약점 대응을 정리합니다. 의존 패키지, 개인정보, LLM 출력 처리 방식까지 확인합니다.
Hardens code against vulnerabilities. Use when auditing an input handler for vulnerabilities, when handling user input, authentication, data storage, or external integrations, or when checking a login flow is safe against the OWASP Top Ten. Use when building any feature that accepts untrusted data, manages user sessions, or interacts with third-party services. Use when auditing dependencies for known vulnerabilities, triaging package-manager audit findings, or assessing supply-chain risk in a new package. Use when personal data or privacy compliance (GDPR, CCPA) is involved.
웹 앱의 취약점을 점검하고 설계와 코드 양쪽에서 대응합니다. 외부 데이터가 들어오는 지점과 보호할 정보를 파악하고, 사칭이나 정보 유출 등의 위협을 정리합니다. 입력 검증, 인증과 권한 확인, 세션, 파일 업로드, 비밀 정보 관리를 점검합니다. 의존 패키지의 알려진 취약점, 개인정보 보관 기간과 삭제 경로, LLM 출력 검증도 다룹니다.
로그인 기능이나 외부 API 연동을 추가할 때, 출시 전에 안전성을 다시 검토할 때 적합합니다. AI 기능이 생성한 문자열을 쿼리나 파일 작업에 전달하는 처리도 확인할 수 있습니다.
의존성 확인에는 프로젝트에서 사용하는 패키지 관리자의 감사 기능을 사용합니다. 감사만으로는 알려지지 않은 악성 패키지를 탐지할 수 없습니다. 인증 방식 변경이나 새로운 민감 정보 저장 등은 사람의 승인을 받은 뒤 진행합니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용만을 근거로 4가지 관점에서 판정했습니다. 스타 수나 인기도는 판정에 넣지 않았습니다.
총점은 각 항목을 A=25점, B=15점, C=5점으로 더한 값입니다. 2026년 10월 20일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Security-first development practices for web applications. Treat every external input as hostile, every secret as sacred, and every authorization check as mandatory. Security isn't a phase — it's a constraint on every line of code that touches user data, authentication, or external systems.
Controls bolted on without a threat model are guesses. Before hardening, spend five minutes thinking like an attacker:
| Threat | Ask | Typical mitigation |
|---|---|---|
| Spoofing | Can someone impersonate a user/service? | Authentication, signature verification |
| Tampering | Can data be altered in transit or at rest? | Integrity checks, parameterized queries, HTTPS |
| Repudiation | Can an action be denied later? | Audit logging of security events |
| Information disclosure | Can data leak? | Encryption, field allowlists, generic errors |
| Denial of service | Can it be overwhelmed? | Rate limiting, input size caps, timeouts |
| Elevation of privilege | Can a user gain rights they shouldn't? | Authorization checks, least privilege |
If you can't name the trust boundaries for a feature, you're not ready to secure it. This is OWASP A04: Insecure Design — most breaches begin in design, not code.
eval() or innerHTML with user-provided dataThe rules below are the workflow; a concrete implementation of each lives in references/hardening-patterns.md. Open the section you need when you reach that code, not before.
Patterns: Injection, XSS, Access control.
httpOnly, secure, and sameSite: 'lax' or 'strict' (the CSRF defense; 'none' sends the cookie on cross-site requests), with a bounded maxAge.Pattern: Authentication.
default-src 'self' and is tightened, not loosened.* with credentials.passwordHash, reset tokens) before any response. Error bodies are generic; internals go to server logs only.Patterns: Misconfiguration, Sensitive data exposure.
Patterns: Schema validation, File upload.
Any URL the user influences — webhooks, import-from-URL, image proxies, link previews — can be aimed at internal services. Allowlist scheme and host, resolve all DNS records and reject any private or reserved address (loopback, link-local 169.254.169.254, private, unique-local, for IPv4 and IPv6), and forbid redirects. That check still has a DNS-rebinding TOCTOU gap: for high-risk surfaces, pin the resolved IP or put a filtering agent in front.
Pattern: SSRF.
A delete, move, or overwrite is only as safe as the value naming its target, and trust follows who wrote that value, not which channel delivered it: another process's command line is as attacker-controlled as a form field. A shape check proves well-formedness, not authorization. Before the call, require all three: the resolved target (symlinks resolved) sits under an allowlisted root; it is at least one level below that root; and it carries ownership evidence read before the operation. On refusal, log the rejected target and stop; never fall back to a broader default path.
Why the check is weaker than it reads (marker self-attestation, check/use races): Destructive paths. Worked code: ../../references/security-checklist.md.
Limit the API generally and auth endpoints strictly (about 10 attempts per 15 minutes). Once more than one process serves traffic, in-memory counters silently become max × instances, or never fire on serverless: back the limiter with a shared store.
Pattern: Rate limiting.
Secrets come from the environment. .env.example is committed with placeholders; real .env* files and key material are gitignored; grep the staged diff before committing. A secret that reaches a remote is compromised the moment it lands: rotate it first, then purge history.
Pattern: Secrets management.
packageManager (when present), the lockfile, and CI; stop on disagreement or competing lockfiles. Pin the manager version.npm audit fix --force or equivalent) automatically, since forced fixes may cross declared dependency ranges; preview, read changelogs, test each upgrade. Document every deferral with a reason and a review date.cross-env vs crossenv). Review new dependencies, lockfile diffs, and script-policy changes together: ownership, maintenance, release age, provenance, transitive graph. Verify registry signatures where supported (npm audit signatures, pnpm audit signatures) and treat their absence as a signal to investigate, not automatic proof of compromise (A06, LLM03).Triage decision tree: Dependency audit triage. Manager matrix and install-script gate: ../../references/security-checklist.md.
Hardening asks "can an attacker read it?" Privacy asks "should we hold it at all, and for how long?" The cheapest data to protect, breach, and comply over is the data you never collected; treat personal data as a liability to minimize.
observability-and-instrumentation skill makes the same point from the ops side).Classification table: Data classification. A privacy incident starts the breach-notification clock; run the postmortem with the debugging-and-error-recovery skill.
Calling an LLM — chatbots, summarizers, agents, RAG — adds a new attack surface; map it to the OWASP Top 10 for LLM Applications (2025):
eval, SQL, a shell, innerHTML, or a file path; parse defensively, validate against a schema, then encode.Pattern: LLM output handling.
Before sign-off, walk ../../references/security-checklist.md: it covers authentication, authorization, input, data protection and privacy, headers and CORS, dependencies and supply chain, AI/LLM, and error handling, plus the OWASP quick-reference tables.
| Rationalization | Reality |
|---|---|
| "This is an internal tool, security doesn't matter" | Internal tools get compromised. Attackers target the weakest link. |
| "We'll add security later" | Security retrofitting is 10x harder than building it in. Add it now. |
| "No one would try to exploit this" | Automated scanners will find it. Security by obscurity is not security. |
| "The framework handles security" | Frameworks provide tools, not guarantees. You still need to use them correctly. |
| "It's just a prototype" | Prototypes become production. Security habits from day one. |
| "Threat modeling is overkill here" | Five minutes of "how would I attack this?" prevents the design flaws no control can patch later. |
| "It's just LLM output, it's only text" | That "text" can be a SQL statement, a script tag, or a shell command. Treat it like any untrusted input. |
| "The audit passed, so the dependency is safe" | Audits match known advisories. They do not detect a newly malicious package or make unreviewed install scripts safe to execute. |
| "Collect it now, we might need it later" | Data you don't hold can't be breached, subpoenaed, or mis-deleted. "Might need it" is breach scope, not a purpose. |
| "We'll handle deletion requests manually" | Manual erasure misses backups, caches, and analytics copies. If the schema can't find a user's data, you can't honor the request — design for it. |
| "Compliance is legal's problem, not ours" | Export, deletion, retention, and consent are schema and code. Legal can't bolt them on after you've smeared PII across ten systems. |
*) originsevalAfter implementing security-relevant code:
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
API와 모듈 사이의 입출력을 정의하고 이름, 오류 형식, 입력 검증을 통일합니다. 기존 호출 측과의 호환성과 재시도로 인한 중복 처리도 고려합니다.
실제 브라우저에서 화면과 동작을 검증하고 오류, 통신, 로딩 속도를 조사합니다. 수정 전후의 스크린샷 비교와 접근성 확인도 지원합니다.
코드 변경 시 테스트, 타입 검사, 빌드를 자동 실행해 배포 전 품질 확인 절차를 마련합니다. GitHub Actions 설정부터 단계적 배포와 롤백 절차까지 다룹니다.
병합 전에 코드 변경을 정확성, 가독성, 설계, 보안, 성능의 다섯 기준으로 검토합니다. 필수 수정과 선택 제안을 구분하고 구체적인 개선 방법을 제시합니다.
동작을 바꾸지 않고 깊은 조건 분기, 긴 함수, 중복, 모호한 이름을 정리합니다. 기존 규칙과 테스트를 확인하고 가독성을 기준으로 작은 변경을 이어 갑니다.
프로젝트 품질 기준을 수치와 확인 방법으로 문서화합니다. 변경 내역에서 테스트 생략, 경고 억제, 기준 하향을 점검해 에이전트 개발의 품질을 유지합니다.