확장 프로그램이 포함된 Gemini CLI를 사용한 코드 검토 및 보안 분석

1. 📖 소개

194a7f6f1a93b614.png

이 Codelab에서는 Gemini CLI의 기본사항을 알아보고 소프트웨어 개발 워크플로에서 코드 검토 및 보안 분석 확장 프로그램을 활용합니다.

학습할 내용

  • Gemini CLI 설정 방법
  • Gemini CLI 구성 방법
  • Gemini CLI 확장 프로그램 설치 방법
  • 코드 검토 및 보안 분석을 위해 Gemini CLI 확장 프로그램을 활용하는 방법
  • Gemini CLI용 MCP를 구성하는 방법
  • CI/CD에서 Gemini CLI를 검사하는 방법

필요한 항목

  • Chrome 웹브라우저
  • Gmail 계정
  • 결제 계정이 사용 설정된 Cloud 프로젝트

2. 🚀 워크숍 개발 설정 준비

1단계: Cloud Console에서 활성 프로젝트 선택하기

Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다 (콘솔의 왼쪽 상단 섹션 참고).

3a143645e891087.png

이 버튼을 클릭하면 다음 예와 같이 모든 프로젝트 목록이 표시됩니다.

59e03077d1ba2039.png

빨간색 상자로 표시된 값이 프로젝트 ID이며 이 값은 튜토리얼 전체에서 사용됩니다.

Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 이를 확인하려면 왼쪽 상단 표시줄에 있는 햄버거 아이콘 ☰을 클릭하여 탐색 메뉴를 표시하고 결제 메뉴를 찾습니다.

973396bb9d9c3523.png

837e03fb7edafdc4.png

결제 / 개요 제목 ( 클라우드 콘솔의 왼쪽 상단 섹션) 아래에 'Google Cloud Platform 무료 체험판 결제 계정'이 표시되면 이 튜토리얼에서 프로젝트를 사용할 준비가 된 것입니다. 그렇지 않은 경우 이 튜토리얼의 시작 부분으로 돌아가서 체험판 결제 계정을 사용하세요.

7f607aa026552bf5.png

2단계: Cloud Shell 익히기

튜토리얼의 대부분에서 Cloud Shell을 사용합니다. Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다. 승인을 요청하는 메시지가 표시되면 승인을 클릭합니다.

1829c3759227c19b.png

b8fe7df5c3c2b919.png

Cloud Shell에 연결되면 셸 ( 또는 터미널)이 계정으로 이미 인증되었는지 확인해야 합니다.

gcloud auth list

아래 예시 출력과 같이 개인 Gmail이 표시되면 모든 것이 정상입니다.

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

그렇지 않은 경우 브라우저를 새로고침하고 메시지가 표시되면 승인을 클릭하세요 ( 연결 문제로 인해 중단될 수 있음).

다음으로, 터미널에서 $아이콘 앞에 ( ) 안의 값이 표시되는 경우 ( 아래 스크린샷에서 값은 'your-workshop-project') 셸이 이미 보유한 올바른 프로젝트 ID로 구성되어 있는지 확인해야 합니다. 이 값은 활성 셸 세션에 대해 구성된 프로젝트를 보여줍니다.

25e65d7ad1d62de0.png

표시된 이 이미 올바른 경우 다음 명령어건너뛸 수 있습니다. 하지만 올바르지 않거나 누락된 경우 다음 명령어를 실행합니다.

gcloud config set project <YOUR_PROJECT_ID>

3단계: Cloud Shell 편집기 숙지 및 애플리케이션 작업 디렉터리 설정

이제 코드 편집기를 설정하여 코딩 작업을 할 수 있습니다. 이를 위해 Cloud Shell 편집기를 사용합니다.

편집기 열기 버튼을 클릭하면 Cloud Shell 편집기 b16d56e4979ec951.png가 열립니다.

이제 아래와 같은 Cloud Shell 편집기 인터페이스가 표시됩니다.

74e9e030342164b6.png

이제 상호작용할 데모 저장소를 클론합니다. 먼저 편집기의 터미널을 열어야 합니다. 메뉴 바에서 터미널 -> 새 터미널을 클릭하거나 Ctrl + Shift + C를 사용하여 브라우저 하단에 터미널 창을 열 수 있습니다.

95e31ec63a88890d.png

그런 다음 터미널에서 다음 명령어를 실행합니다.

git clone https://github.com/alphinside/gemini-cli-code-analysis-demo.git code-analysis-demo

그런 다음 Cloud Shell 편집기의 상단 섹션으로 이동하여 File->Open Folder를 클릭하고 username 디렉터리를 찾은 다음 복제된 저장소 디렉터리 code-analysis-demo를 찾아 OK 버튼을 클릭합니다. 이렇게 하면 선택한 디렉터리가 기본 작업 디렉터리가 됩니다. 이 예시에서 사용자 이름은 alvinprayuda이므로 디렉터리 경로는 아래와 같습니다.

ee00d484ff2f8351.png

194f63ef6de51b9.png

이제 Cloud Shell 편집기 작업 디렉터리가 다음과 같이 표시됩니다.

2d53c6161b553e68.png

이제 다음 단계로 넘어갈 수 있습니다.

3. 🚀 설정 및 구성

로컬 시스템에 Gemini CLI를 설치하려면 다음 단계를 따르세요.

  1. 시스템에 Node 버전 20 이상이 있는지 확인합니다.
  2. 다음 중 한 가지 방법으로 Gemini CLI를 사용 설정합니다.
  • 전역 패키지로 설치
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • 또는 소스에서 직접 실행하여 항상 최신 버전을 가져옵니다.
npx https://github.com/google-gemini/gemini-cli

처음 실행하면 몇 가지 질문이 표시됩니다. IDE (예: VSCode)에서 실행하면 다음 질문이 표시됩니다.

7f0f7d5091df7abb.png

그런 다음 인증을 위한 몇 가지 옵션을 묻습니다.

7ce5c6574f249304.png

다음과 같은 몇 가지 옵션이 있습니다.

  • Google 계정으로 로그인을 선택하면 브라우저에서 Google 인증 페이지가 열리며, 이를 수락하기만 하면 됩니다.
  • Gemini API 키를 사용하려면 AI Studio 페이지에서 키를 만든 다음 작업 디렉터리에서 변수 GEMINI_API_KEY가 설정된 .env 파일을 만듭니다 ( 또는 명령줄에서 export GEMINI_API_KEY="your-api-key" 명령어를 실행).
  • Vertex AI를 사용하려면 이전에 설정한 것과 같은 프로젝트가 필요하며 .env 파일을 만들고 GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION을 설정해야 합니다.

이러한 인증 방법을 변경하려면 Gemini CLI에서 /auth 명령어를 실행하거나 구성 파일을 수정하면 됩니다. 구성 파일을 직접 수정하려면 Linux에서는 $HOME/.gemini/settings.json에 있어야 합니다 . securityauth 유형이 표시되며 이를 수정할 수 있습니다.

{
  "security": {
    "auth": {
      "selectedType": "vertex-ai" # or "gemini-api-key" or "oauth-personal"
    }
  }
}

72300c1f781857c8.png

4. 🚀 기본 명령어 및 내장 도구

이제 Gemini CLI를 사용해 자세히 알아보겠습니다. 사용할 수 있는 기본 명령어를 찾고 있다면 /help를 입력하여 사용 가능한 모든 명령어를 표시할 수 있습니다.

800d1b06a5ad9f9c.png

/help

다음과 같은 출력이 표시됩니다. f46a75c6bb177a2b.png

Gemini CLI는 AI 에이전트이므로 사용자가 제공한 작업을 해결할 수 있는 도구가 장착되어 있습니다. 내장된 도구를 확인하려면 /tools 명령어를 실행합니다.

17a6d7fcf06df563.png

/tools

다음과 같은 출력이 표시됩니다.

7d22b38a387f45d0.png

Gemini CLI에는 파일 읽기 및 쓰기, 웹 검색 등 여러 기능이 있습니다. 이러한 도구 중 일부는 잠재적 위험으로 인해 기본적으로 사용자 확인이 필요했습니다.

이제 실제 사례를 살펴보겠습니다. Gemini CLI에서 다음 프롬프트를 실행해 보세요.

15e2d863a4eb8df4.png

Find top 10 OWASP security issue and write it down to owasp.md

GoogleSearch 도구가 호출되고 나중에 WriteFile 도구를 사용하여 결과가 작성됩니다. IDE를 활용하면 제안을 수락할지 거부할지 여부에 따라 차이점과 표시 옵션이 표시됩니다. 여기에서 Gemini CLI가 파일 쓰기 권한을 요청하는 것을 확인할 수 있습니다.

8163f43b05ca59a3.png

5. 🚀 확장 프로그램

AI 에이전트로 특정 작업을 수행할 때 출력을 개선하려면 적절한 프롬프트를 작성하고, 적절한 도구 통합으로 적절한 컨텍스트 엔지니어링을 관리하는 등의 어려운 점이 있습니다.

Gemini CLI 확장 프로그램은 외부 도구에 연결할 수 있는 사전 패키지화되고 쉽게 설치할 수 있는 프롬프트와 통합입니다. 각 확장 프로그램에는 도구를 효과적으로 사용하는 방법에 관한 내장 '플레이북'이 포함되어 있으며 다음 구성요소로 구성될 수 있습니다.

  • 맞춤 슬래시 명령어
  • MCP 구성
  • 컨텍스트 파일

6da12f33463ac755.png

보안 확장 프로그램 설치

예를 들어 이 튜토리얼에서는 code-reviewsecurity 확장 프로그램을 설치하는 방법을 살펴봅니다.

터미널에서 다음 명령어를 실행하여 security 확장 프로그램을 설치합니다.

gemini extensions install https://github.com/gemini-cli-extensions/security

다음 질문이 표시됩니다. Enter 키를 눌러 수락하세요.

Installing extension "gemini-cli-security".
**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**
This extension will run the following MCP servers:
  * securityServer (local): node /home/alvinprayuda/.gemini/extensions/gemini-cli-security/mcp-server/dist/security.js
This extension will append info to your gemini.md context using GEMINI.md
Do you want to continue? [Y/n]:
Extension "gemini-cli-security" installed successfully and enabled.

코드 검토 확장 프로그램 설치

다음으로 code-review 확장 프로그램을 설치합니다. 아래 명령어를 실행하세요.

gemini extensions install https://github.com/gemini-cli-extensions/code-review

완료되면 Gemini CLI를 다시 실행합니다.

gemini

/extensions 명령어를 실행하면 이 두 확장 프로그램이 이미 설치되어 있는 것을 확인할 수 있습니다.

88a86a0dc42fc510.png

/extensions

이제 이전에 클론한 샘플 저장소에서 실제로 실행해 보겠습니다.

6. 🚀 대화형 모드 - 코드 보안 분석 확장 프로그램 애플리케이션

보안 확장 프로그램은 저장소의 보안을 강화하기 위해 빌드된 오픈소스 Gemini CLI 확장 프로그램입니다. 이 확장 프로그램은 코드 변경사항을 분석하여 다양한 보안 위험과 취약점을 식별하는 새로운 명령어를 Gemini CLI에 추가합니다.

이제 데모 저장소를 먼저 준비해 보겠습니다. 다음 명령어를 실행하여 보안 위험이 있는 변경사항이 이미 적용된 브랜치로 변경합니다.

git checkout refactor/analysis-demo

그런 다음 터미널에서 Gemini CLI를 실행합니다.

gemini

그런 다음 확장 프로그램을 실행해 보겠습니다.

e3fcf630238f9b2e.png

/security:analyze

이렇게 하면 장기 실행 프로세스가 시작되며, 프로세스 중에 아래와 같이 mkdir와 같은 특정 작업을 실행할 권한을 요청하는 여러 인터럽트가 표시됩니다.

10d6ad2ef91b5acf.png

이는 사용자가 Gemini CLI에 의해 실행될 내용을 알 수 있도록 하는 보호 메커니즘입니다. 튜토리얼의 나머지 부분에서는 항상 허용할 수 있습니다 ( 옵션 2).

이 확장 프로그램은 장기 실행 프로세스를 호출합니다. .gemini_security 디렉터리 내에 계획 파일이 생성되는 것을 확인할 수 있으며, 어떤 프로세스가 완료되었는지 체크리스트를 통해 확인할 수 있습니다. 아래 예와 같이

543035cb65d27804.png

작업을 완료하는 데 시간이 걸리므로 기다리는 동안 GitHub 저장소에서 이러한 확장 프로그램의 소스를 확인할 수 있습니다 . 이 URL은 이러한 모든 보안 검사 프로세스를 실행하는 데 사용되는 프롬프트를 보여줍니다.

73f4966870bc9ddf.png

여기에서 볼 수 있듯이 Gemini CLI로 프롬프트를 스캔하여 2단계 검사, 즉 정찰 단계와 더 자세한 조사 단계를 실행합니다.

Gemini CLI에서 다음 프롬프트가 표시되면 옵션 2를 선택하여 루프 감지를 사용 중지할 수 있습니다.

a0af5e15627afa83.png

그런 다음 Gemini CLI에 계속하라는 메시지를 표시합니다.

611a7ed0fb6fc44b.png

continue

이는 무한한 비생산적인 도구 호출 루프를 방지하는 메커니즘이며 시간이 지남에 따라 계속 개선될 예정입니다.

완료되면 대화형 터미널에 보고서가 표시됩니다. 이를 더 쉽게 하기 위해 Gemini CLI에 security-analysis.md에 작성하도록 지시합니다.

b4cbad3aaeaa8dce.png

write the result to security-analysis.md file

이제 파일에 작성된 결과를 검사할 수 있습니다.

7. 🚀 비대화형 모드 - 코드 검토 확장 프로그램 애플리케이션

code-review 확장 프로그램은 코드 변경사항을 분석하여 다양한 코드 품질 문제를 식별하는 새로운 명령어를 Gemini CLI에 추가합니다.

이 확장 프로그램은 Gemini CLI 비대화형 모드에서 실행할 수 있습니다. 즉, Gemini CLI 셸을 입력하지 않고도 모든 프로세스를 실행할 수 있습니다. 비대화형 모드에서 Gemini CLI를 실행하려면 다음 명령 패턴을 사용하면 됩니다.

gemini "put your command here"

하지만 비대화형 모드로 실행하면 사용자 권한이 필요한 도구 작업이 사용 중지되므로 비대화형 모드에서 모든 도구를 사용 설정한다는 의미로 --yolo 플래그를 추가하여 모든 작업을 자동 승인해야 합니다.

다음 명령어를 사용하여 code-review 확장 프로그램을 실행해 보겠습니다.

gemini "/code-review" --yolo -e code-review > code-review.md

이 명령어는 Gemini CLI 출력 결과를 code-review.md 파일에 작성합니다. 여기에서 -e 플래그를 확인하세요. 이 플래그는 세션 중에 활성화할 확장 프로그램을 제어합니다. 여기서는 code-review 확장 프로그램만 활성화하고 나머지는 사용 중지합니다.

시간이 걸리지만 완료되면 아래와 같이 마크다운 파일에 결과가 표시됩니다.

Here are the results of the code review.

While the recent changes to rename `get_products` and `get_product` to `GetProducts` and `GetProduct` are minor, the codebase has some inconsistencies in its naming conventions. For instance, other functions like `create_product` use `snake_case`, while the newly renamed functions use `PascalCase`. For better code quality and readability, I recommend using a consistent naming convention throughout the project.

More importantly, I have identified several security vulnerabilities in the `main.py` file. Here is a summary of the findings:

### 1. SQL Injection
*   **Severity**: High
*   **Location**: 
    *   `main.py:99` in `get_products_by_category`
    *   `main.py:146` in `search_products`
    *   `main.py:372` in `get_user_transactions`
    *   `main.py:438` in `adjust_inventory_by_query`
*   **Description**: The endpoints directly use f-strings to construct SQL queries, making them vulnerable to SQL injection attacks. An attacker could manipulate the input to execute arbitrary SQL commands, potentially leading to data breaches or unauthorized modifications.
*   **Recommendation**: Use parameterized queries or an ORM to handle database interactions. This will ensure that user input is properly sanitized and prevent SQL injection attacks.

### 2. Server-Side Request Forgery (SSRF)
*   **Severity**: High
*   **Location**: `main.py:265` in `fetch_url`
*   **Description**: The `fetch_url` endpoint allows users to specify an arbitrary URL, which the server then requests. This can be exploited to make requests to internal services or local files, leading to information disclosure or other security breaches.
*   **Recommendation**: Implement a whitelist of allowed domains or protocols to restrict the URLs that can be requested. Additionally, you can disable redirects and use a timeout to limit the impact of an attack.

### 3. Information Exposure
*   **Severity**: Medium
*   **Location**: `main.py:423` in `get_environment_variables`
*   **Description**: The `get_environment_variables` endpoint exposes all environment variables to the user. This can include sensitive information such as API keys, database credentials, and other secrets.
*   **Recommendation**: Remove this endpoint or restrict access to it to authorized users. If you need to expose some environment variables, do so selectively and avoid exposing sensitive information.

8. 🚀 모델 컨텍스트 프로토콜 지원

이제 확장 프로그램 설명에서 이전에 살펴본 것처럼 Gemini CLI가 모델 컨텍스트 프로토콜을 통해 도구와 리소스를 제공하는 애플리케이션인 MCP 서버에 연결할 수 있습니다. 이 연결을 통해 Gemini CLI는 MCP 서버를 로컬 환경과 API와 같은 외부 서비스 간의 브리지로 사용하여 외부 시스템 및 데이터 소스와 상호작용할 수 있습니다.

5f1cdd4be3e7b42a.png

자체 MCP 서버를 설정하려면 .gemini/settings.json 파일을 수정하고 다음 구성을 추가해야 합니다.

{
    ...
    # Previous settings above if any
    "mcpServers": {
       "server_name": {
           # MCP server configurations here
       }
    }
}

이 튜토리얼에서는 이전 보고서 데이터를 GitHub에 푸시하기 위해 GitHub 계정과의 연결을 구성합니다.

Github MCP 서버 구성

먼저 Gemini CLI 프로젝트 구성 파일을 만들어 보겠습니다. 다음 명령어를 실행합니다.

mkdir -p .gemini && touch .gemini/settings.json

그런 다음 .gemini/settings.json 파일을 열고 다음 구성으로 채웁니다.

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "your-personal-access-token"
            },
            "timeout": 5000
       }
  }
}

이제 여기에 자체 GitHub 개인 액세스 토큰이 필요하므로 자체 GitHub 계정이 있어야 합니다.

GitHub에 로그인하고 Settings로 이동합니다.

dc57f047ca9a2b83.png

그런 다음 아래로 스크롤하여 개발자 설정을 찾아 클릭합니다.

59d9b700c41ca1b6.png

그런 다음 개인 액세스 토큰을 선택하고 토큰 (클래식)을 선택합니다.

e96fccd80872e480.png

30ac727da307602b.png

여기에 개인 액세스 토큰의 이름을 지정하고 repo 범위를 선택합니다.

ad167223fa231e3c.png

그런 다음 아래로 스크롤하여 토큰 생성 버튼을 클릭하고 다음을 확인합니다.

새 토큰 생성 버튼을 클릭하고 새 토큰 생성 (클래식)을 선택합니다. 그런 다음 생성된 토큰을 복사하여 .gemini/settings.json에 작성합니다.

efd82711868093c0.png

따라서 .gemini/settings.json은 다음 예와 같아야 합니다.

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "ghp-xxxx"
            },
            "timeout": 5000
       }
  }
}

이제 연결을 확인해 보겠습니다. 다음 명령어를 실행하여 Gemini CLI를 입력합니다.

gemini

그런 다음 /mcp 명령어를 실행하면 GitHub MCP가 이미 올바르게 구성되어 있습니다.

a97c9a98f07dc87c.png

/mcp

그런 다음 다음 명령어를 제출하여 이 MCP 연결을 테스트해 보겠습니다.

59bfd79aba7cc386.png

Aggregate the findings from @code-review.md and @security-analysis.md into a single report and ensure no duplicates issues reported. Post this report as a comment on the relevant pull request for the current git branch on GitHub and display the pull request URL for manual review

여기에서 @code-review.md@security-analysis.md 표기법을 참고하세요. 이는 Gemini CLI에 전달할 파일을 참조하는 방법입니다. 이 명령어는 두 파일의 콘텐츠를 읽고 Github MCP 연결을 사용하여 이 브랜치와 관련된 풀 요청에 댓글을 푸시합니다. 그런 다음 풀 요청 URL에서 이를 확인할 수 있습니다.

864b859b56cfe9e7.png

9. 💡CI/CD 워크플로의 Gemini CLI

GitHub 사용자는 run-gemini-cli GitHub 작업을 활용하여 CI/CD 파이프라인에 Gemini CLI를 쉽게 삽입할 수 있습니다. 중요한 일상 코딩 작업을 위한 자율 에이전트이자 작업을 빠르게 위임할 수 있는 주문형 파트너 역할을 합니다.

이를 활용하여 GitHub 저장소 내에서 Gemini를 대화형으로 사용하여 pull 요청 검토, 문제 분류, 코드 분석 및 수정 등을 실행할 수 있습니다.

이 통합의 예는 이 pull 요청에서 확인할 수 있습니다. 여기서 러너 내에서 Gemini CLI 보안 확장 프로그램을 활용하고 Pull 요청이 생성될 때 검토를 제공합니다.

ad2a8e8d0a15e3f5.png

3cb40f104ce6a594.png

8edb7277fa6324b.png

ef48414c02a16dfa.png

10. 💡기타 Gemini CLI 확장 프로그램 살펴보기

8a7939ee0328e6e2.png

https://geminicli.com/extensions에서 더 많은 확장 프로그램을 살펴볼 수도 있습니다 . 더 흥미로운 도구를 확인해 보세요.

11. 🧹 정리

이 Codelab에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.