"ChatGPT로 로그인"은 전 세계 ChatGPT 사용자가 사용할 수 있는 OpenAI의 OAuth 2.0 및 OpenID Connect(OIDC) 로그인 서비스입니다. 앱은 안정적인 계정 ID와 사용자의 이름, 이메일 주소, 프로필 사진을 받을 수 있습니다. 2026년 9월 29일 DevDay 이후 Plus 및 Pro 사용자는 참여 앱에서 설정한 앱별 주간 한도 내에서, 앱의 API 키 대신 자신의 ChatGPT 요금제로 AI 요청을 실행하도록 승인할 수 있습니다. 앱은 사용자의 ChatGPT 대화, 메모리 또는 OpenAI API 키를 받지 않습니다.
이 기능은 로그인뿐 아니라 AI 요청의 비용 처리 방식에도 영향을 줍니다. 이 글에서는 OAuth/OIDC 흐름, 사용자 요금제 사용 방식, 현재 통합 가능한 대상, 앱 API 키와 사용자 요금제를 선택하는 기준, 그리고 Apidog에서 로그인 및 실패 경로를 테스트하는 방법을 다룹니다. 이벤트 전체 내용은 DevDay 2026 요약을 참고하세요. 신원 확인과 권한 부여의 차이가 불분명하다면 먼저 OAuth 대 OpenID를 읽어보세요.
ChatGPT로 로그인 개요
| 항목 | OpenAI 문서 내용 |
|---|---|
| 신원 확인 범위 | openid profile email |
| 요금제 사용 범위(오픈 소스 흐름) |
offline_access resource.invoke chatgpt.tokens.use.direct, resource=https://api.openai.com/v1
|
| 앱이 받는 항목 | ID 토큰, 요금제 사용 시 액세스 토큰 및 새로고침 토큰 |
| 요금제 사용 자격 | 참여 앱의 Plus 및 Pro 사용자 |
| 사용량이 계산되는 위치 | 요금제의 ChatGPT Work 및 Codex 사용량 |
| 앱별 제어 | 전체 주간 사용량의 일부로 설정하는 주간 상한선. 상한선 이후 크레딧 사용은 기본 비활성화 |
| 요금제 사용 토큰 | 액세스 토큰 1시간, 새로고침 토큰 30일. 새로고침 시 토큰 교체 |
| 개발자 접근 | 상업용 앱은 관심 양식을 통한 제한적 시험 사용, 오픈 소스 앱은 셀프 서비스 |
출처: OpenAI의 ChatGPT로 로그인 문서, 토큰 참조, 다른 앱에서 ChatGPT 요금제 사용 도움말 문서.
앱이 받는 것과 받지 않는 것
신원 확인은 기본 흐름입니다. openid profile email 범위를 요청하면 클라이언트는 ID 토큰을 받습니다. 웹사이트 가이드에 따르면:
-
profile: 이름, 프로필 사진 등 사용 가능한 프로필 클레임 -
email: 이메일 주소 및 이메일 확인 클레임
신원 확인 범위는 ChatGPT 대화나 OpenAI API 리소스 접근 권한을 부여하지 않습니다.
사용자를 이메일 주소만으로 식별하지 마세요. 확인된 sub 값과 발급자(iss), 클라이언트 ID(aud)를 함께 기준으로 계정을 식별해야 합니다. OpenAI는 이메일 일치만으로 계정 소유권을 증명할 수 없다고 경고합니다. 기존 계정에 연결할 때는 사용자에게 별도의 연결 확인을 요청하세요.
요금제 사용은 별도 승인입니다. 사용자가 추가 범위를 승인하면, 적격한 Responses API 요청에 사용할 액세스 토큰이 토큰 응답에 포함됩니다. 신원 확인만 사용하는 클라이언트에는 access_token이 필요하지 않으며 id_token만 처리하면 됩니다.
OAuth 흐름 구현하기
웹사이트 흐름은 PKCE를 사용하는 표준 OAuth 2.0 권한 부여 코드 흐름과 OIDC를 사용합니다.
먼저 https://auth.openai.com/.well-known/openid-configuration에서 OpenID Connect 설정을 로드하세요. 문서에 명시된 주요 엔드포인트는 다음과 같습니다.
Issuer: https://auth.openai.com
Authorization endpoint: https://auth.openai.com/api/accounts/authorize
Token endpoint: https://auth.openai.com/api/accounts/oauth/token
JWKS URI: https://auth.openai.com/.well-known/jwks.json
구현 순서는 다음과 같습니다.
- 백엔드에서 요청마다 새로운
state, PKCE 검증자와 S256 챌린지,nonce를 생성합니다. - 클라이언트 ID, 등록된 리디렉션 URI, 요청 범위를 포함해 브라우저를 권한 부여 엔드포인트로 보냅니다.
- 사용자가 로그인 및 동의를 완료하면 OpenAI가 콜백 URL로 authorization code를 반환합니다.
- 백엔드에서
state를 검증하고, code를 토큰으로 교환합니다. - ID 토큰의 서명, 발급자, 대상, 만료 시간,
nonce를 검증합니다. -
sub를 기준으로 로컬 계정을 조회·생성·연결한 뒤 앱 자체 세션을 발급합니다.
공개 클라이언트는 클라이언트 시크릿을 전송하지 않습니다. client_secret_basic을 사용하는 기밀 클라이언트는 HTTP Basic 인증 헤더에만 시크릿을 넣어야 합니다.
오픈 소스 도구의 등록 방식은 다릅니다. 오픈 소스 로그인 가이드에 따르면 다음 값으로 시작합니다.
client_id=dynamic_agent_client- 앱 이름을 지정하는
agent_name_hint - 호스트별로 영구 보관하는
ext_agent_host_id
콜백에서는 이후 저장하고 재사용할 발급된 클라이언트 ID(예: oaiapp_...)를 반환합니다. 리디렉션 URI는 127.0.0.1 루프백 URI이며, 클라이언트 시크릿은 사용하지 않습니다.
사용자에게 요금제 사용 방식을 안내하는 방법
사용자 화면과 지원 문서에는 다음 내용을 명확히 표시하세요.
- 적격 요청은 사용자 요금제 사용량으로 계산됩니다. Plus 또는 Pro 요금제의 ChatGPT Work 및 Codex 사용량에 반영됩니다.
- 앱별 주간 상한선이 있습니다. 사용자는 전체 주간 사용량의 백분율로 상한선을 설정합니다. 문서의 설정 예시는 10%~100%입니다.
- 상한선은 예약된 사용량이 아닙니다. 다른 서비스에서 사용량을 많이 쓰면 앱에서 사용할 수 있는 요금제가 먼저 소진될 수 있습니다.
- 크레딧 사용은 선택 사항입니다. 한도 초과 후 크레딧으로 계속 사용하도록 하는 기능은 기본 비활성화이며, 앱 상한선을 100%로 설정해야 합니다.
- Plus에는 공유 5시간 제한이 있습니다. 계정 및 세션 문서에 따르면 이 제한은 요금제를 사용하는 모든 앱에 걸쳐 적용됩니다. Pro에는 적용되지 않습니다.
- 연결 해제는 이후 요청만 중단합니다. 이미 사용된 사용량은 되돌아가지 않으며, OpenAI가 앱에 연결 해제 이벤트를 전달하지 않습니다. 이후 요청 또는 토큰 새로고침 실패를 통해 상태를 감지해야 합니다.
사용자는 ChatGPT 설정의 사용량 페이지(chatgpt.com/settings/usage)에서 이를 관리합니다. OpenAI UI 가이드라인에 따라 앱에는 사용량 관리 링크를 제공하세요.
출시 시 참여 대상과 클라이언트 ID 획득 방법
OpenAI의 DevDay 요약에는 Cognition의 Devin, Notion, Vercel, T3, OpenClaw, Dactyl을 포함한 16개의 요금제 사용 파트너가 언급되어 있습니다. The New Stack은 Amp, Warp, Kilo Code, OpenCode도 언급하며 Lovable은 출시 예정으로 표시합니다. OpenClaw를 사용 중이라면 두 목록 모두에서 확인할 수 있습니다.
The New Stack 보도에 따르면 샘 알트만은 무대에서 다음과 같이 발표했습니다.
이제 사용자들이 시작하기 위해 토큰 비용을 부담할 필요가 없습니다.
참여 방식은 앱 형태에 따라 다릅니다.
- 상업용 또는 호스팅 앱: 로그인은 제한된 시험 사용으로 제공됩니다. 신원 확인만 원하든 요금제 사용도 원하든 OpenAI 관심 양식을 통해 대기자 명단에 등록하고 클라이언트 ID를 요청해야 합니다.
- 오픈 소스 및 로컬 호스팅 도구: 위에서 설명한 셀프 서비스 흐름으로 요금제 사용을 설정할 수 있습니다.
앱 API 비용 처리 방식의 변화
기존에는 앱이 API 키로 토큰 비용을 지불하고, 자체 가격 정책을 통해 비용을 회수합니다. 요금제 사용을 활성화하면 적격 요청의 모델 비용이 사용자 구독으로 전환됩니다. 사용량이 늘어도 앱의 토큰 비용이 직접 증가하지 않는 대신, 요청 가능 여부와 기능 범위에 대한 제어가 줄어듭니다.
| 항목 | 앱의 API 키 | 사용자의 ChatGPT 요금제 |
|---|---|---|
| 비용 부담 주체 | 앱, 토큰당 비용 | 사용자 요금제. 선택 동의 시에만 크레딧 사용 |
| 사용 가능 대상 | 모든 사용자 |
chatgpt.tokens.use.direct를 승인한 Plus 및 Pro 사용자 |
| 제한 | 앱의 비율 제한 계층 | 주간 요금제 사용량, 앱별 상한선, Plus의 5시간 창 |
| 요청 형태 | 전체 Responses API |
store: false, stream: true 필수. temperature, max_output_tokens, 파일 검색, 코드 인터프리터 사용 불가 |
| 일반적인 실패 | 계층 초과 시 429 | 429 subscription_sharing_usage_limit_exceeded, 또는 스트림 중간 response.failed
|
| 대체 처리 | 앱이 직접 설계 | 자동 전환 없음. OpenAI가 청구 방식을 자동으로 변경하지 않음 |
| 사용자에게 표시할 내용 | 앱 사용량 및 가격 | “ChatGPT 요금제 사용 중”, 사용량 관리 링크, 지원하는 앱 요금제 |
이 제한은 OpenAI의 미리 보기 제한 문서에 명시되어 있습니다. 저장된 대화 상태나 호스팅된 도구가 필요한 기능은 현재 사용자 요금제로 실행할 수 없습니다.
실용적인 기본 전략은 하이브리드 구성입니다.
- Plus 및 Pro 사용자의 대화형 작업: 사용자 요금제 사용
- 무료 사용자, 백그라운드 작업, CI, 예약된 에이전트: 앱 API 키 사용
- 사용자 상한선 도달: 사용량 관리 링크 표시 후 앱 크레딧 등 보조 옵션 제안
일반적인 설계 비교는 API 키 대 OAuth를 참고하세요. 사용자를 대신해 AI 에이전트가 안전하게 동작하도록 설계하는 방법은 AI 에이전트를 위한 OAuth에서 확인할 수 있습니다.
Apidog에서 로그인 흐름과 실패 경로 테스트하기
Apidog가 ChatGPT 로그인 자체를 대신 처리하는 것은 아닙니다. Apidog는 OAuth 설정, 토큰 교환 요청, 오류 처리 로직을 검증하는 데 사용합니다. Apidog를 다운로드한 뒤 테스트 환경을 만드세요.
1. 클라이언트 설정을 환경 변수로 저장하기
다음 환경 변수를 추가하세요.
SIWC_CLIENT_ID
SIWC_REDIRECT_URI
SIWC_CLIENT_SECRET
ACCESS_TOKEN
SIWC_CLIENT_SECRET은 기밀 클라이언트에서만 사용하며 민감한 값으로 저장하세요. 요청 본문과 헤더에서는 값을 직접 넣지 말고 아래처럼 참조합니다.
{{SIWC_CLIENT_ID}}
{{SIWC_REDIRECT_URI}}
{{ACCESS_TOKEN}}
2. PKCE 권한 부여 코드 흐름 실행하기
Apidog의 인증 탭에서 다음을 설정하세요.
- 인증 방식: OAuth 2.0 Authorization Code
- PKCE: 활성화
- Authorization URL:
https://auth.openai.com/api/accounts/authorize - Token URL:
https://auth.openai.com/api/accounts/oauth/token - Scope:
openid profile email - Redirect URI: OpenAI 클라이언트에 등록한 콜백 URL
각 필드의 설정 방법은 Apidog OAuth 2.0 가이드를 참고하세요.
3. ID 토큰 응답 검증하기
토큰 엔드포인트에 대한 POST 요청을 별도로 저장하세요. 요청에는 authorization code, PKCE verifier, 리디렉션 URI, 클라이언트 ID를 포함합니다.
응답 후처리 스크립트에서는 최소한 응답 상태와 ID 토큰 클레임을 확인하세요.
const body = pm.response.json();
pm.test("token exchange returned an ID token", () => {
pm.expect(pm.response.code).to.eql(200);
pm.expect(body.id_token).to.be.a("string");
});
const decode = require("atob");
const part = body.id_token
.split(".")[1]
.replace(/-/g, "+")
.replace(/_/g, "/");
const claims = JSON.parse(
decode(part + "=".repeat((4 - (part.length % 4)) % 4))
);
pm.test("ID token claims match this client", () => {
pm.expect(claims.iss).to.eql("https://auth.openai.com");
pm.expect(claims.aud).to.include(pm.environment.get("SIWC_CLIENT_ID"));
pm.expect(claims.sub).to.be.a("string").and.not.empty;
pm.expect(claims.exp * 1000).to.be.above(Date.now());
});
name, email, picture는 제공될 때만 반환될 수 있으므로 필수 단언 대신 로그로 기록하세요.
요금제 사용을 요청했다면 body.scope에 chatgpt.tokens.use.direct가 포함되는지도 확인합니다.
JWT 서명 검증과
nonce검증은 테스트 도구가 아니라 백엔드에서 반드시 수행해야 합니다.
4. 실패 응답 모의하기
실제 Plus 계정을 고정된 테스트 데이터로 사용하지 마세요. Apidog 모의 서버에서 다음 실패 응답을 만들어 클라이언트 동작을 검증하세요.
-
요금제 사용 거부:
scope에chatgpt.tokens.use.direct가 없는 토큰 응답을 반환합니다. 앱은 로그인 세션을 유지하고, 요금제 사용을 활성화하거나 다른 결제 경로를 선택하도록 안내해야 합니다. -
상한선 도달:
error.code가subscription_sharing_usage_limit_exceeded인 429 응답을 반환합니다. 스트리밍 중에는 동일한 코드가 담긴response.failed이벤트를 반환합니다. 앱이 추가 요금제 요청을 중지하는지 확인하세요. -
자격 없음: 403
subscription_sharing_user_not_eligible를 반환합니다. 이 경우 재시도하거나 OAuth 흐름을 반복하지 않아야 합니다. -
연결 해제됨: 새로고침 요청에
invalid_grant, API 요청에 401subscription_sharing_invalid_user를 반환합니다. 앱은 토큰을 삭제하고 재로그인을 요청해야 합니다.
이 사례를 테스트 시나리오로 묶고 Apidog CLI로 CI에서 실행하세요. 전체 오류 목록은 OpenAI의 오류 및 복구 문서에서 확인할 수 있습니다.
5. 실제 스트리밍 요청 확인하기
실제 요금제 토큰으로 Responses API 스트리밍 요청을 보내세요. response.completed 이벤트가 성공의 최종 신호인지 확인해야 합니다.
curl --no-buffer https://api.openai.com/v1/responses \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6.1-sol",
"input": [{"role": "user", "content": "Say exactly: Hello, world!"}],
"store": false,
"stream": true
}'
Apidog에서는 Authorization: Bearer {{ACCESS_TOKEN}} 헤더를 설정해 같은 요청을 실행할 수 있습니다.
자주 묻는 질문
무료 사용자도 ChatGPT로 로그인할 수 있나요?
예. ChatGPT 사용자는 전 세계적으로 로그인할 수 있습니다. 다만 다른 앱에서 ChatGPT 요금제를 사용하려면 Plus 또는 Pro가 필요합니다.
앱이 사용자의 OpenAI API 키를 받나요?
아니요. 앱은 ID 토큰과, 요금제 사용을 승인한 경우 적격한 Responses API 요청용 OAuth 액세스 토큰을 받습니다.
사용자가 앱별 상한선에 도달하면 어떻게 되나요?
요청은 subscription_sharing_usage_limit_exceeded 오류와 함께 실패합니다. 일반 요청은 HTTP 429로, 스트리밍 요청은 시작 후 response.failed 이벤트로 실패할 수 있습니다. 앱은 추가 요청을 중지하고 사용량 관리 페이지로 연결해야 합니다.
Plus 사용자가 파트너 앱에서 GPT-6.1 Sol을 실행할 수 있나요?
문서 예시에서는 요금제 토큰과 함께 gpt-6.1-sol을 사용합니다. 다만 앱에서 제공하기 전에 해당 토큰으로 사용 가능한 모델 목록을 확인해야 합니다. 자세한 내용은 GPT-6.1 Sol은 무료인가요?를 참고하세요.
다음 단계
상업용 앱을 운영한다면 먼저 대기자 명단에 등록하세요. 클라이언트 ID를 기다리는 동안 모의 환경을 기준으로 다음 처리를 구현할 수 있습니다.
- PKCE,
state,nonce검증 - ID 토큰 클레임 및 서명 검증
- 요금제 사용 범위 승인 여부 확인
- 상한선 도달, 자격 없음, 연결 해제 오류 처리
- 사용자용 사용량 관리 링크 제공
- 사용자 요금제 실패 시 앱 API 키 또는 크레딧으로 전환하는 정책 정의
요금제 사용은 앱 API 비용 처리의 선택지이지 완전한 대체 수단으로 가정하면 안 됩니다. 실제 클라이언트 ID를 받은 뒤에는 토큰만 교체하면 되도록, 토큰 검증 요청과 실패 시나리오를 Apidog에 미리 저장해 두세요.
Top comments (0)