본문으로 건너뛰기
페이지 목차
이 페이지에서 검색

AI 드리븐

이 페이지에 묻기

AI 드리븐 · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.

생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.

AI · DEVELOPMENT

AI 드리븐

생성 수정

요구사항과 역할 정의부터 구현·검증·배포·운영까지, AI와 함께 개발하며 사람이 판단할 기준을 정리합니다.

26개 문서 · 2일차 · 15 / 26

14차시 · 검증 ② 보안 점검과 차단

지도 위치 : 2일차 · 구현과 검증 · 검증 | 이전: 13차시 검증 ① 코드·동작 점검 | 다음: 15차시 인프라 역할: 설정의 원칙 키워드 : 흔한 보안 사고 유형, 비밀값·개인정보 보호, 위반 차단 장치

이 차시를 다 읽으면

  1. 흔한 보안 사고 일곱 가지 를 대고, 각각을 막는 법과 코드 없이 시험하는 법을 말할 수 있다.
  2. 비밀값 을 유와 종차로 정의하고, 두지 않을 곳 다섯 군데와 이미 커밋했을 때 가장 먼저 할 일 을 말할 수 있다.
  3. 개인정보 보호 원칙 다섯 가지를 클래스온에 적용할 수 있다.
  4. 점검과 차단 을 구별하고, 차단 장치를 에이전트 · 커밋 · 자동 검사 세 단계에 배치할 수 있다.
  5. 코드를 읽지 않고 할 수 있는 보안 행동 시험 네 가지 를 직접 수행할 수 있다.

0. 이 차시의 판별 축

#축왼쪽 (0)오른쪽 (1)이 축으로 갈리는 것큰 축 (README 5장)
1누가 막는가부탁 — 지침 파일의 "키를 코드에 넣지 마"강제 — 권한 차단, 커밋 스캔, 자동 검사 관문에이전트가 잊어도 지켜지는가부탁 ↔ 강제 (②의 파생)
2언제 잡는가점검 — 일어난 뒤에 찾음차단 — 일어나지 못하게 함놓칠 수 있는가이 차시의 축 (부탁 ↔ 강제의 파생)
3되돌릴 수 있는가코드의 실수 — 고치면 됨유출된 비밀값 · 개인정보 — 회수 불가사고 뒤 할 수 있는 일되돌릴 수 있는가
4안전을 무엇으로 판정하는가"보안 점검 완료, 안전합니다"시도한 공격과 그 결과보고를 믿을 수 있는가증거 ↔ 주장

이 차시가 답하는 질문은 "코드를 읽지 못하는 사람이 보안을 어떻게 지키는가" 입니다. 보안은 이 방식에서 가장 취약한 영역 입니다. AI가 만든 보안 구멍은 화면에 보이지 않고, 코드를 읽지 못하면 찾을 방법이 거의 없습니다. 그래서 답은 축 2의 오른쪽, 차단 입니다. 점검은 놓칠 수 있지만, 차단은 내가 몰라도 작동합니다. 앞에서 배운 강제 사다리(2차시)를 12차시의 데이터에 이어 이번에는 보안에 적용합니다.


1. 흔한 보안 사고 유형

보안 사고 — [서비스 사고]인데, [ 허락받지 않은 사람이 데이터를 보거나, 바꾸거나, 내 권한으로 행동하게 된다 ]는 점에서 기능이 틀리게 동작하는 일반 버그와 구별된다.

보안 사고 대부분은 고급 해킹이 아니라 흔하고 이름이 붙어 있는 실수 에서 납니다. AI는 "일단 돌아가게" 만드는 쪽으로 기울어 있어서, 아래 실수를 쉽게 만듭니다.

유형예막는 법코드 없이 시험
비밀값 유출API 키를 코드에 넣고 GitHub에 올림환경변수, .gitignore, 커밋 전 스캔 (2 · 4절)저장소 파일 목록 확인
인가 누락예약 ID만 바꾸면 남의 예약이 보임 (10차시)모든 조회 · 수정에서 "본인 것인가"계정 두 개로 주소 숫자 바꾸기
SQL 인젝션검색어에 SQL을 섞어 DB를 조작값과 SQL을 분리해 전달(파라미터 바인딩), 문자열로 SQL 조립 금지(리뷰 역할에게 위임)
XSS (스크립트 주입)클래스 설명에 스크립트를 넣어 다른 사용자 브라우저에서 실행출력할 때 글자로 바꿔 표시(이스케이프), HTML 직접 삽입 금지입력란에 스크립트 넣기
과한 정보 노출에러 응답에 SQL, 파일 경로, 내부 오류 기록운영 환경에서는 일반 메시지만일부러 에러 내기
취약한 의존성오래된 패키지의 알려진 취약점의존성 스캔 (npm audit 등)자동 검사 결과 확인 (19차시)
존재하지 않는 패키지AI가 그럴듯한 이름을 지어내고, 공격자가 그 이름으로 악성 패키지를 등록해 둠새 패키지는 공식 페이지를 확인한 뒤 추가설치 목록과 공식 주소 요구

⚠️ 마지막 유형은 AI 시대에 새로 생긴 위험입니다. 그래서 README 9.4의 위험 신호에 "새 패키지를 추가했다" 가 들어 있습니다.


2. ⭐ 비밀값 보호

2.1 정의

비밀값 (Secret) — [설정값]인데, [ 노출되면 남이 내 권한으로 행동할 수 있다 ]는 점에서 노출되어도 괜찮은 일반 설정값(서버 주소, 공개 키)과 구별된다.

예: 결제 비밀 키, DB 비밀번호, 외부 API 키, 로그인 증표 서명 키.

2.2 두지 않을 곳과 둘 곳

원칙: 비밀값은 코드에도, Git에도, 화면에도, 로그에도, AI와의 대화에도 두지 않는다.

로컬:   .env 파일 (Git 제외) ← .env.example에는 이름만 (9차시)
배포:   배포 플랫폼의 비밀값 설정 또는 비밀값 관리 서비스 (15 · 21차시)
코드:   process.env.PG_SECRET_KEY 처럼 이름으로만 참조

🔍 읽는 포인트 : 첫 줄의 다섯 곳 이 금지 목록이고, 코드에는 이름만 나옵니다. 값이 보이면 사고입니다.

두지 않을 곳왜
코드Git에 올라가면 기록에 영원히 남음
화면 · 공개 환경변수사용자 브라우저로 그대로 전달 (11차시)
로그로그를 보는 모든 사람 · 도구에 노출
AI와의 대화대화 기록과 외부 서비스로 넘어갈 수 있음

⚠️ AI에게 키를 보여 주지 마세요. 에이전트는 파일을 읽을 수 있으므로 .env를 읽으면 그 내용이 대화에 들어갑니다. 설정을 확인하고 싶으면 값 대신 "PG_SECRET_KEY라는 이름의 환경변수가 설정돼 있는지만 확인해줘" 라고 요청합니다(README 9.2의 "비밀값 입력은 내가 직접").

2.3 이미 커밋했다면 — 되돌릴 수 없다

하고 싶은 것충분한가
파일에서 키를 지우고 다시 커밋❌ Git 기록 에 남아 있음
저장소를 비공개로 바꿈❌ 이미 누가 복사했는지 알 수 없음
⭕ 키를 즉시 폐기하고 새로 발급유일하게 확실한 조치. 그다음 기록 정리

0절 축 3의 오른쪽입니다. 유출된 값은 회수할 수 없으므로, 그 값을 쓸모없게 만드는 것 이 먼저입니다.

2.4 반례

대상왜 문제인가
"테스트용 키니까 코드에 넣어도 괜찮아"테스트 키가 실제 키로 바뀌는 순간을 놓칩니다. 그리고 테스트 키로도 남이 내 계정의 시험 환경을 씁니다
.env.example에 진짜 값을 채워 둠.env.example은 Git에 올라가는 파일. 이름만

3. 개인정보 보호

개인정보 — [데이터]인데, [ 살아 있는 특정 개인을 알아볼 수 있게 한다 ]는 점에서 클래스 제목 · 가격 같은 서비스 데이터와 구별된다. 클래스온에서는 수강생 이름 · 연락처 · 이메일이 해당합니다.

원칙클래스온 적용
최소 수집예약에 꼭 필요한 이름 · 연락처만. 생년월일 · 주소는 받지 않음
최소 노출운영자 화면에서 연락처는 010-****-5678로 가림. 수업 당일만 전체 공개 등
로그 제외요청 전체를 로그에 찍지 않음. 이메일 · 전화번호는 가려서(마스킹)
접근 통제다른 공방 운영자는 우리 공방 예약자를 볼 수 없음 — 운영자에게도 인가 (10차시)
보관 기한법적 의무 기간이 지나면 삭제

한국에서 서비스한다면 개인정보 보호법이 적용됩니다. 실제 출시 전에는 개인정보 처리방침과 법적 의무를 별도로 확인하세요. 개인정보를 대량으로 다루는 단계라면 처리 흐름을 전문가에게 한 번 확인받는 것을 권합니다(README 9.6).


4. ⭐ 점검과 차단

4.1 정의와 경계

차단 장치 — [보안 장치]인데, [ 위반이 일어나기 전에 시스템이 그 행동 자체를 거부한다 ]는 점에서 일어난 위반을 나중에 찾아내는 점검과 구별된다.

점검 (찾기)차단 (못 하게 하기)
0절 축 2왼쪽오른쪽
예보안 리뷰 역할, 출시 전 감사권한 거부, 커밋 거부, 병합 거부
놓치면사고사람이 몰라도 막힘
코드를 읽지 않는 사람에게보조필수

4.2 세 단계에 배치하기

① 에이전트 단계 — 권한으로 비밀 파일 접근 차단

// .claude/settings.json
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  }
}

🔍 읽는 포인트 : deny 목록에 .env가 있는지 만 보면 됩니다. 있으면 에이전트는 그 파일을 읽으려 해도 거부당합니다.

② 커밋 단계 — 비밀값 스캔 (18차시)

  • gitleaks 같은 도구를 커밋 직전 검사로 실행해, 키 모양의 문자열이 있으면 커밋 자체를 거부

③ 자동 검사 단계 — 의존성 · 코드 스캔 (19차시)

  • 변경 요청(PR)마다 취약점 스캔, 통과하지 못하면 병합 불가

④ 저장소 설정 — 남이 대신 감시

  • GitHub 저장소의 Settings → Code security에서 비밀값 스캔(secret scanning)과 Dependabot 알림을 켜면, 코드를 읽지 않아도 GitHub가 감시하고 알려 줍니다. (메뉴 위치는 바뀔 수 있으니 공식 문서 확인)

앞으로 다시 만납니다 — ②는 18차시에서 커밋 전 검사로, ③은 19차시에서 자동 검사 관문으로 실제로 설치합니다. 이 차시에서는 어느 단계에 무엇을 둘지 만 정합니다.

4.3 점검 역할 — 그래도 찾아야 하는 것

차단은 알려진 모양 만 막습니다. 인가 누락처럼 모양이 일정하지 않은 문제는 점검으로 찾습니다.

# .claude/agents/security-reviewer.md
tools: Read, Grep, Glob
점검: 1절 표의 일곱 유형 전부. 특히 하드코딩된 키 모양 문자열, 인가 확인 없는 조회,
      문자열로 조립한 SQL, 로그에 찍히는 개인정보, 새로 추가된 패키지의 실재 여부.
보고: [심각도 | 파일:줄 | 유형 | 공격 시나리오 한 줄 | 수정 제안]

🔍 읽는 포인트 : tools:에 Write · Edit가 없음 = 읽기 전용. 13차시의 리뷰어와 같은 원칙입니다.

공격자 역할 시키기 — 점검을 "읽고 판단"에서 "시도하고 결과 보기"로 바꾸는 방법입니다.

너는 이 서비스를 공격하려는 사람이다. 방금 만든 기능에서 돈을 덜 내거나,
남의 정보를 보거나, 데이터를 망가뜨릴 방법을 3가지 찾아줘.
각각 로컬에서 실제로 시도해 보고 [방법 | 시도한 명령 | 결과 | 막혔나?] 표로 보고해줘.

💡 비유는 마지막에 — 점검은 경비원의 순찰 , 차단은 잠긴 문 입니다. 순찰은 놓칠 수 있지만 잠긴 문은 경비원이 졸아도 잠겨 있습니다. 둘 다 두되, 먼저 문을 잠급니다.


5. 클래스온에 적용하면 — 위험 지도

클래스온의 자산노리는 사고차단점검 · 시험
결제 비밀 키비밀값 유출권한 deny, 커밋 스캔저장소 파일 목록
수강생 연락처인가 누락, 로그 노출서버 인가 (10차시)계정 두 개 시험, 로그 확인
클래스 설명 입력란 (운영자가 씀)XSS출력 이스케이프스크립트 입력 시험
에러 응답정보 노출운영 환경 일반 메시지일부러 에러 내기
패키지 목록취약 · 가짜 패키지자동 스캔 (19차시)새 패키지 공식 주소 요구

6. 실습 — 맡기고 검수하기

지시

1. .claude/settings.json에 4.2의 deny 규칙을 넣고, 설정 파일의 변경 전후 차이를 보여줘.
   그다음 .env를 읽으려고 시도해 보고, 거부된 메시지 원문을 붙여줘.
2. security-reviewer 역할로 1절의 일곱 유형을 점검하고 [심각도 | 파일:줄 | 유형 | 공격 시나리오] 표로 보고해줘.
3. 지금까지 추가된 패키지 전체를 [이름 | 이유 | 공식 페이지 주소] 표로 보여줘.
4. 공격자 역할로 4.3의 지시를 수행해줘.
키 값은 어떤 경우에도 출력하지 말고, 환경변수는 "이름이 설정돼 있는지"만 확인해.

받을 증거

  • deny 설정 변경 전후 차이와 .env 읽기 거부 메시지 원문
  • 점검 표, 패키지 표(공식 주소 포함), 공격 시도 표와 각 시도의 실행 출력

내가 직접 확인할 것

볼 것 (행동 시험)이걸로 아는 것 / 왜 내가 보는가
계정 두 개를 만들고, A로 예약한 뒤 그 예약 주소를 B로 로그인해서 연다. 주소의 숫자도 1씩 바꿔 본다 → 접근 거부 여야 정상인가 누락. 가장 흔한 보안 사고를 내 눈으로
클래스 설명이나 이름 입력란에 <script>alert(1)</script> 입력 → 글자 그대로 보이고 알림 창이 뜨지 않아야 정상XSS
일부러 잘못된 주소나 이상한 값을 넣어 에러를 냄 → 일반 안내 문구만 보여야 정상정보 노출 (파일 경로 · SQL이 보이면 사고)
터미널에서 git ls-files | grep -i env → .env.example만 나와야 정상비밀값 커밋. .env가 나오면 2.3대로 키 폐기부터
패키지 표의 공식 주소를 직접 열어 실제로 있는지존재하지 않는 패키지 (1절)
GitHub 저장소 설정에서 비밀값 스캔 · Dependabot이 켜져 있는지내가 몰라도 대신 감시하는 장치 (4.2 ④)

부록 A. 스스로 확인하기

#질문답이 있는 곳
1보안 사고를 일반 버그와 구별하면? 흔한 유형 일곱 가지는?1
2"존재하지 않는 패키지"가 왜 AI 시대의 위험인가?1
3비밀값을 유와 종차로 정의하고, 두지 않을 곳을 대면?2.1, 2.2
4비밀 키를 커밋했을 때 가장 먼저 할 일과, 파일 삭제로 부족한 이유는?2.3
5AI에게 키를 보여 주지 않고 설정을 확인하는 방법은?2.2
6개인정보 원칙 다섯 가지를 클래스온에 적용하면?3
7점검과 차단은 어떻게 다르고, 왜 차단이 먼저인가?4.1
8차단 장치를 어느 단계에 무엇으로 두는가?4.2
9차단이 있어도 점검 역할이 필요한 이유는?4.3

부록 B. 자주 하는 실수

실수바로잡기
"테스트용 키니까 코드에 넣어도 괜찮다"❌ 비밀값은 코드에 두지 않습니다 (2.4)
키를 커밋한 뒤 파일만 지운다❌ Git 기록에 남습니다. 키 폐기 · 재발급이 먼저 (2.3)
에이전트에게 .env 내용을 보여 주며 "이 설정 맞아?"❌ 이름이 설정됐는지만 확인시킵니다 (2.2)
보안 점검을 출시 직전에 한 번만⚠️ 차단 장치를 처음부터 (4.2)
AI가 추가한 패키지 이름을 확인하지 않는다❌ 공식 주소를 받아 직접 엽니다 (1, 6)
"보안 점검 완료, 안전합니다"를 그대로 받는다⭕ 시도한 공격과 결과 표를 받습니다 (4.3)

부록 C. NotebookLM 복습 프롬프트

이 14차시 노트만 근거로 6문제를 내줘. 비전공자 기준으로.
"흔한 보안 사고 유형", "비밀값을 커밋했을 때의 순서(되돌릴 수 없음)", "점검과 차단의 차이", "코드 없이 하는 보안 행동 시험"은 반드시 포함해줘.
답은 내가 답한 다음에 채점하고, 틀린 이유를 노트의 절 번호를 근거로 설명해줘.