Skip to main content

Copilot SDK와 함께 GitHub OAuth 사용

사용자가 GitHub 계정으로 인증하고 애플리케이션을 통해 GitHub Copilot를 사용할 수 있도록 합니다.

누가 이 기능을 사용할 수 있나요?

GitHub Copilot SDK 는 모든 Copilot 계획에서 사용할 수 있습니다.

참고

          코필로트 SDK가 현재 기술 미리 보기에 있습니다. 기능 및 가용성은 변경될 수 있습니다.

직접 애플리케이션 내에서 GitHub 계정 인증을 제공합니다. 그 결과 사용자가 GitHub Copilot에 연결됩니다.

          **최적 대상:** 다중 사용자 앱, 조직 액세스 제어가 있는 내부 도구, SaaS 제품 및 사용자가 이미 GitHub 계정이 있는 앱.

작동 방식

OAuth 앱(또는GitHub)을 GitHub App 만들고 사용자가 권한을 부여하고 해당 액세스 토큰을 SDK에 전달합니다. Copilot 요청은 해당 구독을 사용하여 Copilot 인증된 각 사용자를 대신하여 이루어집니다. 이 흐름 및 아키텍처에 대한 자세한 시퀀스 다이어그램은 github/copilot-sdk 참조하세요.

          **주요 특징:**
  • 각 사용자는 자신의 GitHub 계정으로 인증합니다.
  •         Copilot 사용량은 각 사용자의 구독에 청구됩니다.
    
  •         GitHub 조직 및 엔터프라이즈 계정을 지원합니다.
    
  • 앱은 모델 API 키를 절대 처리하지 않습니다—GitHub가 모든 것을 관리합니다.

1단계: GitHub OAuth 앱 만들기

  1.        **
           GitHub 설정 > 개발자 설정 > OAuth 앱 > 새 OAuth 앱**으로 이동합니다. 조직의 경우 **조직 설정 > 개발자 설정으로** 이동합니다.
    
  2. 다음 필드를 입력합니다. * 애플리케이션 이름: 앱의 이름입니다. * 홈페이지 URL: 앱의 URL입니다. * 권한 부여 콜백 URL: OAuth 콜백 엔드포인트(예: https://YOUR-APP.com/auth/callback). YOUR-APP.com을 귀하의 도메인으로 대체합니다.
  3.        **클라이언트 ID**를 확인하고 **클라이언트 암호를** 생성합니다.
    

참고

OAuth 앱과 GitHub Apps은 모두 SDK에서 작동합니다. GitHub Apps 는 세분화된 사용 권한을 제공하며 새 프로젝트에 권장됩니다. OAuth 앱은 설정하는 것이 더 간단합니다. 토큰 흐름은 SDK의 관점에서 동일합니다.

2단계: OAuth 흐름 구현

애플리케이션은 표준 GitHub OAuth 흐름을 처리합니다. 다음은 서버 쪽 토큰 교환을 보여줍니다.

// Server-side: exchange authorization code for user token
async function handleOAuthCallback(code: string): Promise<string> {
    const response = await fetch("https://github.com/login/oauth/access_token", {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            Accept: "application/json",
        },
        body: JSON.stringify({
            client_id: process.env.GITHUB_CLIENT_ID,
            client_secret: process.env.GITHUB_CLIENT_SECRET,
            code,
        }),
    });

    const data = await response.json();
    return data.access_token; // gho_xxxx or ghu_xxxx
}

3단계: SDK에 토큰 전달

인증된 각 사용자에 대한 SDK 클라이언트를 만들고 해당 토큰을 전달합니다.

Node.js/ TypeScript

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

// Create a client for an authenticated user
function createClientForUser(userToken: string): CopilotClient {
    return new CopilotClient({
        githubToken: userToken,
        useLoggedInUser: false,  // Don't fall back to CLI sign-in
    });
}

// Usage
const client = createClientForUser("USER-ACCESS-TOKEN");
const session = await client.createSession({
    sessionId: `user-${userId}-session`,
    model: "gpt-4.1",
});

const response = await session.sendAndWait({ prompt: "Hello!" });
          `USER-ACCESS-TOKEN`을(를) 사용자 OAuth 액세스 토큰 (예: `gho_xxxx`)으로 교체합니다.

파이썬

from copilot import CopilotClient, PermissionHandler

def create_client_for_user(user_token: str) -> CopilotClient:
    return CopilotClient({
        "github_token": user_token,
        "use_logged_in_user": False,
    })

# Usage
client = create_client_for_user("USER-ACCESS-TOKEN")
await client.start()

session = await client.create_session(
    on_permission_request=PermissionHandler.approve_all,
    model="gpt-4.1",
    session_id=f"user-{user_id}-session",
)

response = await session.send_and_wait({"prompt": "Hello!"})

이동

func createClientForUser(userToken string) *copilot.Client {
    return copilot.NewClient(&copilot.ClientOptions{
        GithubToken:     userToken,
        UseLoggedInUser: copilot.Bool(false),
    })
}

// Usage
client := createClientForUser("USER-ACCESS-TOKEN")
client.Start(ctx)
defer client.Stop()

session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
    SessionID: fmt.Sprintf("user-%s-session", userID),
    Model:     "gpt-4.1",
})
response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: "Hello!"})

.NET

CopilotClient CreateClientForUser(string userToken) =>
    new CopilotClient(new CopilotClientOptions
    {
        GithubToken = userToken,
        UseLoggedInUser = false,
    });

// Usage
await using var client = CreateClientForUser("USER-ACCESS-TOKEN");
await using var session = await client.CreateSessionAsync(new SessionConfig
{
    SessionId = $"user-{userId}-session",
    Model = "gpt-4.1",
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = "Hello!" });

엔터프라이즈 및 조직 액세스

          GitHub OAuth는 기본적으로 엔터프라이즈 시나리오를 지원합니다. 사용자가 GitHub으로 인증할 때 조직 멤버십 및 기업 관련 내용이 포함됩니다.

조직 멤버 자격 확인

OAuth 후에는 사용자가 조직에 속하는지 확인할 수 있습니다.

async function verifyOrgMembership(
    token: string,
    requiredOrg: string
): Promise<boolean> {
    const response = await fetch("https://api.github.com/user/orgs", {
        headers: { Authorization: `Bearer ${token}` },
    });
    const orgs = await response.json();
    return orgs.some((org: any) => org.login === requiredOrg);
}

// In your auth flow
const token = await handleOAuthCallback(code);
if (!await verifyOrgMembership(token, "YOUR-ORG")) {
    throw new Error("User is not a member of the required organization");
}
const client = createClientForUser(token);
          `YOUR-ORG`를 GitHub 조직 이름으로 교체합니다.

엔터프라이즈 관리 사용자 (EMU)

의 경우 관리형 사용자 계정흐름은 동일합니다. EMU 사용자는 다른 사용자와 마찬가지로 OAuth를 통해 GitHub 인증하고 엔터프라이즈 정책(IP 제한, SAML SSO)은 자동으로 적용 GitHub 됩니다.

// No special SDK configuration needed for EMU
const client = new CopilotClient({
    githubToken: emuUserToken,
    useLoggedInUser: false,
});

지원되는 토큰 형식

토큰 접두사출처지원됨
gho_OAuth 사용자 액세스 토큰
ghu_
          GitHub App 사용자 액세스 토큰 | 예 |

| github_pat_ | Fine-grained personal access token | 예 | | ghp_ | Personal access token (classic) | 아니요(닫기) |

토큰 수명 주기 관리

애플리케이션은 토큰 스토리지, 새로 고침 및 만료 처리를 담당합니다. SDK는 사용자가 제공하는 토큰을 사용하며 OAuth 수명 주기를 관리하지 않습니다.

토큰 새로 고침 패턴

async function getOrRefreshToken(userId: string): Promise<string> {
    const stored = await tokenStore.get(userId);

    if (stored && !isExpired(stored)) {
        return stored.accessToken;
    }

    if (stored?.refreshToken) {
        const refreshed = await refreshGitHubToken(stored.refreshToken);
        await tokenStore.set(userId, refreshed);
        return refreshed.accessToken;
    }

    throw new Error("User must re-authenticate");
}

다중 사용자 패턴

각 사용자는 자신의 토큰을 사용하여 자신의 SDK 클라이언트를 가져옵니다. 이렇게 하면 가장 강력한 격리가 제공됩니다.

const clients = new Map<string, CopilotClient>();

function getClientForUser(userId: string, token: string): CopilotClient {
    if (!clients.has(userId)) {
        clients.set(userId, new CopilotClient({
            githubToken: token,
            useLoggedInUser: false,
        }));
    }
    return clients.get(userId)!;
}

제한점

Limitation세부 정보
          **
          Copilot 구독 필요** | 각 사용자에게는 활성 GitHub Copilot 구독이 필요합니다. |

| 토큰 관리는 사용자의 책임입니다. | 토큰 만료를 저장, 새로 고치고 처리해야 합니다. | | ** GitHub 필요한 계정** | 사용자에게 계정이 있어야 합니다 GitHub . | | 사용자당 속도 제한 | 사용량에는 각 사용자의 Copilot 속도 제한이 적용됩니다. |

다음 단계