13강

보안·민감정보·권한 관리

4 조회 1

.env 보호·시크릿 유출 방지·권한 최소화·감사 로그까지 — Claude Code 자동화에서 민감 정보를 안전하게 다루는 실전 체크리스트.

보안·민감정보·권한 관리 — AI 자동화의 안전망

Claude Code가 파일을 읽고 터미널을 실행한다는 것은 프로젝트의 모든 파일에 접근할 수 있다는 의미입니다. API 키, DB 비밀번호, 사용자 데이터 — 잘못 관리하면 AI 도구 자체가 보안 위협이 됩니다. 이 강에서는 Claude Code를 안전하게 사용하기 위한 실전 체크리스트와 설정을 다룹니다.

민감 정보 노출 방지 — 첫 번째 원칙

# .gitignore 확인 (절대 커밋 금지 파일)
.env.local
.env.production
*.pem
*.key
secrets/

# Claude Code에게 읽기 금지 목록 설정
# .claude/settings.json
{
  "permissions": {
    "deny": [
      "Read(.env*)",        // .env 계열 파일 읽기 차단
      "Read(*.pem)",        // 인증서 파일 차단
      "Read(secrets/*)"     // secrets 폴더 차단
    ]
  }
}

이 설정 없이도 Claude는 보통 민감 정보를 의도적으로 노출하지 않지만, 실수로 로그에 포함되거나 코드에 하드코딩하는 경우를 방지합니다.

하드코딩 감지 — Pre-commit Hook

# .claude/settings.json — 커밋 전 자동 스캔
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if echo '$COMMAND' | grep -q 'git commit'; then git diff --cached | grep -E '(sk-ant-|ghp_|AKIA|password\\s*=|secret\\s*=)' && echo 'BLOCKED: 민감 정보 감지됨' >&2 && exit 1 || true; fi"
          }
        ]
      }
    ]
  }
}

Anthropic API 키(sk-ant-), GitHub 토큰(ghp_), AWS 키(AKIA) 패턴을 커밋 전에 자동 차단합니다.

환경변수 관리 패턴

# 올바른 환경변수 사용 방법
// ✅ 서버 코드에서만 사용
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY
// ❌ 클라이언트 컴포넌트에서 NEXT_PUBLIC_ 없이 사용 불가
// ❌ 코드에 직접 하드코딩

# Claude에게 환경변수 관련 지시
"환경변수가 필요할 때:
 1. 값을 코드에 직접 쓰지 말 것
 2. process.env.[KEY_NAME] 형식으로 참조
 3. .env.example에 키 이름(값 없이)만 추가
 4. README나 .env.example에 설명 추가"

Supabase RLS — 데이터 접근 제어

"새 테이블 생성 시 RLS 정책을 함께 작성해줘.

 테이블: user_documents
 요구사항:
 - 본인 문서만 SELECT 가능
 - 본인 문서만 INSERT/UPDATE/DELETE 가능
 - 관리자(admin 역할)는 전체 접근
 
 RLS 정책 SQL을 마이그레이션 파일에 포함해줘."
-- Claude가 생성하는 RLS 정책 예시
ALTER TABLE user_documents ENABLE ROW LEVEL SECURITY;

CREATE POLICY "users_own_documents" ON user_documents
  FOR ALL USING (auth.uid() = user_id);

CREATE POLICY "admin_all_documents" ON user_documents
  FOR ALL USING (
    EXISTS (
      SELECT 1 FROM profiles
      WHERE id = auth.uid() AND role = 'admin'
    )
  );

Server Action 인증 강제

# CLAUDE.md에 명시
모든 관리자 Server Action은 utils/admin-auth.ts의 
getAdminInfo()를 첫 줄에 호출해야 함.
인증 없이 DB를 수정하는 Server Action은 절대 금지.

# Claude가 생성하는 올바른 패턴
export async function deleteJob(jobId: string) {
  const admin = await getAdminInfo()  // ← 인증 먼저
  if (!admin) return { success: false, message: '권한 없음' }

  const supabase = createAdminClient() as any
  const { error } = await supabase.from('jobs').delete().eq('id', jobId)
  // ...
}

감사 로그 — 누가 무엇을 했는지

"중요한 데이터 변경 작업에 감사 로그를 추가해줘.

 대상: 
 - 공고 삭제 (deleteJob)
 - 사용자 계정 정지 (suspendUser)
 - 관리자 권한 변경 (updateAdminRole)

 로그 형식:
 admin_logs 테이블에 기록:
 {
   action: 'DELETE_JOB',
   admin_id: admin.id,
   target_id: jobId,
   details: { job_title, company },
   created_at: now()
 }"

보안 체크리스트 슬래시 명령

# .claude/commands/security-check.md
보안 점검을 실행해줘.

1. 하드코딩된 민감 정보 스캔
   git grep -E "(sk-|ghp_|password\s*=|secret\s*=)" -- "*.ts" "*.tsx"

2. 인증 없는 Server Action 확인
   app/actions/ 에서 getAdminInfo() 없이 DB 수정하는 함수

3. RLS 비활성화 테이블 확인
   Supabase MCP로 RLS 꺼진 테이블 목록 조회

4. NEXT_PUBLIC_ 변수에 민감 정보 포함 여부
   process.env.NEXT_PUBLIC_ 사용처 중 API 키류

결과를 security-report.md로 저장.
보안은 "나중에 추가하는 것"이 아닙니다. CLAUDE.md에 보안 규칙을 명시하고, settings.json에 하드코딩 차단 Hook을 설정하고, 모든 Server Action에 인증 패턴을 강제하면 Claude가 처음부터 보안을 고려한 코드를 작성합니다. AI 도구의 속도를 살리면서 보안을 유지하는 핵심은 규칙을 자동화하는 것입니다.

핵심 정리

  • deny 권한으로 .env 파일 읽기 차단 + PreToolUse Hook으로 커밋 전 시크릿 패턴 자동 스캔
  • CLAUDE.md에 Server Action 인증 강제 명시 — getAdminInfo() 없는 DB 수정 Server Action 패턴 차단
  • /security-check 슬래시 명령으로 정기 보안 점검 자동화 — RLS 비활성 테이블, 하드코딩, NEXT_PUBLIC_ 민감 정보 일괄 확인

관련 검색어  ·  클로드 코드 보안  ·  AI 개발 보안  ·  Claude Code 민감 정보  ·  클로드 코드 완벽 마스터  ·  Supabase RLS  ·  API 키 보호

채용정보
공지사항
인사이트
MY