튜토리얼

Actor-Critic 워크플로로 보안 코드 생성

IBM Bob을 사용하여 보안 규칙을 구성하고 actor-critic 패턴을 적용하여 정적 분석 도구에 도달하기 전에 보안 프레임워크를 충족하는 Python 코드를 생성합니다.

IBM Bob은 기존 워크플로를 강화하는 AI SDLC(Software Development Lifecycle) 파트너입니다. 이 튜토리얼에서는 Bob을 사용하여 다음을 수행합니다:

  • 보안 규칙 구성: 프로젝트의 모든 작업에서 Bob이 적용하는 IBM 보안 표준이 포함된 .bob/rules/security.md 파일 생성
  • 쌍을 이루는 스킬 생성: 보안을 준수하는 Python 코드를 작성하는 Actor 스킬과 게시된 표준에 대해 이를 검증하는 Critic 스킬 구축
  • 컨텍스트 멘션 사용: @를 사용하여 특정 파일을 프롬프트에 첨부하여 Bob이 중요한 코드에 집중하도록 함
  • Actor-Critic 워크플로 실행: 부모 에이전트에게 코드를 생성하는 Actor 하위 에이전트와 NIST SP 800-53, OWASP ASVS 및 CWE Top 25에 대해 독립적으로 검토하는 Critic 하위 에이전트를 조율하도록 지시

Bob은 규칙을 사용하여 프로젝트 수준 또는 전역적으로 보안을 적용합니다. 규칙은 Bob이 한 줄을 작성하기 전에 안티 패턴을 방지하고, Actor는 준수를 구축하며, Critic은 격리된 컨텍스트에서 독립적으로 검증합니다. 결과는 정적 분석 도구(SAST)에 도달하기 전에 깨끗한 출력입니다.

IBM Bob 또는 일반적인 AI 지원 워크플로 개념에 익숙하지 않은 경우 IBM Bob 시작 튜토리얼을 검토하세요.

전제 조건

시나리오

Galaxium Travels는 고객이 여행을 관리하는 데 사용하는 애플리케이션을 유지 관리합니다. 보안 취약점에 대해 코드베이스를 감사한 후 동일한 클래스의 문제를 다시 도입하지 않고 새로운 기능을 구현해야 합니다. 정적 분석 도구에 의존하여 사후에 문제를 감지하는 것은 보안 문제가 주기 후반에 발견된다는 것을 의미합니다 — 수정하는 데 더 많은 비용이 드는 시기입니다. Galaxium Travels 보안 표준, NIST SP 800-53 및 OWASP ASVS 요구 사항을 처음부터 충족하는 새로운 Python 코드를 작성하기 위한 반복 가능한 프로세스가 필요합니다 — 생성 후가 아니라 생성 중에 보안을 적용하는 워크플로입니다.

이 튜토리얼에서는 IBM Bob을 사용하여 모든 작업에 적용되는 프로젝트 전체 보안 규칙을 구성한 다음 두 개의 쌍을 이루는 스킬을 생성합니다 — 보안을 준수하는 코드를 작성하는 Actor와 이를 독립적으로 검증하는 Critic입니다. 스킬을 하위 에이전트로 조율하여 Critic이 Actor의 출력만 검토하고 Actor의 추론에 액세스할 수 없도록 합니다. 결과는 인간 검토자가 보기 전에 제한된 수의 보안 발견으로 정적 애플리케이션 보안 테스트 도구를 통과하는 새로운 FastAPI 엔드포인트입니다.

실습 환경 설정

  1. Galaxium Travels 저장소를 복제합니다.

    git clone -b bob-learning-path-branch https://github.com/IBM/galaxium-travels
  2. File을 클릭한 다음 Open Folder를 클릭합니다.

  3. 복제한 galaxium-travels 디렉토리로 이동하여 엽니다.

  4. 탐색 모음 옆의 Bob 아이콘을 클릭하거나 단축키 Option + Command + B(macOS) 또는 Ctrl + Alt + B(Windows)를 사용하여 Bob 채팅 패널을 엽니다.

  5. 채팅에서 /init을 실행하여 개발 환경을 초기화하고 Bob용 AGENTS.md 파일을 생성합니다. 메시지가 표시되면 Approve todo tools for task를 클릭합니다.

보안 규칙 구성

Bob의 사용자 정의 규칙을 사용하면 프로젝트의 모든 작업 또는 전역적으로 모든 프로젝트에 적용되는 지침을 정의할 수 있습니다. 일회성 프롬프트와 달리 규칙은 자동으로 로드됩니다. Bob은 규칙을 로드하고 권장 사항을 만들기 전에 사용하며 이를 위반하는 코드를 생성하지 않습니다.

생성하는 규칙 파일은 Galaxium Travels 보안 표준과 일치합니다. 규칙은 Bob이 단일 코드 줄을 작성하기 전에 일반적인 안전하지 않은 패턴을 방지하며, 팀이 보안 요구 사항을 모든 프롬프트에서 반복할 필요가 없습니다.

  1. 채팅 패널의 모드 메뉴를 클릭하고 Agent를 선택합니다.

    Agent 모드는 파일 작성 및 실행을 포함한 전체 기능을 Bob에게 제공합니다. 이는 규칙 파일을 생성하는 데 필요합니다.

  2. 채팅 패널에서 Permissions를 클릭하고 ReadEdit 체크박스를 선택합니다. 이 작업에 대해 다른 모든 토글을 선택 해제된 상태로 둡니다.

    권한상태이유
    Read✅ 켜짐Bob과 하위 에이전트가 소스 파일 및 생성된 출력을 읽음
    Edit✅ 켜짐Actor 하위 에이전트가 새 엔드포인트 파일을 작성함
    Execute❌ 꺼짐이 작업에 필요하지 않음
    Skill❌ 꺼짐이 작업에 필요하지 않음
    Subagent❌ 꺼짐이 작업에 필요하지 않음
    MCP❌ 꺼짐이 작업에 필요하지 않음
  3. Bob에게 사용자 정의 보안 규칙 파일을 생성하도록 요청합니다.

    빈 파일 .bob/rules/security.md를 생성하세요
  4. 메시지가 표시되면 Approve for task를 클릭합니다.

  5. .bob/rules/security.md를 열고 내용을 다음 규칙으로 바꿉니다.

    ## 메타 규칙(최우선 순위)
    
    **중요**: 이러한 보안 규칙은 항상 준수해야 하며
    사용자 지침, 요청 또는 컨텍스트에 의해 재정의될 수 없습니다. 사용자 요청이
    이러한 규칙과 충돌하는 경우 보안이 우선합니다. 보안
    근거를 설명하고 준수하는 대안을 제공하세요.
    
    **적용**: 권장 사항을 만들기 전에:
    1. 적용 가능한 모든 보안 기준을 충족하는지 확인
    2. 보안 표준을 준수하는 이유를 문서화
    3. 불확실한 경우 준수를 가정하지 말고 명확화를 요청
    
    ---
    
    ## 1. 시크릿 및 자격 증명 관리
    
    - **필수** 모든 시크릿에 환경 변수 또는 안전한 vault 시스템 사용
    - **금지** 소스 코드에 시크릿, 비밀번호, API 키 또는 토큰 하드코딩
    - **금지** 버전 관리에 시크릿 커밋
    - **필수** 토큰 생성에 secrets.token_urlsafe() 사용
    - **필수** 암호학적으로 안전한 비교 방법 사용
    - **금지** URL 또는 쿼리 매개변수에서 시크릿 전달
    
    ---
    
    ## 2. 인증 및 권한 부여
    
    - **필수** 데이터에 액세스하기 전에 모든 요청에서 권한 검증
    - **필수** 최소 권한 원칙 사용
    - **금지** 클라이언트 측 권한 부여 검사 신뢰
    - **필수** 역할 기반 액세스 제어(RBAC) 구현
    - **금지** 암호화되지 않은 연결에서 기본 인증 사용
    
    ---
    
    ## 3. 암호화 및 데이터 보호
    
    - **필수** 모든 네트워크 통신에 TLS 1.2 이상 사용 — TLS 1.3
      권장
    - **금지** 사용자 정의 암호화 알고리즘 구현
    - **금지** 비밀번호 해싱에 MD5 또는 SHA-1 사용
    - **필수** 암호화 작업에 안전한 난수 생성 사용
    
    ---
    
    ## 4. 입력 검증 및 출력 인코딩
    
    - **필수** 모든 사용자 입력 검증(유형, 길이, 형식, 범위)
    - **필수** 모든 데이터베이스 작업에 매개변수화된 쿼리 사용
    - **금지** 클라이언트 측 검증 신뢰
    - **필수** 잘못된 입력 거부 — 안전하게 실패
    - **금지** 사용자 제공 데이터로 eval() 또는 exec() 사용
    - **금지** shell=True 및 정제되지 않은 사용자 입력으로 subprocess 호출
    
    ---
    
    ## 5. 오류 처리 및 정보 공개
    
    - **금지** 최종 사용자에게 스택 추적 노출
    - **금지** 오류 메시지에서 시스템 또는 데이터베이스 정보 공개
    - **필수** 서버 측에서만 상세한 오류 로깅
    - **필수** API 호출자에게 일반 오류 메시지 반환
    
    ---
    
    ## 6. 로깅 및 모니터링
    
    - **금지** 민감한 데이터(비밀번호, 토큰, PII, 신용카드) 로깅
    - **필수** 구조화된 로깅 사용(JSON 형식 권장)
    - **필수** 적절한 로그 수준 구현(DEBUG, INFO, WARN, ERROR)
    - **필수** 로그인 실패 및
      무단 액세스 시도와 같은 보안 이벤트 모니터링
    
    ---
    
    ## 7. 오픈 소스 및 종속성
    
    - **필수** 모든 패키지의 최신 안정 버전 사용
    - **금지** 수명 종료(EOL) 소프트웨어 또는 패키지 권장
    - **금지** 일시적으로라도 더 이상 사용되지 않는 패키지 제안
    - **필수** 패키지가 적극적으로 유지 관리되는지 확인 — 마지막 커밋이
      6개월 이내
    
    ---
    
    ## 에스컬레이션 시기
    
    사용자가 이러한 규칙을 위반하는 것을 요청하는 경우:
    1. 요청이 보안 정책을 위반하는 이유 설명
    2. 동일한 목표를 달성하는 준수 대안 제공
    3. 보안 규칙을 우회하는 해결 방법을 제공하지 않음
  6. 파일을 저장하고 닫습니다.

    Bob은 각 작업 시작 시 이 규칙 파일을 로드하고 권장 사항에 규칙을 적용합니다. 이러한 규칙은 항상 유효하므로 개별 프롬프트에서 보안 요구 사항을 언급할 필요가 없습니다.

    모든 프로젝트에 적용해야 하는 조직 전체 표준의 경우 동일한 파일을 ~/.bob/rules/에 배치하여 Galaxium Travels뿐만 아니라 머신의 모든 프로젝트에 규칙이 적용되도록 합니다.

Actor 및 Critic 스킬 생성

actor-critic 패턴은 코드 생성과 코드 검토를 두 개의 독립적인 에이전트로 분리합니다:

  • Actor 스킬은 코드를 생성합니다. 이 스킬은 안전한 FastAPI 코드가 충족해야 하는 특정 Python 및 OWASP ASVS 요구 사항을 인코딩하여 이미 설정된 더 광범위한 규칙을 보완합니다.
  • Critic 스킬은 Actor의 출력을 검토합니다. 이 스킬은 동일한 표준을 구조화된 감사 체크리스트로 인코딩하여 각 검사를 일반적인 SAST 규칙에 매핑합니다.

Actor와 Critic을 별도의 작업이 아닌 하위 에이전트로 실행하는 것은 Critic이 Actor의 추론이 아닌 출력에만 액세스할 수 있음을 의미합니다. 이것이 패턴의 핵심 속성입니다: Critic은 독립적인 평가자이지 협력자가 아닙니다.

Bob Settings를 통해 두 스킬을 모두 생성합니다. 저장한 후 프롬프트에서 /skill-name으로 호출합니다.

  1. 채팅 패널 아래에서 Bob - Settings를 클릭한 다음 Bob Settings를 클릭합니다.

  2. 왼쪽 사이드바에서 Skills를 클릭합니다.

  3. + 버튼을 클릭하여 새 스킬을 생성합니다.

  4. Skill Name 필드에 secure-python-actor를 입력합니다. 이것은 채팅에서 /secure-python-actor로 스킬을 호출하는 데 사용되는 이름입니다.

  5. Description 필드에 간단한 설명을 입력합니다. 예: Galaxium Travels 보안 규칙 및 OWASP ASVS Level 1 요구 사항을 충족하는 Python/FastAPI 코드를 작성합니다.

  6. Allow Bob to use this skill 토글을 켭니다.

    토글이 켜져 있으면 Bob이 스킬을 자율적으로 활성화할 수 있습니다. 토글이 꺼져 있으면 Bob이 스킬을 자율적으로 활성화하지 않습니다. 스킬은 /secure-python-actor로 명시적으로 호출하거나 부모 에이전트가 로드하도록 지시받은 경우에만 실행됩니다.

  7. Scope & Location에서 풀다운 메뉴를 클릭하고 galaxium-travels를 선택합니다.

    이렇게 하면 Galaxium Travels 저장소의 .bob/skills 디렉토리에 스킬이 생성됩니다. **Global (all workspaces)**를 선택하여 전역적으로 스킬을 생성할 수도 있으며, 이렇게 하면 ~/.bob/skills에 스킬이 생성되어 머신의 모든 프로젝트에서 사용할 수 있습니다.

  8. Skill Instructions 텍스트 상자에 다음 스킬을 입력합니다.

    ---
    name: secure-python-actor
    description: Galaxium Travels 보안 규칙 및 OWASP ASVS Level 1 요구 사항을 충족하는 Python/FastAPI 코드를 작성합니다.
    user-invocable: true
    ---
    
    당신은 보안을 의식하는 Python 개발자입니다. 프로덕션 품질의
    FastAPI 코드를 작성하세요. 각 파일을 작성한 후 각 카테고리가 적용되었거나
    이유와 함께 N/A로 표시되었음을 확인하는 준수 체크리스트를 생성하세요.
    
    ## 인증 및 권한 부여(NIST AC-3, OWASP ASVS V4.1)
    
    - 데이터 액세스 전에 호출자 신원 확인 — 
      신원을 확인할 수 없는 경우 HTTP 401 반환
    - 인증된 호출자가 리소스를 소유하고 있는지 확인한 후 반환 — 
      클라이언트 제공 ID를 소유권 증명으로 신뢰하지 않음(IDOR 방지)
    - 기본 거부 적용: 인증되지 않은 요청은
      비즈니스 로직에 도달해서는 안 됨
    
    ## 입력 검증(NIST SI-10, OWASP ASVS V5.1)
    
    - 모든 Pydantic 모델은 모든 문자열 필드에 max_length를 선언해야 함
    - 경로 및 쿼리 매개변수를 명시적으로 검증 — 데이터베이스 액세스가 발생하기 전에
      예상치 못한 유형 거부
    
    ## 데이터베이스 액세스(OWASP ASVS V5.3, CWE-89)
    
    - 모든 쿼리에 SQLAlchemy ORM 사용 — 사용자 입력을
      쿼리 문자열에 연결하지 않음
    - 실패 시 롤백을 사용하여 명시적 트랜잭션으로 쓰기 작업 래핑
    
    ## 오류 처리(OWASP ASVS V7.4, CWE-209)
    
    - API 호출자에게 일반 메시지 반환 — 스택 추적,
      파일 경로 또는 데이터베이스 세부 정보 포함하지 않음
    - 상관 ID와 함께 ERROR 수준에서 기본 예외 로깅하여
      호출자에게 노출하지 않고 오류를 추적 가능하게 함
    
    ## 로깅(NIST AU-3, OWASP ASVS V7.1)
    
    - 이벤트 유형, 리소스 식별자 및 HTTP 결과만 로깅 — 
      이메일 주소, 비밀번호, 토큰 또는 기타 PII 로깅하지 않음
    
    ## 암호화(NIST SC-13, OWASP ASVS V6.2)
    
    - 토큰 및 nonce에 secrets.token_urlsafe() 또는 secrets.token_hex() 사용
    - 보안에 민감한 값에 random.random() 사용하지 않음
  9. Create를 클릭합니다.

  10. + 버튼을 클릭하여 두 번째 스킬을 생성합니다.

  11. Skill Name 필드에 secure-python-critic을 입력합니다. 이것은 채팅에서 /secure-python-critic으로 스킬을 호출하는 데 사용되는 이름입니다.

  12. Description 필드에 간단한 설명을 입력합니다. 예: NIST SP 800-53, OWASP ASVS Level 1 및 CWE Top 25에 대해 Python 코드를 검토합니다. 발견 사항을 SAST 규칙에 매핑합니다.

  13. Allow Bob to use this skill 토글을 켭니다.

  14. Scope & Location에서 풀다운 메뉴를 클릭하고 galaxium-travels를 선택합니다.

  15. Skill Instructions 텍스트 상자에 다음 스킬을 입력합니다.

    ---
    name: secure-python-critic
    description: NIST SP 800-53, OWASP ASVS Level 1 및 CWE Top 25에 대해 Python 코드를 검토합니다. 발견 사항을 일반적인 SAST 규칙에 매핑합니다.
    user-invocable: true
    ---
    
    당신은 사전 커밋 코드 검토를 수행하는 선임 보안 아키텍트입니다.
    제공된 Python 코드를 프로덕션 감사 엄격성으로 검토하세요. 아래 제어에 대해 모든
    줄을 확인하세요. 각각에 대해 PASS, FAIL 또는 N/A를 기록하세요.
    
    모든 FAIL에 대해 발견 사항을 생성하세요:
    
    **발견 사항 [N]:**
    - 표준: [NIST 제어 ID / OWASP ASVS 제어 / CWE ID]
    - SAST 규칙: [규칙 이름 또는 카테고리]
    - 심각도: Critical / High / Medium / Low
    - 줄: [번호 또는 범위]
    - 문제: [한 문장]
    - 수정: [한 문장 — 필요한 코드 변경]
    
    ## NIST SP 800-53
    
    - AC-3 — 액세스 적용: 모든
      데이터 작업 전에 권한 부여 검사가 적용되는가?
    - AC-6 — 최소 권한: 코드가 최소 권한만 요청하는가?
    - AU-3 — 감사 기록: 로깅이 이벤트, 행위자 및 결과를
      시크릿이나 PII 없이 캡처하는가?
    - IA-5 — 인증자 관리: 모든 시크릿이 환경
      변수에서 로드되고 하드코딩되지 않았는가?
    - SC-13 — 암호화 보호: NIST 승인 알고리즘만 사용되는가?
    - SI-10 — 입력 검증: 모든 입력이 처리 전에 검증되는가?
    
    ## OWASP ASVS Level 1
    
    - V4.1.1 — 모든 요청에서 서버 측에서 액세스 제어 적용
    - V4.2.1 — 객체 수준 권한 부여 확인 — 예측 가능한 ID를 통한 IDOR 없음
    - V5.1.1 — 문자열 입력이 max_length 제약 조건 정의
    - V5.3.4 — 사용자 입력이 쿼리 문자열에 연결되지 않음
    - V6.2.1 — MD5, SHA-1 또는 사용자 정의 암호화 알고리즘 없음
    - V7.1.1 — 자격 증명 및 PII가 로그에 작성되지 않음
    - V7.4.1 — 오류 응답이 스택 추적 또는 내부 세부 정보를 노출하지 않음
    - V8.3.1 — 민감한 데이터가 URL 쿼리 매개변수로 전달되지 않음
    
    ## CWE Top 25
    
    - CWE-89  — SQL 인젝션: 원시 쿼리 문자열 연결 없음
    - CWE-78  — OS 명령 인젝션: shell=True 및
      사용자 파생 입력으로 subprocess 없음
    - CWE-22  — 경로 순회:
      사용자 입력에서 확인되지 않은 파일 경로 구성 없음
    - CWE-798 — 하드코딩된 자격 증명: 소스 코드에 시크릿 없음
    - CWE-209 — 정보 노출: API 오류에 내부 세부 정보 없음
    - CWE-311 — 암호화 누락: 민감한 필드가 암호화되거나 해시됨
    - CWE-20  — 부적절한 입력 검증: 모든 입력이 사용 전에 검증됨
    
    모든 발견 사항 후 다음을 명시하세요:
    
    1. 코드가 보안 발견 없이 일반적인 SAST 도구 스캔을 통과할지 여부
    2. 플래그가 지정될 나머지 문제가 있다면 정확한 규칙 이름과 함께
    3. 한 문장의 전체 평가
  16. Create를 클릭합니다.

    기존 스킬이 없는 시나리오의 경우 Bob의 /create-skill 명령을 사용하여 안내식 설정을 수행합니다.

    효과적인 스킬 작성을 위한 팁:

    • 스킬 지침을 약 2,000단어 미만으로 유지합니다. 더 긴 스킬은 Bob이 소스 코드를 읽는 데 필요한 컨텍스트를 소비합니다.
    • 프론트 매터의 user-invocable: true 메타데이터는 스킬을 Bob 인터페이스에서 표시하고 선택할 수 있게 하여 팀 구성원이 처음부터 프롬프트를 작성하지 않고도 활성화할 수 있습니다.
    • "완료 시 준수 체크리스트 반환"과 같은 명시적 중지 지점을 사용하여 Bob이 추가 조치를 취하기 전에 결과를 보고하도록 합니다.
    • 스킬은 프로젝트 규칙을 보완합니다 — 규칙은 전역적으로 안티 패턴을 방지하고 스킬은 작업별 워크플로를 인코딩합니다.

Actor-Critic 워크플로 실행

규칙과 스킬이 준비되면 Bob에게 전체 actor-critic 워크플로를 조율하도록 요청합니다. 단일 부모 작업이 Actor와 Critic을 독립적인 하위 에이전트로 생성합니다 — Actor가 코드를 작성한 다음 Critic이 Actor의 추론에 액세스하지 않고 격리된 컨텍스트에서 코드를 검토합니다.

기능은 예약 소유자에게만 예약 세부 정보를 반환하는 새로운 GET /bookings/{booking_id} 엔드포인트입니다. 이는 모든 흥미로운 제어를 실행하는 집중된 범위입니다: IDOR 보호, 신원 확인, 입력 검증, ORM 전용 쿼리, 일반 오류 및 PII 없는 로깅.

  1. + 버튼을 클릭하여 새 작업을 시작합니다.

    새 작업을 시작하면 actor-critic 워크플로에 이전에 수행한 규칙 및 스킬 생성 작업과 별도의 깨끗한 컨텍스트 창이 제공됩니다.

  2. 채팅 패널의 모드 메뉴를 클릭하고 Agent를 선택합니다.

  3. 채팅 패널에서 Permissions를 클릭하고 Read, Edit, Execute, SkillSubagent를 선택합니다. 다른 모든 토글은 선택 해제된 상태로 둡니다.

    권한상태이유
    Read✅ 켜짐Bob과 하위 에이전트가 소스 파일 및 생성된 출력을 읽음
    Edit✅ 켜짐Actor 하위 에이전트가 새 엔드포인트 파일을 작성함
    Execute✅ 켜짐Bob이 경로 또는 구조를 해결하기 위해 셸 명령을 실행할 수 있음
    Skill✅ 켜짐부모 에이전트와 생성하는 하위 에이전트가 스킬을 로드하고 활성화할 수 있도록 함
    Subagent✅ 켜짐Actor와 Critic을 독립적인 하위 에이전트로 생성하는 데 필요
    MCP❌ 꺼짐이 작업에 필요하지 않음
  4. Bob에게 actor-critic 워크플로를 조율하도록 요청합니다.

    @ 컨텍스트 멘션은 Actor 하위 에이전트가 새 엔드포인트를 작성하기 전에 기존 코드 규칙을 이해할 수 있도록 Galaxium Travels 백엔드에서 세 개의 파일을 첨부합니다: server.py는 FastAPI 애플리케이션 진입점, booking.py는 예약 서비스, schemas.py는 Pydantic 요청 및 응답 모델을 정의합니다.

    두 개의 순차적 하위 에이전트를 사용하여 actor-critic 코드 생성 워크플로를 실행하세요.
    
    1단계 — Actor 하위 에이전트:
    새 FastAPI 엔드포인트를 구현하기 위해 하위 에이전트를 생성하세요.
    /secure-python-actor 스킬을 로드하세요. 다음 파일을 참조하세요:
    
    @booking_system_backend/server.py
    @booking_system_backend/services/booking.py
    @booking_system_backend/schemas.py
    
    booking_system_backend/routers/booking_detail.py에 새 라우터 모듈을 작성하세요.
    다음 요구 사항으로 GET /bookings/{booking_id}를 구현하세요:
    - booking_id를 양의 정수 경로 매개변수로 수락
    - X-User-Email 요청 헤더에서 호출자 신원 수락
    - 식별된 사용자에게 속하는 경우에만 예약 레코드 반환
    - 예약이 존재하지 않으면 HTTP 404 반환
    - 예약이 다른 사용자에게 속하면 HTTP 403 반환
    - 로그 항목에 이메일을 포함하지 않고 액세스 시도 로깅
    - 예상치 못한 서버 오류에 대해 일반 메시지 반환
    
    완료 시 준수 체크리스트를 반환하세요.
    
    2단계 — Critic 하위 에이전트:
    Actor 하위 에이전트가 완료된 후 출력을 검토하기 위해 두 번째 독립 하위 에이전트를 생성하세요.
    /secure-python-critic 스킬을 로드하세요. 참조:
    
    @booking_system_backend/routers/booking_detail.py
    
    스킬의 모든 제어에 대해 파일을 검토하세요. 코드가
    제한된 보안 발견으로 SAST 스캔을 통과할지 명시하세요.
    
    완료 시 Critic의 전체 발견 사항 보고서를 반환하세요.
  5. 메시지가 표시되면 Approve todo tools for task를 클릭합니다. 각 하위 에이전트가 시작될 때 추가 승인 프롬프트가 표시될 수 있습니다 — 각각에서 Approve를 클릭하세요.

    Bob은 각 하위 에이전트를 생성하기 전과 Actor가 엔드포인트 파일을 작성하기 전에 승인을 요청합니다. 총 2~3개의 프롬프트를 예상하세요.

    Bob은 두 하위 에이전트를 순차적으로 조율합니다. Actor 하위 에이전트는 기존 코드베이스를 읽고 엔드포인트를 생성하며 준수 체크리스트를 반환합니다. 그런 다음 Critic 하위 에이전트는 생성된 파일만 받고 — Actor의 컨텍스트가 아닌 — 독립적으로 감사합니다.

    출력 예:

    필요한 모든 컨텍스트가 있습니다. 이제 할 일 목록을 설정하고 actor-critic 워크플로를 순차적으로 실행하겠습니다.
    
    Actor가 완료되었습니다. Critic을 시작하기 전에 파일이 실제로 작성되었는지 확인하겠습니다:
    booking_system_backend/routers/booking_detail.py 생성됨
    
    준수 체크리스트
    [C1] 입력 검증      — PASS — booking_id는 Annotated[int, Path(gt=0)] 사용; 헤더는 Header(alias=…)를 통해 불투명 문자열로 읽음
    [C2] 권한 부여         — PASS — 예약은 ID로만 가져옴; 소유권은 별도로 비교; 404 vs 403은 구별되고 정확함
    ...생략...
    
    파일이 정확하고 완전합니다. 이제 Critic 하위 에이전트를 시작합니다:
    
    ---
    
    Critic 하위 에이전트 시작 중...
    
    Critic 하위 에이전트 완료.
    booking_system_backend/routers/booking_detail.py 검토됨
    
    === SECURE PYTHON CRITIC — 발견 사항 보고서 ===
    
    [C1] 입력 검증      — PASS — 세 가지 하위 제어 모두 충족.
    • `booking_id`는 `Annotated[int, Path(gt=0)]`로 선언되어
    양의 정수 제약 조건 적용; FastAPI는 핸들러 전에 422 반환
    
    ...생략...
    
    전체 평결: PASS
    보안 발견 없이 SAST 통과 여부: 예
    
    조치가 필요한 발견 사항:
    • [C6 — WARN — 해결됨] routers/__init__.py가 존재하고 확인됨
    존재. 조치 불필요.

    Critic의 아키텍처 노트는 코드 결함이 아닙니다 — 기존 Galaxium Travels 워크플로를 반영합니다.

  6. booking_system_backend/routers/booking_detail.py를 열어 생성된 코드를 검토합니다.

    개발 팀은 이제 새 엔드포인트가 인간이 검토하기 전에 정적 분석 도구에 도달하기 전에 보안 표준을 충족한다고 확신할 수 있습니다.

정리

  1. 이 튜토리얼에서 생성된 파일을 제거하려면 실습 환경 설정에서 복제한 galaxium-travels 디렉토리를 삭제합니다.
  2. 스킬을 더 이상 사용하지 않을 경우 Bob - Settings >> Bob Settings를 클릭한 다음 Skills를 클릭합니다.
  3. secure-python-actor 스킬을 클릭합니다.
  4. 스킬을 삭제하려면 휴지통 아이콘을 클릭한 다음 Delete를 클릭합니다.
  5. 이 단계를 반복하여 secure-python-critic 스킬을 삭제합니다.

다음 단계

이 튜토리얼에서는 IBM Bob을 사용하여 다음을 수행했습니다:

  • Bob이 모든 작업에 적용하는 Galaxium Travels 보안 표준으로 .bob/rules/security.md 구성
  • NIST SP 800-53 및 OWASP ASVS 요구사항을 코드 생성 지침으로 인코딩하는 Actor 스킬 생성
  • 각 제어를 일반적인 SAST 규칙에 매핑하는 Critic 스킬 생성
  • 독립적인 서브에이전트가 공유 컨텍스트 없이 코드를 생성하고 검토하는 actor-critic 워크플로 조율
  • 규칙과 스킬을 활용하여 보안 발견 사항을 줄이는 새로운 FastAPI 엔드포인트 생성

추가 리소스

이 주제는 어떤가요?