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

# Okta 연동 설정

> 사용자 수명 주기, 인증, MFA 및 관리 활동을 위해 Okta를 Living Security에 연결합니다.

export const PublicIntegrationNextSteps = () => <>
    <hr />
    <h2>관련 자료</h2>
    <ul>
      <li>
        <a href="/ko/signals/data-sources">연동 데이터가 Human Risk Management 신호로 변환되는 방식 알아보기</a>
      </li>
      <li>
        <a href="https://www.livingsecurity.com/integrations">Living Security 연동 살펴보기</a>
      </li>
      <li>
        <a href="https://app.livingsecurity.ai/">Living Security Platform 열기</a>
      </li>
      <li>
        <a href="https://www.livingsecurity.com/request-demo/">Living Security 데모 요청하기</a>
      </li>
    </ul>
  </>;

export const EgressIpSafelist = ({system}) => <Note>
    <strong>Living Security 동기화 송신 IP 주소 4개를 모두</strong> {system}의 허용 목록에 추가하십시오. {system}에서 CIDR 표기법을 요구하는 경우 각 주소를 <code>/32</code>를 붙인 단일 호스트로 입력하십시오.
    <br />
    <code>52.34.139.153/32</code>, <code>54.69.127.183/32</code>, <code>44.247.133.183/32</code>,{' '}
    <code>52.26.211.56/32</code>
    <br />
    <br />
    트래픽은 4개의 주소 중 어느 것에서든 발생할 수 있으므로 일부만 허용 목록에 추가하면 간헐적으로 동기화 오류가 발생합니다. 이 4개의 주소는 모든 Living Security 리전에서 동일합니다. 전체 목록, 변경 정책 및 문제 해결 방법은{' '}
    <a href="/ko/integrations/managing/egress-ip-addresses">
      연동 송신 IP 주소 구성
    </a>{' '}
    문서를 참조하십시오.
  </Note>;

export const ConnectInPlatform = ({tile, children}) => <Step title="Living Security Platform에 자격 증명 입력">
    <p>
      Living Security 액세스 권한을 보유한 담당자(프로그램 소유자 또는 초대된 경우 시스템
      관리자(위임된 설정))가 완료합니다.
    </p>
    <ol>
      <li>
        <strong>설정 → 통합 → 카탈로그</strong>로 이동하여{' '}
        <strong>{tile}</strong> 타일을 찾은 다음 <strong>연결</strong>을 클릭합니다.
      </li>
      <li>
        아래 필드를 입력한 다음 <strong>연결</strong>을 클릭합니다.
      </li>
    </ol>
    {children}
  </Step>;

## 개요

Okta는 정규화된 사용자 수명 주기, 인증, MFA 및 관리 활동 데이터를 제공할 수 있습니다. 검토된 예시는 다음과 같습니다.

* `account.locked` — 계정 잠김
* `mfa.factor.activated` — 추가 MFA 요소 활성화
* `auth.login.failed` — 로그인 실패

두 연결 방식 모두 동일한 두 가지 스트림, 즉 사용자 디렉터리(`/api/v1/users`)와 시스템 로그(`/api/v1/logs`)를 읽습니다. [연동 데이터가 신호가 되는 방식](/ko/signals/data-sources)을 참조하십시오.

## 연결 방식 선택

| | **Okta (SSWS)** | **Okta (OAuth 2.0)** |
| - | - | - |
| 자격 증명 | Admin Console에서 생성하는 API 토큰 | 직접 생성하여 등록하는 클라이언트 ID와 프라이빗 JWK |
| 설정 | 3단계, 별도로 생성할 키 자료 없음 | RSA 키 쌍을 포함한 9단계 |
| 필요한 관리자 역할 | 읽기 전용 관리자, 토큰 소유자에게 할당 | 읽기 전용 관리자, 애플리케이션에 할당 |
| 토큰 수명 | 사용하지 않은 지 30일이 지나면 비활성화됨 | 만료 없음, 키 쌍은 직접 교체해야 함 |
| 사용 시기 | 대부분의 조직에 권장되는 방식입니다 | 보안 정책상 장기 API 토큰을 허용하지 않는 경우 |

두 방식 모두 동일한 접근 권한이 필요하므로, 선택 기준은 플랫폼이 읽을 수 있는 데이터가 아니라 자격 증명 관리 방식입니다.

***

## 옵션 A — API 토큰(SSWS)

*권장 방식입니다.*

### Living Security에 필요한 정보

| 자격 증명 | 설명 |
| - | - |
| **API 키** | Okta API 토큰입니다. 연결 대화상자에서는 이 필드를 **API 키**로 표시합니다 |
| **테넌트 서브도메인** | `<tenant>.okta.com`의 `<tenant>` — 전체 URL이 아닌 서브도메인만 입력합니다 |

### 사전 요구 사항

* 서비스 계정 사용자를 생성하고, 관리자 역할을 할당하고, API 토큰을 생성하려면 Okta **Super Administrator**여야 합니다.

<Steps>
  <Step title="토큰을 소유할 사용자 생성">
    Okta API 토큰은 해당 토큰을 생성한 사용자의 권한을 그대로 가지며, 그 사용자가 비활성화되면 작동하지 않습니다. 담당자가 변경되어도 연결이 유지되도록 개인 관리자 계정 대신 전용 서비스 계정을 생성하십시오.

    1. Admin Console에서 **Directory** → **People**로 이동합니다.
    2. **Add person**을 클릭하고 `svc-livingsecurity@yourcompany.com`와 같은 사용자를 생성합니다.
    3. 계정을 활성화합니다.
  </Step>

  <Step title="읽기 전용 관리자 역할 할당">
    플랫폼은 데이터를 읽기만 합니다. 읽기 이상의 권한을 부여하면 토큰에 사용되지 않는 권한이 부여됩니다.

    1. **Security** → **Administrators**로 이동합니다.
    2. **Add administrator**를 클릭하고 이전 단계에서 생성한 사용자를 선택합니다.
    3. **Read-only Administrator** 역할을 할당합니다.
    4. Save를 클릭합니다.

    <Note>
      관리자 역할이 없으면 Okta Management API 호출은 `200 OK`와 함께 성공하지만 빈 목록을 반환합니다. 역할이 누락되었음을 알려 주는 `403`는 없으며, 스트림이 단순히 비어 있는 상태로 유지됩니다.
    </Note>
  </Step>

  <Step title="API 토큰 생성">
    1. 1단계에서 만든 **서비스 계정 사용자로** Admin Console에 로그인합니다. 토큰은 이를 생성한 계정의 권한을 상속합니다.
    2. **Security** → **API**로 이동하여 **Tokens** 탭을 엽니다.
    3. **Create token**을 클릭하고 `Living Security Platform`와 같은 이름을 지정한 다음 **Create token**을 클릭합니다.
    4. 토큰 값을 지금 복사하십시오. Okta는 토큰 값을 한 번만 표시하며 이후에는 다시 표시하지 않습니다.

    <Warning>
      Okta는 **30일 동안 사용하지 않은** API 토큰을 비활성화합니다. 이 연동의 동기화는 최소 하루에 한 번 실행되므로, 활성 상태의 연결은 자체 토큰을 유효하게 유지합니다. 한 달 동안 일시 중지된 상태로 둔 연결에는 새 토큰이 필요합니다.
    </Warning>

    <EgressIpSafelist system="Okta" />

    <Note>
      위의 주소 목록은 Okta 조직이 **네트워크 영역**(network zone)으로 API 접근을 제한하는 경우에만 필요합니다. 대부분의 조직은 해당하지 않습니다.
    </Note>
  </Step>

  <Step title="테넌트 서브도메인 확인">
    Admin Console URL은 다음과 같은 형태입니다. `https://acme-admin.okta.com` 테넌트 서브도메인은 `acme`이며, `-admin` 접미사, `.okta.com`, `https://`은 포함하지 않습니다.
  </Step>

  <ConnectInPlatform tile="Okta (SSWS)">
    | 필드 | 값 |
    | - | - |
    | **API 키** | 3단계에서 생성한 API 토큰 |
    | **테넌트 서브도메인** | 4단계에서 확인한 서브도메인(예: `acme`) |
  </ConnectInPlatform>
</Steps>

이제 Okta (SSWS)에 연결되었습니다.

### 문제 해결

<AccordionGroup>
  <Accordion title="401 Unauthorized">
    토큰이 유효하지 않거나, 해지되었거나, 30일간 사용하지 않아 비활성화되었습니다. 서비스 계정 사용자로 새 토큰을 생성하여 연결에 다시 입력하십시오.
  </Accordion>

  <Accordion title="연결되었지만 모든 스트림이 비어 있는 경우">
    토큰 소유자에게 관리자 역할이 없습니다. 서비스 계정에 **Read-only Administrator**를 할당하십시오(2단계). 역할이 누락된 경우 API는 오류 대신 빈 목록과 함께 `200 OK`을 반환합니다.
  </Accordion>

  <Accordion title="담당자 변경 후 동기화 실패">
    토큰을 생성한 사용자가 비활성화되면 토큰이 작동하지 않습니다. 이 때문에 토큰은 개인이 아닌 서비스 계정에 속해야 합니다.
  </Accordion>
</AccordionGroup>

***

## 옵션 B — OAuth 2.0 서비스 애플리케이션

보안 정책상 장기 API 토큰을 허용하지 않는 경우 이 방식을 사용하십시오. 토큰 대신 클라이언트 ID와 직접 보유하는 RSA 키 쌍을 사용합니다. 플랫폼에서는 **설정 → 통합 → 카탈로그** 아래의 **Okta (OAuth 2.0)** 타일에 해당합니다.

클라이언트 자격 증명(Client Credentials)으로 Okta에 인증하려면 다음이 필요합니다.

1. **클라이언트 ID** - Okta API Services 애플리케이션의 고유 식별자입니다.
2. **개인 키(JWK)** - JSON Web Key 형식의 RSA 개인 키이며, 해당 공개 키가 Okta 애플리케이션에 등록되어 있어야 합니다.
3. **Okta 도메인** - 전체 호스트 이름이 아닌 Okta 테넌트 서브도메인만 입력합니다(예: `dev-12345678`).
4. **범위** - 공백으로 구분된 Okta Management API 범위 목록입니다(예: `okta.users.read okta.logs.read`).

이 가이드에서는 `private_key_jwt` 인증을 사용하여 Okta에서 API Services 애플리케이션을 생성하는 방법을 안내합니다.

### 사전 요구 사항:

* Okta 계정이 있어야 합니다. [developer.okta.com](https://developer.okta.com/signup/)에서 무료 개발자 계정에 가입할 수 있습니다.

#### 1단계: Okta API Services 애플리케이션 생성

1. [Okta Admin Console](https://login.okta.com/)에 로그인합니다.
2. 왼쪽 사이드바에서 **Applications** > **Applications**로 이동합니다.
3. **Create App Integration**을 클릭합니다.
4. 로그인 방법으로 **API Services**를 선택하고 **Next**를 클릭합니다.

<img src="https://raw.githubusercontent.com/NangoHQ/nango/master/docs/api-integrations/okta-cc/select-api-service.png" style={{maxWidth: "550px"}} />

5. 애플리케이션 이름을 지정하고 **Save**를 클릭합니다.
6. 애플리케이션의 **General** 탭에서 **Client ID**를 확인합니다. 마지막 단계에서 필요합니다.
7. Client authentication을 **Public key / Private key**로 설정합니다. `okta.*` 범위는 이 인증 방식에서만 지원됩니다.

<img src="https://raw.githubusercontent.com/NangoHQ/nango/master/docs/api-integrations/okta-cc/select-public-private-key.png" style={{maxWidth: "550px"}} />

8. \*\*Proof of possession (DPoP)\*\*을 비활성화합니다. 지원되지 않습니다.

<img src="https://raw.githubusercontent.com/NangoHQ/nango/master/docs/api-integrations/okta-cc/disable-dpop.png" style={{maxWidth: "550px"}} />

<Note>
  애플리케이션은 반드시 **API Services**로 생성해야 합니다.
</Note>

#### 2단계: RSA 키 쌍 생성 및 등록

##### Okta 키 생성기 사용

Okta는 Admin Console에서 직접 RSA 키 쌍을 생성할 수 있습니다.

1. Admin Console에서 API Services 애플리케이션을 엽니다.
2. **General** 탭으로 이동하여 **PUBLIC KEYS** 섹션까지 스크롤합니다.
3. **Add Key**를 클릭한 다음 **Generate new key**를 선택합니다.
4. **Save**를 클릭합니다. Okta가 키 쌍을 생성하고 \*\*Private Key (JWK)\*\*를 한 번만 표시합니다.
5. 개인 키 JSON을 즉시 복사하여 저장하십시오. 다시 표시되지 않습니다.

<img src="https://raw.githubusercontent.com/NangoHQ/nango/master/docs/api-integrations/okta-cc/create-public-key.png" style={{maxWidth: "550px"}} />

6. 공개 키는 애플리케이션에 자동으로 등록됩니다.

<Note>
  대화상자를 닫기 전에 프라이빗 JWK를 복사하십시오. 마지막 단계에서 Living Security Platform의 **개인 키** 필드에 붙여넣습니다.
</Note>

##### 직접 키 생성

Okta는 API Services 앱에 `private_key_jwt`를 사용합니다. RSA 키 쌍을 생성하고, **공개** JWK를 Okta에 등록하며, **프라이빗** JWK를 Living Security Platform에 제공합니다.

다음 Node.js 스크립트(Node.js 18 이상 필요)를 사용하여 **프라이빗 JWK를 생성**합니다.

```javascript theme={null}
const { generateKeyPairSync } = require('crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });

const privateJwk = privateKey.export({ format: 'jwk' });
const publicJwk  = publicKey.export({ format: 'jwk' });

// Assign a kid — must match between private and public JWK
const kid = require('crypto').randomUUID();
privateJwk.kid = kid;
publicJwk.kid  = kid;

console.log('=== PUBLIC JWK (upload to Okta) ===');
console.log(JSON.stringify(publicJwk, null, 2));
console.log('\n=== PRIVATE JWK (paste into the Living Security Platform) ===');
console.log(JSON.stringify(privateJwk));
```

**Okta에 공개 JWK 등록:**

1. Admin Console에서 API Services 애플리케이션을 엽니다.
2. **General** 탭으로 이동하여 **PUBLIC KEYS** 섹션까지 스크롤합니다.
3. **Add Key**를 클릭하고, 위 스크립트가 출력한 **공개 JWK JSON**을 붙여넣은 다음 **Save**를 클릭합니다.

<Note>
  Living Security Platform에 붙여넣는 것은 프라이빗 JWK입니다. 여기에는 모든 키 자료(`d`, `p`, `q`, `dp`, `dq`, `qi`)와 `kid`가 포함되어 있습니다. 비밀로 유지하십시오.
</Note>

#### 3단계: Okta 도메인 확인

Okta 테넌트 서브도메인, 즉 `.okta.com` 앞부분만 입력합니다.

* Admin Console에서 브라우저 주소 표시줄에 `https://dev-12345678-admin.okta.com`과 같은 URL이 표시됩니다.
* **Okta 도메인**은 `dev-12345678.okta.com`이 아니라 서브도메인만(예: `dev-12345678`) 입력합니다.
* 또는 Admin Console에서 **Settings** > **Account**로 이동하여 Okta 도메인을 확인한 다음 서브도메인 부분을 사용합니다.

#### 4단계: 애플리케이션에 API 범위 부여

Okta는 모든 토큰 요청에 하나 이상의 범위를 요구합니다. 애플리케이션이 특정 범위를 요청하려면 먼저 해당 범위가 부여되어야 합니다.

1. Admin Console에서 **Applications** > **Applications**로 이동하여 애플리케이션을 엽니다.
2. **Okta API Scopes** 탭을 클릭합니다.
3. 연동에 필요한 범위인 `okta.users.read` 및 `okta.logs.read`을 부여합니다.

사용 가능한 전체 범위 목록은 [Okta Management API 참조](https://developer.okta.com/docs/api/oauth2/#okta-admin-management)에서 확인할 수 있습니다.

#### 5단계: 애플리케이션에 관리자 역할 할당

범위를 부여하는 것만으로는 충분하지 않습니다. 애플리케이션에 관리자 역할이 없으면 Okta Management API 엔드포인트(예: `/api/v1/users`)는 아무런 오류 없이 빈 `200 []` 응답을 반환합니다. 최소한 **Read-Only Administrator**를 할당해야 합니다.

1. Admin Console에서 **Security** > **Administrators**로 이동합니다(또는 **Applications** > **Applications** > 해당 앱 > **Admin roles**로 이동합니다).
2. **Add administrator assignment**를 클릭하고 API Services 애플리케이션을 선택합니다.

<img src="https://raw.githubusercontent.com/NangoHQ/nango/master/docs/api-integrations/okta-cc/admin-role-dropdown.png" style={{maxWidth: "550px"}} />

3. **Read-Only Administrator** 역할(필요한 범위에 따라 그 이상의 역할)을 할당합니다.
4. **Save**를 클릭합니다.

<img src="https://raw.githubusercontent.com/NangoHQ/nango/master/docs/api-integrations/okta-cc/add-admin-role.png" style={{maxWidth: "550px"}} />

<Note>
  관리자 역할이 없으면 API 호출은 `200 OK`와 함께 성공하지만 빈 결과를 반환하며, 문제를 알려 주는 `403` 오류도 없습니다.
</Note>

#### 6단계: Living Security Platform에 자격 증명 입력

**클라이언트 ID**, **개인 키(JWK)**, **Okta 도메인**, **범위**를 준비했다면 다음을 수행합니다.

1. Okta(Client Credentials) 인증이 필요한 양식을 엽니다.
2. **클라이언트 ID**를 입력합니다.
3. \*\*개인 키(JWK)\*\*를 붙여넣습니다. 위 스크립트에서 생성된 전체 JSON 객체(한 줄 또는 서식이 적용된 형태)를 붙여넣습니다.
4. **Okta 도메인**을 테넌트 서브도메인만(예: `dev-12345678`) 입력합니다.
5. **범위**를 공백으로 구분된 목록(예: `okta.users.read okta.logs.read`)으로 입력합니다.
6. 양식을 제출하면 인증이 성공적으로 완료됩니다.

이제 Okta(Client Credentials)에 연결되었습니다.

***

<Note>이 문서의 일부는 [Nango](https://nango.dev/docs/)에서 차용하여 수정한 것이며, [Elastic License 2.0](https://github.com/NangoHQ/nango?tab=License-1-ov-file#readme)에 따라 사용되었습니다.</Note>

<PublicIntegrationNextSteps />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.