테마
MCP 인증·권한
클라이언트를 처음 연결한다면 연결 설정을 먼저 따르세요. 이 문서는 프로그램을 구현하거나 권한 문제를 조사할 때 사용하는 참조입니다.
프로그램 연결과 도구 동의
- 1등록
조직 소유자가 프로그램과 정확한 콜백 주소를 등록합니다.
- 2로그인
연결할 조직의 계정으로 로그인합니다.
- 3동의
프로그램이 사용할 도구의 권한 범위를 확인하고 동의합니다.
- 4도구 요청
동의한 범위에서 도구를 요청합니다. 업무 실행에는 별도 승인이 필요할 수 있습니다.
연결의 주체
기업 소유자가 공개 프로그램을 만들 때 요청 가능한 scope의 허용 목록을 등록합니다. 이 목록은 등록 후 수정할 수 없습니다. 각 사용자는 자신의 계정으로 로그인해 기업·그룹·요청 기능을 확인하고 동의합니다. 프로그램은 등록된 공개 client_id를 사용하며 client secret을 요구하지 않습니다.
호출할 때마다 현재 조직·그룹·역할·구독을 다시 검사합니다. 대리 접속·체험 계정은 지원하지 않습니다. Telegram chat ID·봇 토큰은 사용자 권한을 대신하지 않으며 MCP 토큰으로 웹 REST API의 관리자 권한을 얻을 수 없습니다.
환경과 메타데이터
현재 운영 환경은 MCP·AI A2A를 차단합니다. 시스템 설정을 켜도 운영 차단이 우선하며 메뉴와 직접 URL을 제공하지 않습니다. 일반 EDC 간 교환은 별개입니다.
연결이 허용된 개발 환경의 issuer·resource·동의 화면·허용 origin은 관리자가 시스템 설정에서 관리합니다. 서버 설정 갱신은 최대 30초, 열린 웹의 메뉴·화면 반영은 정상 통신 기준 약 45초 걸릴 수 있습니다. 비활성화되거나 상태 확인에 실패하면 메뉴가 숨겨지고 직접 접근도 차단됩니다. 재활성화 후 현재 권한과 검토 내용을 다시 확인합니다.
/.well-known/oauth-protected-resource/mcp에서 resource와 인증 서버를 발견하고, 인증 서버 메타데이터에서 issuer와 endpoint를 읽습니다. 개발·운영의 값을 섞거나 REST /api 경로로 추측하지 않습니다.
Authorization Code + PKCE
직접 구현할 때 다음 순서를 따릅니다. 클라이언트의 OAuth 라이브러리가 제공하는 보안 검증을 유지합니다.
- 암호학적으로 임의인
state와 PKCEcode_verifier를 생성합니다. S256 challenge는 verifier의 SHA-256을 base64url로 표현한 값입니다. - 메타데이터의
authorization_endpoint를 브라우저에서 엽니다.response_type=code,client_id, 등록한redirect_uri, 필요한scope, MCPresource,state,code_challenge,code_challenge_method=S256을 보냅니다. - 등록한 정확한 HTTPS 콜백에서 원래
state와 응답 issuer를 검증하고 callback의 오류를 처리합니다.code는 일회용입니다. - 메타데이터의
token_endpoint에 폼 형식으로grant_type=authorization_code,client_id, 동일한redirect_uri,code,code_verifier,resource를 보냅니다. - 받은 access token을
Authorization: Bearer <access_token>으로 MCP POST에 사용합니다. 응답의 만료 정보를 기준으로 갱신합니다.
MCP resource는 개발 환경 기본값 https://dev-api.infirium.org/mcp입니다. A2A도 같은 resource용 토큰을 사용합니다. 기존 웹 로그인 JWT를 MCP 토큰으로 대신하지 않습니다. code·state·전체 인증/콜백 URL·토큰을 일반 대화나 로그로 공유하지 않습니다.
프로토콜 기준은 MCP 공식 인증 명세입니다. Codex 콜백 선택과 수동 로그인은 클라이언트별 안내를 따릅니다. 현재 경로는 사전 등록 공개 클라이언트이며 자동 localhost·CIMD/DCR 성공을 전제로 하지 않습니다.
Scope 선택
프로그램의 요청 허용 목록과 로그인한 사용자의 동의 범위를 구분합니다. 허용 목록은 프로그램 생성 때 고정하며, OAuth 요청은 그 목록 안에서 현재 단계에 필요한 scope만 선택합니다. tools/list에는 현재 동의·역할·그룹·구독으로 사용할 수 있는 도구만 나타납니다.
처음 프로그램을 등록할 때 진행 목표별 허용 목록을 선택합니다. 규격 조회는 1개, 파일 미리보기는 2개, 초안 저장까지는 4개, 정식 등록까지는 6개입니다. 넓은 요청 허용 목록을 등록했다고 그 범위가 사용자에게 자동 동의되는 것은 아닙니다.
다음 단계의 scope가 허용 목록 안에 있으면 해당 범위로 새 로그인을 시작해 동의를 받습니다. 목록 밖의 scope는 다시 동의하는 것만으로 사용할 수 없으며 invalid_scope가 됩니다. 현재 프로그램 허용 목록은 편집할 수 없으므로 필요한 목록을 가진 새 프로그램을 등록하고, 클라이언트의 client_id와 요청 scopes를 맞춰 다시 로그인합니다. 기존 client/grant에 묶인 계획·검토·승인은 새 연결에서 재사용하지 않으며 해당 연결로 다시 준비합니다.
| 단계 | 필요한 scope | 확인할 결과 |
|---|---|---|
| 입력 규격 읽기 | data:read | 프로필·필드·입력 안내 |
| 파일 분석·매핑·미리보기 | data:prepare | 저장 전 후보·누락·셀 출처 |
| 매핑 관리와 초안 저장 | data:templates, data:drafts | 매핑 revision·초안 ID |
| 초안 수정·등록 검토 준비 | data:updates | 변경 digest·등록 검토 링크 |
| 승인한 단일 제품 정식 등록 | products:register | 지정 단계 실행·최종 게시 상태 |
CCM·품질의 소유자 전용 경계와 멤버의 그룹 범위는 그대로 적용됩니다. products:register는 단일 PartType Information 초안의 등록에 사용하며 원래 연결과 조직 소유자의 웹 승인이 필요합니다. 등록 절차를 확인하세요.
클라이언트 동의와 업무 승인
세 가지 확인은 각각 다른 역할입니다.
| 확인 | 누가 하나요? | 의미 |
|---|---|---|
| OAuth 동의 | 로그인한 사용자 | 이 프로그램에 주는 기능과 조직·그룹 범위 |
| AI 클라이언트의 도구 실행 허용 | 클라이언트 사용자 | 해당 AI가 도구를 호출해도 되는지 |
| 인피리움의 업무별 웹 승인 | 원래 요청한 조직 소유자 | 고정된 제품·정책·대상·전송 내용에 대한 실행 승인 |
클라이언트의 자동 실행 설정이나 bearer token은 업무별 사람 승인을 대신하지 않습니다. 승인 뒤에도 source·권한·설정·만료를 다시 검사합니다.
EDC 실행 검토 권한
contracts:read는 현재 조직·그룹의 저장된 정책·계약·전송 메타데이터 조회 범위입니다. 실시간 유효성 판정·협상 시작·전송·EDR 갱신·커넥터 자격 증명 조회는 포함하지 않습니다.
contracts:execute는 소유자의 검토계획 준비·조회 범위입니다. 실제 원격 요청에는 현재 조직 소유자에게 contracts:execute와 contracts:dispatch가 모두 있어야 합니다. 프로그램 생성 때 고정한 요청 허용 목록과 현재 사용자 동의가 두 scope를 포함해야 합니다. 허용 목록이 부족하면 새 프로그램을 등록하고 설정을 교체합니다. 전송 종료는 별도 contracts:terminate도 필요합니다.
새 실행 범위로 준비한 실제 정책·공급자·소비자·대상·전송 조건을 원래 사용자가 웹에서 승인합니다. 이전 로컬 검토를 실행용으로 재사용하지 않습니다. 협상과 전송은 별도 승인입니다. 상세 순서는 EDC 실행 검토에 있습니다. 승인 회수는 이미 기록된 원격 접수 사실을 지우지 않습니다.
갱신과 폐기
refresh token은 회전되므로 새 토큰을 안전하게 저장하고 이전 토큰은 재사용하지 않습니다. 재사용 탐지는 연결 전체 폐기로 이어질 수 있습니다. 토큰은 안전한 저장소에서 관리하고 파일·URL·로그·Telegram 메시지에 넣지 않습니다.
인증 서버의 revoke 기능이나 승인한 연결 → 연결 폐기로 서버 권한을 종료합니다. client.close()와 클라이언트 로컬 로그아웃은 서버 동의 폐기와 별개입니다. 갱신 실패·사용자 폐기를 무한 재시도하지 말고 재연결을 안내합니다.

