> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arouter.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# API Key 교체

> 무중단으로 ARouter API Key를 교체하는 모범 사례. 정기적인 자격 증명 갱신으로 애플리케이션을 안전하게 유지하세요.

API Key를 정기적으로 교체하면 유출된 키의 피해 범위를 최소화하고 많은 보안 규정 준수 요구사항을 충족할 수 있습니다. ARouter의 키 관리 API는 무중단 교체를 지원합니다.

## 교체 전략

가장 안전한 교체 방식은 **먼저 생성 후 삭제**입니다:

1. 이전 키와 동일한 권한으로 새 키 생성
2. 애플리케이션에 새 키 배포
3. 새 키 정상 작동 확인
4. 이전 키 삭제

이렇게 하면 새 키가 정상 작동이 확인될 때까지 이전 키로 트래픽이 계속 처리되므로 다운타임이 발생하지 않습니다.

***

## 1단계: 새 키 생성

[키 관리 API](/ko/api-reference/keys/create-key)를 사용하여 교체 키를 생성합니다:

<Tabs>
  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST https://api.arouter.ai/v1/keys \
      -H "Authorization: Bearer lr_live_xxxx" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "production-v2",
        "allowed_providers": ["openai", "anthropic", "google"],
        "spending_limit": 500.00
      }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    import requests

    response = requests.post(
        "https://api.arouter.ai/v1/keys",
        headers={"Authorization": "Bearer lr_live_xxxx"},
        json={
            "name": "production-v2",
            "allowed_providers": ["openai", "anthropic", "google"],
            "spending_limit": 500.00,
        },
    )
    new_key = response.json()["key"]
    print(f"New key created: {new_key[:8]}...")
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    const response = await fetch("https://api.arouter.ai/v1/keys", {
      method: "POST",
      headers: {
        Authorization: "Bearer lr_live_xxxx",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name: "production-v2",
        allowed_providers: ["openai", "anthropic", "google"],
        spending_limit: 500.0,
      }),
    });

    const { key } = await response.json();
    console.log(`New key: ${key.substring(0, 8)}...`);
    ```
  </Tab>
</Tabs>

**반환된 키 값을 즉시 저장하세요** — ARouter는 생성 시 한 번만 전체 키를 반환합니다.

***

## 2단계: 애플리케이션 업데이트

배포 환경의 `AROUTER_API_KEY` 환경 변수(또는 해당 시크릿)를 업데이트합니다:

```bash theme={null}
# .env 파일 사용 예시
AROUTER_API_KEY=lr_live_new_key_here

# Kubernetes 시크릿 업데이트 예시
kubectl create secret generic arouter-credentials \
  --from-literal=api-key=lr_live_new_key_here \
  --dry-run=client -o yaml | kubectl apply -f -
```

새 키를 적용하기 위해 애플리케이션을 재배포하거나 재시작합니다.

***

## 3단계: 새 키 확인

이전 키를 삭제하기 전에 새 키가 정상 작동하는지 확인합니다:

<Tabs>
  <Tab title="cURL">
    ```bash theme={null}
    curl https://api.arouter.ai/v1/models \
      -H "Authorization: Bearer lr_live_new_key_here"
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    from openai import OpenAI

    # 새 키로 테스트
    client = OpenAI(
        base_url="https://api.arouter.ai/v1",
        api_key="lr_live_new_key_here",
    )

    response = client.chat.completions.create(
        model="openai/gpt-5.4",
        messages=[{"role": "user", "content": "ping"}],
        max_tokens=5,
    )
    print("New key verified:", response.choices[0].message.content)
    ```
  </Tab>
</Tabs>

[ARouter 대시보드](https://arouter.ai/keys)를 확인하여 새 키에 요청이 나타나는지 확인합니다.

***

## 4단계: 이전 키 삭제

새 키 정상 작동이 확인되면 이전 키 ID를 사용하여 삭제합니다:

<Tabs>
  <Tab title="cURL">
    ```bash theme={null}
    curl -X DELETE https://api.arouter.ai/v1/keys/key_oldid \
      -H "Authorization: Bearer lr_live_new_key_here"
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    import requests

    requests.delete(
        "https://api.arouter.ai/v1/keys/key_oldid",
        headers={"Authorization": "Bearer lr_live_new_key_here"},
    )
    print("Old key deleted")
    ```
  </Tab>
</Tabs>

***

## 자동 교체

높은 보안이 필요한 환경에서는 CI/CD 시스템이나 시크릿 매니저를 사용하여 일정에 따라 자동으로 교체합니다:

### GitHub Actions 예시

```yaml theme={null}
name: Rotate ARouter Key

on:
  schedule:
    - cron: '0 0 1 * *'  # 매월

jobs:
  rotate:
    runs-on: ubuntu-latest
    steps:
      - name: Create new key
        id: create
        run: |
          NEW_KEY=$(curl -s -X POST https://api.arouter.ai/v1/keys \
            -H "Authorization: Bearer ${{ secrets.AROUTER_API_KEY }}" \
            -H "Content-Type: application/json" \
            -d '{"name": "production-auto-rotated"}' \
            | jq -r .key)
          echo "new_key=$NEW_KEY" >> $GITHUB_OUTPUT

      - name: Update secret
        uses: gliech/create-github-secret-action@v1
        with:
          name: AROUTER_API_KEY
          value: ${{ steps.create.outputs.new_key }}
          token: ${{ secrets.GH_TOKEN }}
```

***

## 활성 키 목록 조회

사용 중인 키를 감사하기 위해 모든 활성 키를 나열합니다:

```bash theme={null}
curl https://api.arouter.ai/v1/keys \
  -H "Authorization: Bearer lr_live_xxxx"
```

응답:

```json theme={null}
{
  "data": [
    {
      "id": "key_abc123",
      "name": "production-v2",
      "created_at": "2025-01-15T10:00:00Z",
      "last_used_at": "2025-04-01T08:30:00Z",
      "spending_limit": 500.00
    },
    {
      "id": "key_def456",
      "name": "staging",
      "created_at": "2025-03-01T09:00:00Z",
      "last_used_at": "2025-04-01T07:15:00Z",
      "spending_limit": 50.00
    }
  ]
}
```

***

## 모범 사례

* **일정에 따라 교체** — 대부분의 애플리케이션에서 월별 교체가 좋은 기준입니다
* **유출이 의심되면 즉시 교체** — 다음 예정된 교체를 기다리지 마세요
* **설명적인 이름 사용** — 키 이름에 버전이나 날짜 포함 (예: `production-2025-04`, `production-v3`)
* **소비 한도 설정** — 항상 프로덕션 키에 `spending_limit`을 설정하여 위험 노출을 제한
* **환경별 별도 키 사용** — 프로덕션과 스테이징 환경 간에 키를 공유하지 않기
* **정기적으로 감사** — 매월 키 목록을 검토하고 사용하지 않는 키 삭제
* **시크릿 매니저에 키 저장** — 버전 관리의 `.env` 파일이 아닌 AWS Secrets Manager, HashiCorp Vault 또는 동등한 도구 사용

전체 키 관리 가이드는 [키 관리](/ko/guides/key-management)를, 전체 API 참조는 [키 관리 API](/ko/api-reference/keys/create-key)를 확인하세요.
