# 인증

GitHub Copilot SDK는 다양한 사용 사례에 맞게 여러 인증 방법을 지원합니다. 배포 시나리오와 가장 일치하는 방법을 선택합니다.

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

## 인증 방법

| Method                                                                   | 사용 사례                                         | Copilot 구독 필요       |
| ------------------------------------------------------------------------ | --------------------------------------------- | ------------------- |
| [GitHub 로그인한 사용자](#github-signed-in-user)                                | 사용자가 GitHub 사용하여 로그인하는 대화형 앱                  | Yes                 |
| [GitHub OAuth 앱](#github-oauth-app)                                      | OAuth를 통해 사용자를 대신하여 작동하는 앱                    | Yes                 |
| [환경 변수](#environment-variables)                                          | CI/CD, 자동화, 서버-서버                             | Yes                 |
| [서버-서버 인증](/ko/copilot/how-tos/copilot-sdk/auth/server-to-server-tokens) | 조직 귀속 자동화 및 조직 직접 청구                          | 사용자 구독 없음; 조직 정책 필요 |
| [BYOK(사용자 고유의 키 가져오기)](/ko/copilot/how-tos/copilot-sdk/auth/byok)        | 사용자 고유의 API 키 사용(Microsoft Foundry, OpenAI 등) | No                  |

## GitHub 로그인 사용자

Copilot CLI를 대화형으로 실행할 때 기본 인증 방법입니다. 사용자는 GitHub OAuth 디바이스 흐름을 통해 인증하고 SDK는 저장된 자격 증명을 사용합니다.

**작동 방식:**

1. 사용자는 `copilot` CLI를 실행하고 GitHub OAuth를 통해 로그인합니다.
2. 자격 증명은 시스템 키 집합에 안전하게 저장됩니다.
3. SDK는 저장된 자격 증명을 자동으로 사용합니다.

**SDK 구성:**

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;

// Default: uses logged-in user credentials
await using CopilotClient client = new();
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
import copilot "github.com/github/copilot-sdk/go"

// Default: uses logged-in user credentials
client := copilot.NewClient(nil)
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;

// Default: uses logged-in user credentials
var client = new CopilotClient();
client.start().get();
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient

# Default: uses logged-in user credentials
client = CopilotClient()
await client.start()
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

```rust
use github_copilot_sdk::{Client, ClientOptions};

// Default: uses logged-in user credentials
let client = Client::start(ClientOptions::default()).await?;
```

</div>

<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient } from "@github/copilot-sdk";

// Default: uses logged-in user credentials
const client = new CopilotClient();
```

</div>

</div>

**사용 시기:**

* 사용자가 직접 상호 작용하는 데스크톱 애플리케이션
* 개발 및 테스팅 환경
* 사용자가 대화형으로 로그인할 수 있는 모든 시나리오

## GitHub OAuth 앱

OAuth GitHub 앱을 사용하여 애플리케이션을 통해 사용자를 인증하고 해당 자격 증명을 SDK에 전달합니다. 이를 통해 애플리케이션은 앱에 권한을 부여한 사용자를 대신해 Copilot API 요청을 보낼 수 있습니다.

**작동 방식:**

1. 사용자가 OAuth GitHub 앱에 권한을 부여합니다.
2. 앱이 사용자 액세스 토큰(`gho_` 또는 `ghu_` 접두사)을 받습니다.
3. 클라이언트 구성을 통해 SDK에 토큰 전달

**SDK 구성:**

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;

await using var client = new CopilotClient(new CopilotClientOptions
{
    GitHubToken = userAccessToken,     // Token from OAuth flow
    UseLoggedInUser = false,           // Don't use stored CLI credentials
});
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
import copilot "github.com/github/copilot-sdk/go"

client := copilot.NewClient(&copilot.ClientOptions{
    GitHubToken:       userAccessToken,      // Token from OAuth flow
    UseLoggedInUser:   copilot.Bool(false),  // Don't use stored CLI credentials
})
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

<!-- docs-validate: skip -->

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;

var client = new CopilotClient(new CopilotClientOptions()
    .setGitHubToken(userAccessToken)  // Token from OAuth flow
    .setUseLoggedInUser(false)        // Don't use stored CLI credentials
);
client.start().get();
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient

client = CopilotClient({
    "github_token": user_access_token,  # Token from OAuth flow
    "use_logged_in_user": False,        # Don't use stored CLI credentials
})
await client.start()
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

```rust
use github_copilot_sdk::{Client, ClientOptions};

let client = Client::start(
    ClientOptions::default()
        .with_github_token(user_access_token)
        .with_use_logged_in_user(false),
).await?;
```

</div>

<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient({
    gitHubToken: userAccessToken,  // Token from OAuth flow
    useLoggedInUser: false,        // Don't use stored CLI credentials
});
```

</div>

</div>

**지원되는 토큰 유형:**

* `gho_` - OAuth 사용자 액세스 토큰
* `ghu_` - 앱 사용자 액세스 토큰 GitHub
* `github_pat_` - 세분화된 개인용 액세스 토큰

**지원되지 않음:**

* `ghp_` - 클래식 개인용 액세스 토큰(사용되지 않음)

**사용 시기:**

* 사용자가 GitHub 통해 로그인하는 웹 애플리케이션
* Copilot 위에 빌드되는 SaaS 애플리케이션
* 다른 사용자를 대신하여 요청을 수행해야 하는 모든 다중 사용자 애플리케이션

자세한 내용은 [GitHub OAuth 설정](/ko/copilot/how-tos/copilot-sdk/setup/github-oauth)을(를) 참조하세요.

## 환경 변수

자동화, CI/CD 파이프라인 및 서버-서버 시나리오의 경우 환경 변수를 사용하여 인증할 수 있습니다.

사용자의 개인 액세스 토큰을 사용하지 않아야 하는 조직 특성 자동화는 [서버-서버 인증](/ko/copilot/how-tos/copilot-sdk/auth/server-to-server-tokens)을 참조하세요.

**지원되는 환경 변수(우선 순위):**

1. `COPILOT_GITHUB_TOKEN` - 명시적 Copilot 사용에 권장됨
2. `GH_TOKEN` - GitHub CLI 호환
3. `GITHUB_TOKEN` - GitHub Actions 호환

**작동 방식:**

1. 유효한 토큰으로 지원되는 환경 변수 중 하나를 설정합니다.
2. SDK는 토큰을 자동으로 검색하고 사용합니다.

**SDK 구성:**

코드 변경이 필요하지 않습니다. SDK는 환경 변수를 자동으로 검색합니다.

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;

// Token is read from environment variable automatically
await using CopilotClient client = new();
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
import copilot "github.com/github/copilot-sdk/go"

// Token is read from environment variable automatically
client := copilot.NewClient(nil)
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;

// Token is read from environment variable automatically
var client = new CopilotClient();
client.start().get();
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient

# Token is read from environment variable automatically
client = CopilotClient()
await client.start()
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

```rust
use github_copilot_sdk::{Client, ClientOptions};

// Token is read from environment variable automatically
let client = Client::start(ClientOptions::default()).await?;
```

</div>

<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient } from "@github/copilot-sdk";

// Token is read from environment variable automatically
const client = new CopilotClient();
```

</div>

</div>

**사용 시기:**

* CI/CD 파이프라인(GitHub Actions, Jenkins 등)
* 자동화된 테스트
* 서비스 계정이 있는 서버 쪽 애플리케이션
* 대화형 로그인을 사용하지 않으려는 경우 개발

## BYOK(사용자 고유의 키 가져오기)

BYOK를 사용하면 Microsoft Foundry, OpenAI 또는 Anthropic 같은 모델 공급자의 고유한 API 키를 사용할 수 있습니다. 이렇게 하면 GitHub Copilot 인증이 완전히 무시됩니다.

**주요 이점:**

* GitHub Copilot 구독 필요 없음
* 엔터프라이즈 모델 배포 사용
* 모델 공급자를 사용하여 직접 청구
* Microsoft Foundry, OpenAI, Anthropic 및 OpenAI 호환 엔드포인트 지원

**다음을 비롯한 자세한 내용은 [BYOK(사용자 고유의 키 가져오기)](/ko/copilot/how-tos/copilot-sdk/auth/byok) 을 참조하세요**.

* Microsoft Foundry 설정
* 공급자 구성 옵션
* 제한 사항 및 고려 사항
* 전체 코드 예제

## 인증 우선 순위

여러 인증 방법을 사용할 수 있는 경우 SDK는 이 우선 순위 순서로 사용합니다.

1. **명시적 `gitHubToken`** - SDK 클라이언트 또는 세션 구성에 직접 전달되는 토큰
2. **직접 API 토큰** - `GITHUB_COPILOT_API_TOKEN` 포함 `COPILOT_API_URL`
3. **환경 변수 토큰** - `COPILOT_GITHUB_TOKEN``GH_TOKEN` → → `GITHUB_TOKEN`
4. **저장된 OAuth 자격 증명** - 이전 `copilot` CLI 로그인에서
5. **GitHub CLI** - `gh auth` 자격 증명

다중 사용자 서버 모드의 경우 각 세션이 올바른 GitHub ID로 실행되도록 세션별 `gitHubToken` 전달합니다. [다중 테넌트 및 서버 배포](/ko/copilot/how-tos/copilot-sdk/setup/multi-tenancy) 참조하세요.

## 자동 로그인 사용 안 림

SDK가 저장된 자격 증명 또는 `gh` CLI 인증을 자동으로 사용하지 않도록 하려면 로그인한 사용자 대체를 사용하지 않도록 구성합니다.

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
await using var client = new CopilotClient(new CopilotClientOptions
{
    UseLoggedInUser = false,  // Only use explicit tokens
});
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
client := copilot.NewClient(&copilot.ClientOptions{
    UseLoggedInUser: copilot.Bool(false),  // Only use explicit tokens
})
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;

var client = new CopilotClient(new CopilotClientOptions()
    .setUseLoggedInUser(false)  // Only use explicit tokens
);
client.start().get();
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
client = CopilotClient({
    "use_logged_in_user": False,  # Only use explicit tokens
})
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

```rust
use github_copilot_sdk::{Client, ClientOptions};

let client = Client::start(
    ClientOptions::default().with_use_logged_in_user(false),
).await?;
```

</div>

<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
const client = new CopilotClient({
    useLoggedInUser: false,  // Only use explicit tokens
});
```

</div>

</div>

## 다음 단계

* [BYOK(사용자 고유의 키 가져오기)](/ko/copilot/how-tos/copilot-sdk/auth/byok) - 사용자 고유의 API 키를 사용하는 방법 알아보기
* [첫 번째 Copilot 기반 앱 빌드](/ko/copilot/how-tos/copilot-sdk/getting-started) - 첫 번째 Copilot 지원 앱 빌드
* [GitHub Copilot SDK에서 MCP 서버 사용](/ko/copilot/how-tos/copilot-sdk/features/mcp) - 외부 도구에 연결