본문으로 건너뛰기

동적 앱 (CIMD)

동적 앱을 사용하면 OAuth 클라이언트가 사전 등록 없이 테넌트에 연결할 수 있습니다. Logto에서 발급한 client ID 대신, 클라이언트는 공개 HTTPS URL을 client_id로 사용합니다. 이 URL은 클라이언트를 설명하는 JSON 문서를 제공하며, 이를 클라이언트 ID 메타데이터 문서 (CIMD)라고 합니다. Logto는 이 문서를 가져와 클라이언트를 서드파티 애플리케이션으로 처리합니다.

동적 앱은 IETF 초안 OAuth Client ID Metadata Document를 구현합니다.

동적 앱을 사용할 때

사전 등록은 파트너를 알고 있을 때에만 작동합니다. Model Context Protocol (MCP) 생태계처럼 어떤 클라이언트든 연결될 수 있는 경우에는 작동하지 않습니다. 예를 들어, 사용자가 자신의 AI 에이전트에게 서비스에 연결하라고 요청할 때, 그 에이전트는 이전에 테넌트와 대화한 적이 없을 수 있습니다.

동적 앱을 사용하면, 클라이언트가 자신이 소유한 URL에 메타데이터를 게시하고, 그 URL이 곧 아이덴티티가 됩니다. 테넌트에 미리 생성해야 할 것은 아무것도 없습니다.

등록된 서드파티 앱동적 앱
Client IDLogto에서 발급클라이언트가 소유한 HTTPS URL
등록필요함필요 없음
Client secret지원지원하지 않음
권한애플리케이션별모든 동적 클라이언트가 공유
Grant types앱 유형에 따라 다름authorization_coderefresh_token

동적 클라이언트는 공개 클라이언트이므로 항상 PKCE를 사용합니다. 두 모델을 동시에 사용할 수 있습니다. 신뢰하는 파트너는 여전히 자체 권한을 가진 등록된 앱을 가질 수 있습니다.

동적 앱 활성화하기

  1. 콘솔 > 애플리케이션으로 이동하여 서드파티 앱 탭을 엽니다.
  2. 애플리케이션 생성을 클릭하고 동적 앱 카드를 선택합니다. 이는 애플리케이션을 생성하는 대신 테넌트 레벨 기능을 활성화합니다.
  3. 대화 상자에서 확인합니다. 활성화되면, 유효한 공개 HTTPS client ID URL을 가진 모든 OAuth 클라이언트가 테넌트에 대한 인가 요청을 시작할 수 있습니다.
  4. 애플리케이션 목록에서 동적 앱을 열고 권한 탭으로 이동하여 권한을 부여하세요.

동적 앱은 편집 가능한 이름, 리디렉션 URI, 자격 증명이 없습니다. 각 클라이언트가 자신의 메타데이터 문서에 이를 제공합니다.

노트:

동적 앱은 OIDC 제공자 SSRF 보호가 필요합니다. Logto가 인터넷에서 메타데이터 문서를 가져오기 때문입니다. 이를 비활성화한 셀프 호스팅 인스턴스는 동적 앱을 활성화할 수 없습니다.

권한 부여하기

권한 탭은 모든 동적 클라이언트가 공유하는 최대 권한을 정의합니다. 이는 등록된 서드파티 앱의 권한 관리와 유사하게 사용자조직 섹션으로 구성됩니다.

부여되지 않은 사용자 권한을 요청하면 오류가 발생하며, 부여되지 않은 API 리소스 및 조직 권한은 무시됩니다. 사용자는 자신의 역할을 통해 가진 권한에만 동의합니다.

모든 동적 클라이언트가 이 집합을 공유하므로, 최소한으로 유지하세요.

클라이언트 ID 메타데이터 문서 게시하기

Logto에 연결하는 클라이언트를 구축하는 경우, 메타데이터 문서를 호스팅하고 해당 URL을 client_id로 사용하세요. URL은 반드시 https 스킴을 사용해야 하며, fragment, 사용자 정보, dot 경로 세그먼트를 포함할 수 없습니다. Logto는 해당 URL에 GET 요청을 보내고 JSON 객체를 기대합니다.

예를 들어, Claude Code는 https://claude.ai/oauth/claude-code-client-metadata를 사용하며, 다음과 같이 제공합니다:

{
"client_id": "https://claude.ai/oauth/claude-code-client-metadata",
"client_name": "Claude Code",
"client_uri": "https://claude.ai",
"redirect_uris": ["http://localhost/callback", "http://127.0.0.1/callback"],
"token_endpoint_auth_method": "none"
}

필드 이름은 OAuth 2.0 동적 클라이언트 등록과 동일합니다. 참고 사항:

  • client_id는 문서를 제공하는 URL과 동일해야 합니다.
  • 동적 클라이언트는 공개 클라이언트입니다. 문서에 client_secret이 포함되어서는 안 되며, token_endpoint_auth_method는 공유 비밀 방식이 아니어야 합니다. 대신 PKCE를 사용하세요.
  • client_uri, logo_uri, tos_uri, policy_uri와 같은 메타데이터 URI는 절대 https URL이어야 합니다. 이는 redirect_uris에는 적용되지 않으므로, 네이티브 클라이언트는 위 예시처럼 루프백 주소를 사용할 수 있습니다.
  • redirect_uris는 정확한 문자열로 일치하지만, 루프백 주소는 어떤 포트와도 일치할 수 있습니다. 와일드카드 패턴도 지원됩니다.
  • scope, grant_types, response_types는 Logto에서 결정합니다. 문서에 선언되어 있어도 값은 무시됩니다. 동적 클라이언트는 인가 코드 플로우와 리프레시 토큰만 사용할 수 있습니다.

Logto는 응답의 Cache-ControlExpires 헤더를 따라 최대 24시간 동안 문서를 캐시합니다. 문서를 얼마나 자주 업데이트할지에 따라 헤더를 설정하세요.

동적 클라이언트는 서드파티 애플리케이션이므로, 동의 화면이 항상 표시됩니다.

동의 화면에는 클라이언트가 등록되지 않았다는 안내도 표시됩니다. 클라이언트 이름과 로고는 메타데이터 문서에서 가져오기 때문에, 어떤 브랜드도 모방할 수 있습니다. 클라이언트 ID URL의 호스트도 함께 표시되며, 이는 클라이언트가 위조할 수 없는 유일한 부분입니다.

인가 관리하기

동적 클라이언트에 부여된 인가는 일반 서드파티 grant입니다. 사용자는 계정 설정에서 이를 검토하고 철회할 수 있으며, 관리자는 Management API를 통해 관리할 수 있습니다. 클라이언트 식별에는 client ID URL이 사용됩니다.

동적 앱을 비활성화하면 새로운 인가 요청이 중단되지만, 기존 grant는 유지됩니다. grant를 철회하면 클라이언트는 다시 사용자 인가를 받아야 하며, 이전에 발급된 액세스 토큰은 만료될 때까지 유효할 수 있습니다.

제한 사항

  • PKCE가 적용된 인가 코드 플로우와 리프레시 토큰만 지원됩니다. 클라이언트 자격 증명, 디바이스 플로우, 토큰 교환은 지원되지 않습니다.
  • 권한 및 브랜딩은 클라이언트별로 설정할 수 없습니다.
  • 앱 레벨 접근 제어는 동적 클라이언트에 적용되지 않습니다. 애플리케이션 레코드가 없기 때문입니다.
서드파티 앱 (OAuth / OIDC)

MCP 서버에서 서드파티 AI 에이전트 접근 허용하기