Skip to content

코드 리뷰 프로세스: /code-review와 보안 감사

배우게 될 내용

코드 리뷰는 코드 품질과 보안을 보장하는 핵심 단계입니다. 이 튜토리얼에서는 다음을 배울 수 있습니다:

  • /code-review 명령어를 사용하여 코드 변경 사항을 자동으로 검사하기
  • ✅ code-reviewer agent와 security-reviewer agent의 차이점 이해하기
  • ✅ 보안 검사 체크리스트(OWASP Top 10) 활용하기
  • ✅ 일반적인 보안 취약점(SQL 인젝션, XSS, 하드코딩된 키 등) 탐지 및 수정하기
  • ✅ 코드 품질 표준(함수 크기, 파일 길이, 테스트 커버리지 등) 적용하기
  • ✅ 승인 기준(CRITICAL, HIGH, MEDIUM, LOW) 이해하기

현재 겪고 있는 문제

코드를 작성하고 커밋하려고 하는데:

  • ❌ 코드에 보안 취약점이 있는지 모릅니다
  • ❌ 코드 품질 문제를 놓치는 것이 걱정됩니다
  • ❌ 최적의 실천 방법을 따르고 있는지 확신이 없습니다
  • ❌ 수동 검사는 시간이 오래 걸리고 쉽게 놓치게 됩니다
  • ❌ 커밋 전에 문제를 자동으로 발견하고 싶습니다

Everything Claude Code의 코드 리뷰 프로세스가 이러한 문제를 해결합니다:

  • 자동화된 검사: /code-review 명령어가 모든 변경 사항을 자동으로 분석합니다
  • 전문화된 리뷰: code-reviewer agent는 코드 품질에 집중하고, security-reviewer agent는 보안에 집중합니다
  • 표준 분류: 문제는 심각도에 따라 분류됩니다(CRITICAL, HIGH, MEDIUM, LOW)
  • 상세한 제안: 각 문제에는 구체적인 수정 제안이 포함됩니다

이 기능을 사용할 때

코드를 커밋할 때마다 코드 리뷰를 실행해야 합니다:

  • ✅ 새로운 기능 코드 작성 완료 후
  • ✅ 버그 수정 후
  • ✅ 코드 리팩토링 후
  • ✅ API 엔드포인트 추가 시(security-reviewer 필수 실행)
  • ✅ 사용자 입력을 처리하는 코드(security-reviewer 필수 실행)
  • ✅ 인증/인가와 관련된 코드(security-reviewer 필수 실행)

모범 사례

습관을 들이세요: git commit 전에 항상 /code-review를 실행하세요. CRITICAL 또는 HIGH 문제가 있는 경우 수정 후 커밋하세요.

🎒 시작하기 전 준비사항

필요한 것:

  • Everything Claude Code가 설치되어 있음(아직 설치하지 않았다면 빠른 시작 참조)
  • 일부 코드 변경 사항(먼저 /tdd로 코드 작성 가능)
  • Git 기본 작업에 대한 이해

필요하지 않은 것:

  • 보안 전문가일 필요 없음(agent가 탐지해 드립니다)
  • 모든 보안 모범 사례를 기억할 필요 없음(agent가 알려드립니다)

핵심 개념

Everything Claude Code는 두 가지 전문 리뷰 agent를 제공합니다:

code-reviewer agent

코드 품질과 모범 사례에 집중, 다음을 검사합니다:

  • 코드 품질: 함수 크기(50줄 이상), 파일 길이(800줄 이상), 중첩 깊이(4레벨 이상)
  • 오류 처리: 누락된 try/catch, console.log 문
  • 코드 규격: 명명 규칙, 중복 코드, 불변 패턴
  • 모범 사례: 이모지 사용, ticket 없는 TODO/FIXME, 누락된 JSDoc
  • 테스트 커버리지: 새 코드에 테스트 누락

사용 시나리오: 모든 코드 변경 사항은 code-reviewer를 거쳐야 합니다.

security-reviewer agent

보안 취약점과 위협에 집중, 다음을 검사합니다:

  • OWASP Top 10: SQL 인젝션, XSS, CSRF, 인증 우회 등
  • 키 노출: 하드코딩된 API 키, 비밀번호, 토큰
  • 입력 검증: 누락되거나 부적절한 사용자 입력 검증
  • 인증 인가: 부적절한 인증 및 권한 검사
  • 의존성 보안: 오래되거나 알려진 취약점이 있는 의존성 패키지

사용 시나리오: 보안에 민감한 코드(API, 인증, 결제, 사용자 입력)는 security-reviewer를 거쳐야 합니다.

문제 심각도 등급

레벨의미커밋 차단 여부예시
CRITICAL심각한 보안 취약점 또는 주요 품질 문제❌ 반드시 차단하드코딩된 API 키, SQL 인젝션
HIGH중요한 보안 문제 또는 코드 품질 문제❌ 반드시 차단오류 처리 누락, XSS 취약점
MEDIUM중간 우선순위 문제⚠️ 주의하여 커밋 가능이모지 사용, JSDoc 누락
LOW경미한 문제✓ 나중에 수정 가능형식 불일치, 매직 넘버

따라하기: 첫 번째 코드 리뷰

1단계: 코드 변경 사항 생성하기

먼저 /tdd로 간단한 API 엔드포인트를 작성합니다(일부 보안 문제 포함):

bash
/tdd

Claude Code에 사용자 로그인 API를 만들도록 요청하면, 다음과 같은 코드가 생성됩니다:

typescript
// src/api/login.ts
export async function loginUser(email: string, password: string) {
  const query = `SELECT * FROM users WHERE email = '${email}'`  // ❌ SQL 인젝션 위험
  const user = await db.query(query)
  
  if (user.password === password) {  // ❌ 평문 비밀번호 비교
    const token = generateToken(user.id)
    console.log('User logged in:', { email, password })  // ❌ 로그에 비밀번호 유출
    return { token }
  }
}

이유 이 코드에는 여러 보안 취약점과 코드 품질 문제가 있어 코드 리뷰 기능을 시연하기에 적합합니다.

확인할 것: 코드 파일이 생성되었습니다.


2단계: 코드 리뷰 실행하기

이제 /code-review 명령어를 실행합니다:

bash
/code-review

이유/code-review는 자동으로 code-reviewer agent를 호출하여 커밋되지 않은 모든 변경 사항을 검사합니다.

확인할 것: agent가 코드를 분석한 후 리뷰 보고서를 출력합니다.


3단계: 리뷰 보고서 확인하기

code-reviewer는 다음과 유사한 보고서를 출력합니다:

markdown
# Code Review Report

## Critical Issues (Fix Immediately)

### 1. [CRITICAL] Hardcoded credentials
**File:** src/api/login.ts:3
**Issue:** Password logging in console
**Fix:** Remove password from logs, only log user ID

```typescript
// ❌ Bad
console.log('User logged in:', { email, password })

// ✓ Good
console.log('User logged in:', { email, userId: user.id })

2. [CRITICAL] SQL injection vulnerability

File: src/api/login.ts:2 Issue: String concatenation in SQL query Fix: Use parameterized queries

typescript
// ❌ Bad
const query = `SELECT * FROM users WHERE email = '${email}'`

// ✓ Good
const { data } = await supabase
  .from('users')
  .select('*')
  .eq('email', email)

High Issues (Fix Before Production)

3. [HIGH] Plaintext password comparison

File: src/api/login.ts:4 Issue: Password stored in plaintext Fix: Use bcrypt to hash passwords

typescript
// ❌ Bad
if (user.password === password) {

// ✓ Good
import bcrypt from 'bcrypt'
const isValid = await bcrypt.compare(password, user.password)

Recommendations

  1. Add input validation for email format
  2. Add rate limiting to prevent brute force attacks
  3. Use JWT tokens instead of generating custom tokens

Approval Status

❌ BLOCKED - 2 CRITICAL issues found

Please fix all CRITICAL and HIGH issues before committing.


**이유**
보고서는 심각도에 따라 분류되며, 각 문제에는 위치, 설명, 수정 제안 및 코드 예시가 포함됩니다.

**확인할 것**: 모든 문제와 수정 제안을 지적하는 명확한 리뷰 보고서입니다.

---

### 4단계: 문제 수정하기

보고서에 따라 코드를 수정합니다:

```typescript
// src/api/login.ts
import bcrypt from 'bcrypt'
import { z } from 'zod'

const LoginSchema = z.object({
  email: z.string().email(),
  password: z.string().min(8)
})

export async function loginUser(input: unknown) {
  // 입력 검증
  const validated = LoginSchema.parse(input)
  
  // 파라미터화된 쿼리(SQL 인젝션 방지)
  const { data: user } = await supabase
    .from('users')
    .select('*')
    .eq('email', validated.email)
    .single()
  
  if (!user) {
    throw new Error('Invalid credentials')
  }
  
  // 해시된 비밀번호 비교
  const isValid = await bcrypt.compare(validated.password, user.password_hash)
  
  if (isValid) {
    const token = generateToken(user.id)
    console.log('User logged in:', { email: validated.email, userId: user.id })
    return { token }
  }
  
  throw new Error('Invalid credentials')
}

이유 모든 CRITICAL 및 HIGH 문제를 수정하고, 입력 검증과 해시된 비밀번호 비교를 추가합니다.

확인할 것: 코드가 업데이트되어 보안 취약점이 제거되었습니다.


5단계: 다시 리뷰하기

/code-review를 다시 실행합니다:

bash
/code-review

이유 모든 문제가 수정되었는지 확인하고 코드를 커밋할 수 있는지 확인합니다.

확인할 것: 다음과 유사한 통과 보고서입니다:

markdown
# Code Review Report

## Summary

- **Critical Issues:** 0 ✓
- **High Issues:** 0 ✓
- **Medium Issues:** 1 ⚠️
- **Low Issues:** 1 💡

## Medium Issues (Fix When Possible)

### 1. [MEDIUM] Missing JSDoc for public API
**File:** src/api/login.ts:9
**Issue:** loginUser function missing documentation
**Fix:** Add JSDoc comments

```typescript
/**
 * Authenticates a user with email and password
 * @param input - Login credentials (email, password)
 * @returns Object with JWT token
 * @throws Error if credentials invalid
 */
export async function loginUser(input: unknown) {

Low Issues (Consider Fixing)

2. [LOW] Add rate limiting

File: src/api/login.ts:9 Issue: Login endpoint lacks rate limiting Fix: Add express-rate-limit middleware

typescript
import rateLimit from 'express-rate-limit'

const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 5 // 5 attempts per window
})

app.post('/api/login', loginLimiter, loginUser)

Approval Status

✅ APPROVED - No CRITICAL or HIGH issues

Note: Medium and Low issues can be fixed in follow-up commits.


**확인할 것**: 리뷰가 통과되어 코드를 커밋할 수 있습니다.

---

### 6단계: 보안 전문 리뷰(선택사항)

코드가 API 엔드포인트, 인증, 결제 등 보안에 민감한 기능을 포함하는 경우, security-reviewer를 특별히 호출할 수 있습니다:

```bash
/security-reviewer

이유 security-reviewer는 더 깊은 OWASP Top 10 분석을 수행하여 더 많은 보안 취약점 패턴을 검사합니다.

확인할 것: OWASP 분석, 의존성 취약점 검사, 보안 도구 권장 사항 등이 포함된 상세한 보안 리뷰 보고서입니다.


체크포인트 ✅

위 단계를 완료하면 다음을 할 수 있어야 합니다:

  • /code-review 명령어를 실행할 수 있습니다
  • ✅ 리뷰 보고서의 구조와 내용을 이해합니다
  • ✅ 보고서에 따라 코드 문제를 수정할 수 있습니다
  • ✅ CRITICAL 및 HIGH 문제는 반드시 수정해야 한다는 것을 알고 있습니다
  • ✅ code-reviewer와 security-reviewer의 차이점을 이해합니다
  • ✅ 커밋하기 전에 리뷰하는 습관이 있습니다

주의사항

일반적인 실수 1: 코드 리뷰 건 뛰기

문제: 코드가 간단하다고 생각하여 리뷰 없이 바로 커밋합니다.

결과: 보안 취약점을 놓칠 수 있어 CI/CD에서 거부되거나 프로덕션 사고가 발생할 수 있습니다.

올바른 방법: 습관적으로 커밋 전에 /code-review를 실행하세요.


일반적인 실수 2: MEDIUM 문제 무시하기

문제: MEDIUM 문제를 보고 무시하여 쌓아둡니다.

결과: 코드 품질이 저하되고 기술 부채가 쌓여 나중에 유지보수가 어려워집니다.

올바른 방법: MEDIUM 문제가 커밋을 차단하지는 않지만, 합리적인 시간 내에 수정해야 합니다.


일반적인 실수 3: SQL 인젝션을 수동으로 수정하기

문제: 파라미터화된 쿼리를 사용하는 대신 직접 문자열 이스케이프를 작성합니다.

결과: 이스케이프가 완전하지 않아 여전히 SQL 인젝션 위험이 있습니다.

올바른 방법: 항상 ORM 또는 파라미터화된 쿼리를 사용하고, SQL을 수동으로 연결하지 마세요.


일반적인 실수 4: 두 리뷰어를 혼동하기

문제: 모든 코드에 code-reviewer만 실행하고 security-reviewer를 무시합니다.

결과: API, 인증, 결제 관련 코드에서 보안 취약점이 누락될 수 있습니다.

올바른 방법:

  • 일반 코드: code-reviewer만으로 충분함
  • 보안에 민감한 코드: security-reviewer도 반드시 실행해야 함

강의 요약

코드 리뷰 프로세스는 Everything Claude Code의 핵심 기능 중 하나입니다:

기능agent검사 내용심각도
코드 품질 리뷰code-reviewer함수 크기, 오류 처리, 모범 사례HIGH/MEDIUM/LOW
보안 리뷰security-reviewerOWASP Top 10, 키 유출, 인젝션 취약점CRITICAL/HIGH/MEDIUM

핵심 요점:

  1. 커밋할 때마다 /code-review 실행하기
  2. CRITICAL/HIGH 문제는 커밋 전에 반드시 수정해야 함
  3. 보안에 민감한 코드는 security-reviewer를 거쳐야 함
  4. 리뷰 보고서에는 상세한 위치와 수정 제안이 포함됨
  5. 습관 들이기: 리뷰 → 수정 → 다시 리뷰 → 커밋

다음 강의 예고

다음 강의에서는 **Hooks 자동화**를 배웁니다.

배울 내용:

  • Hooks란 무엇이며 개발 프로세스를 자동화하는 방법
  • 15개 이상의 자동화된 Hook 사용 방법
  • 프로젝트 요구사항에 맞게 Hooks를 사용자 정의하는 방법
  • SessionStart, SessionEnd, PreToolUse 등의 Hook 사용 사례

부록: 소스 코드 참조

소스 코드 위치 보기

업데이트 날짜: 2026-01-25

기능파일 경로행 번호
---------
---------
---------
---------
---------

주요 상수:

  • 함수 크기 제한: 50줄(code-reviewer.md:47)
  • 파일 크기 제한: 800줄(code-reviewer.md:48)
  • 중첩 깊이 제한: 4레벨(code-reviewer.md:49)

주요 함수:

  • /code-review: code-reviewer agent를 호출하여 코드 품질 리뷰 수행
  • /security-reviewer: security-reviewer agent를 호출하여 보안 감사 수행
  • git diff --name-only HEAD: 커밋되지 않은 변경 파일 가져오기(code-review.md:5)

승인 기준(code-reviewer.md:90-92):

  • ✅ Approve: CRITICAL 또는 HIGH 문제 없음
  • ⚠️ Warning: MEDIUM 문제만 있음(주의하여 머지 가능)
  • ❌ Block: CRITICAL 또는 HIGH 문제 발견