코드 감사: [프로젝트명]
[대괄호] 안의 내용을 모두 바꾸세요. 증거를 직접 확인했을 때만 체크하세요. 통과하지 못한 항목은 마지막 기록에 번호가 붙은 발견 사항이 되고, 치명적·높음 등급의 미해결 발견 사항이 없고 제품이 실제로 운영 중일 때만 감사를 통과합니다.
01범위
무엇을 감사하는지 정확히 고정하세요. 특정 커밋 없이 '앱'을 감사하면 다시 재현할 수 없습니다.
- 저장소: [URL]
- 커밋 또는 태그: [SHA 또는 릴리스 태그]
- 합의된 범위: [대조하는 PRD 버전 또는 기준선 번호]
- 환경: [운영 URL, 스토어 빌드, 또는 스테이징]
- 감사자와 날짜: [이름], [날짜]
02요구사항 커버리지
만든 것이 합의한 것과 맞나요? 고정된 범위에 비춰 요구사항을 하나씩 확인하세요.
- 모든 Must 요구사항에 인수 기준이 있다
- 모든 Must 요구사항에 그것을 가리키는 완료된 작업이 있다
- 모든 인수 기준 확인이 운영 중인 제품에서 통과한다
- 승인 후 바뀐 요구사항은 이전 문구와 새 문구와 함께 표시되어 있다
- 승인 후 제외된 요구사항은 삭제가 아니라 결정으로 기록되어 있다
- 커밋과 풀 리퀘스트가 요구사항 키를 참조한다
03접근 제어
작은 제품의 심각한 발견 사항은 대부분 여기서 나옵니다. 화면을 읽지 말고 ID를 바꾸고 세션을 지워 가며 시험하세요.
- 비공개 데이터를 읽거나 쓰는 모든 경로가 세션을 확인한다
- 관리 기능은 로그인 여부뿐 아니라 역할이나 권한을 확인한다
- URL이나 요청의 ID를 바꿔도 다른 계정의 데이터에 닿지 않는다
- API 토큰은 범위가 제한되고, 폐기하면 즉시 적용된다
- 비밀번호 재설정, 초대, 로그인 링크는 만료되며 한 번만 쓸 수 있다
04시크릿과 설정
현재 상태뿐 아니라 이력도 확인하세요. 나중 커밋에서 지운 키도 이미 공개된 것입니다.
- 저장소와 그 이력 어디에도 키, 토큰, 비밀번호가 없다
- 환경 변수 파일은 버전 관리에서 제외되어 있다
- 공개용 변수를 통해 서버 시크릿이 브라우저 번들에 노출되지 않는다
- 운영과 개발이 서로 다른 자격 증명을 쓴다
- 유출되었거나 공유된 자격 증명은 교체했다
05의존성
npm audit이나 OSV 같은 보안 권고 데이터베이스를 쓰고, 권고 ID를 기록하세요. 기억에 의존하지 마세요.
- 알려진 보안 권고를 확인하고, 발견된 것은 ID를 기록했다
- lockfile이 커밋되어 있고 빌드에서 사용된다
- 관리되지 않거나 버려진 패키지를 기록했다
- 새 의존성의 설치 스크립트를 검토했다
06입력 처리
사용자가 보낼 수 있는 모든 것은 신뢰할 수 없습니다. 헤더, 파일 이름, 웹훅 본문도 마찬가지입니다.
- 데이터베이스 쿼리는 매개변수화되어 있고, 문자열로 조립하지 않는다
- 사용자 입력에 대해 eval이나 동적 코드 실행을 하지 않는다
- 사용자 콘텐츠는 렌더링 전에 이스케이프한다
- 업로드는 형식과 크기를 검사하고 웹 루트 밖에 저장한다
- 사용자가 준 URL로 가는 서버 측 요청은 제한되어 있다
- 공개 양식에는 요청 제한이나 남용 방지가 있다
07돈의 흐름
여기 있는 것은 무엇보다 먼저 봅니다. 두 번 결제하거나 두 번 적립하는 버그는 운영되는 매시간 돈을 잃게 합니다.
- 결제와 주문 처리는 멱등적이다. 재시도해도 두 번 결제되지 않는다
- 웹훅 서명을 검증한 뒤에야 내용을 신뢰한다
- 가격과 금액은 서버에서 계산하고, 클라이언트 값을 쓰지 않는다
- 환불, 크레딧, 쿠폰은 동시 요청에서도 두 번 쓸 수 없다
08안정성과 운영
나쁜 날에 무슨 일이 생기는지, 그리고 누군가 알아챌 수 있는지.
- 오류가 누군가 실제로 보는 모니터링 도구로 보고된다
- 백업이 있고, 실제로 복구를 시도해 본 적이 있다
- 마이그레이션은 그에 의존하는 코드가 배포되기 전에 적용한다
- 예약 작업은 두 번 실행되어도 문제가 없다
09실제로 운영 중
팀 밖의 누구도 쓸 수 없는 것에 대한 감사는 끝난 것이 아닙니다.
- 배포되어 있고, 여기서 일하지 않는 사람도 접근할 수 있다
- 운영 URL이나 스토어 페이지를 기록했다
- 가입과 핵심 흐름이 로컬뿐 아니라 운영에서도 동작한다
10발견 사항 기록
통과하지 못한 확인 하나당 한 행. 돈이나 데이터에 영향을 주는 것부터 순서대로. 증거 없는 발견은 의견일 뿐입니다. 빼거나 증거를 확보하세요.
심각도: 치명적, 높음, 보통, 낮음, 정보
| ID | 심각도 | 위치 | 증거 | 재현 | 수정 제안 | 상태 |
|---|---|---|---|---|---|---|
| F-001 | [치명적] | [path/file.ts:42] | [문제를 보여 주는 것] | [절차] | [할 변경] | 미해결 |
| F-002 | [높음] | [경로 또는 파일] | [문제를 보여 주는 것] | [절차] | [할 변경] | 미해결 |
11판정
통과, 또는 한 번 더 반복. 부분 통과는 없습니다.
- 결과: [통과 / 재작업]
- 미해결 발견 사항: [심각도별 개수]
- 후속 작업: [수정 사항을 추적하는 곳]
- 다음 감사: [날짜 또는 계기]