> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kazzle.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 마켓플레이스

> 앱을 게시하여 다른 Space에서 발견하고 설치할 수 있도록 합니다.

# 마켓플레이스

앱을 마켓플레이스에 게시하면 다른 Kazzle Space에서 발견하고 설치할 수 있습니다.

## 게시의 역할

게시하면 다른 Space에서 앱을 설치할 수 있습니다. 사용자는 앱의 이름, 부제, 아이콘, 게시자, 공개 여부를 확인한 후 자신의 Space에 설치합니다. 게시하려면 `kazzle.config.ts`에 `subtitle`이 필요합니다. 이는 앱 이름 아래에 표시되는 한 줄짜리 태그라인입니다.

게시된 버전은 `main`의 최신 커밋을 사용합니다. 게시된 앱을 위한 별도의 릴리스 브랜치는 없습니다.

앱 정의는 설치된 앱을 클릭했을 때 컴포넌트를 열지, 임베드된 또는 외부 URL을 열지, 아니면 실행 화면이 없을지를 명시적으로 선택합니다. 앱은 또한 Kazzle 인증을 요구하거나 라이프사이클 웹훅을 받을 수 있습니다.

앱을 게시하는 방법은 [앱 게시하기](/apps/build-and-publish)를 참조하세요.

## 설치

누군가 게시된 앱을 설치하면 Kazzle은 해당 Space 내에 설치 기록을 생성합니다. 설치하는 Space는 설치 및 이와 관련된 모든 데이터를 소유합니다.

## 사용자 인증

로그인한 Kazzle 사용자가 설치된 앱을 열면 Kazzle은 현재 사용자에 대한 정보를 앱에 제공합니다.

Kazzle은 단기 JWT를 Bearer 토큰으로 첨부합니다. 앱은 Kazzle의 공개 JWKS에 대해 토큰을 검증하여 사용자, Space, 설치 정보를 읽을 수 있습니다.

토큰에는 다음 클레임이 포함됩니다:

| 클레임       | 의미                       |
| --------- | ------------------------ |
| `aud`     | `kazzle:app`             |
| `iss`     | `https://api.kazzle.app` |
| `sub`     | Kazzle 사용자 ID            |
| `user`    | 사용자의 `{ id, email }`     |
| `space`   | 앱이 설치된 Space의 ID         |
| `install` | 이 특정 설치의 ID              |

검증 예시:

```ts theme={"theme":"material-theme-darker"}
import { jwtVerify, createRemoteJWKSet } from 'jose';

const JWKS = createRemoteJWKSet(new URL('https://api.kazzle.app/auth/.well-known/jwks.json'));

async function getUserFromToken(token: string) {
  const { payload } = await jwtVerify(token, JWKS, {
    audience: 'kazzle:app',
    issuer: 'https://api.kazzle.app',
  });
  return payload;
}
```

앱 정의는 게시된 앱의 실행 동작을 제어합니다:

* `launch`: `none`, 명명된 앱 컴포넌트, 또는 명시적 임베드 또는 외부 대상이 있는 URL을 선택합니다.
* `kazzleAuth`: `required`는 로그인한 Kazzle 사용자만 앱을 열 수 있음을 의미하고, `optional`은 Kazzle 인증 없이 앱을 열 수 있도록 합니다.

## 웹훅

앱 정의에 `webhookUrl`이 포함되어 있으면 Kazzle은 앱이 설치되거나 제거될 때 HTTP POST 요청을 전송합니다.

`app.installed`에는 게시자의 백엔드가 설치별 API에 인증하는 데 사용할 수 있는 설치 키가 포함됩니다:

```json theme={"theme":"material-theme-darker"}
{
  "event": "app.installed",
  "installId": "...",
  "appId": "...",
  "spaceId": "...",
  "apiUrl": "https://api.kazzle.app",
  "installKey": "kzl_inst_...",
  "user": { "id": "...", "email": "..." }
}
```

`app.uninstalled`에는 이벤트, 설치 ID, 앱 ID, Space ID, API URL이 포함됩니다. 게시자는 이 이벤트를 받은 후 설치 키 사용을 중단해야 합니다.

## 설치별 API

각 설치는 `https://api.kazzle.app`의 범위가 지정된 API를 호출할 수 있습니다. 호출은 설치 키(게시자의 백엔드에서) 또는 사용자 인증 토큰(호스팅된 UI에서)으로 인증됩니다. 모든 작업은 자동으로 해당 설치로 범위가 지정됩니다.

사용 가능한 엔드포인트:

전체 요청 및 응답 스키마는 `https://api.kazzle.app/openapi.json`의 Kazzle OpenAPI 스펙에 다음 경로 아래에 게시됩니다.

| 메서드    | 경로                    | 설명                   |
| ------ | --------------------- | -------------------- |
| GET    | `/apps/secrets`       | 설치를 위해 저장된 시크릿 이름 나열 |
| GET    | `/apps/secrets/:name` | 시크릿 값 읽기             |
| PUT    | `/apps/secrets/:name` | 시크릿 값 저장             |
| DELETE | `/apps/secrets/:name` | 시크릿 삭제               |
| GET    | `/apps/metadata`      | 설치를 위한 비시크릿 메타데이터 읽기 |
| PUT    | `/apps/metadata`      | 설치의 메타데이터에 업데이트 병합   |

이 API를 통해 작성된 시크릿은 저장 시 암호화되며 특정 설치로 격리됩니다. 이들은 Space의 Vault에 저장된 시크릿과는 별개입니다.

## 다음 단계

* [앱 게시하기](/apps/build-and-publish) — 앱을 게시하는 방법 및 그 후의 과정.
