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

# 데이터 보호

> 라이브폼 암호화 설정 및 보안 전송 설정을 통해 데이터 보안을 강화하는 방법을 안내합니다.

데이터 보호 기능은 프로젝트의 보안 수준을 강화하기 위한 암호화 및 보안 전송 옵션을 제공합니다. <br />라이브폼 암호화 설정과 보안 전송 설정을 통해 안전한 데이터 전송과 보관을 지원합니다.

## 라이브폼 암호화 설정

라이브폼의 암호화 설정을 통해 보다 높은 수준의 사용자 제출에 대한 보안 상태를 유지할 수 있습니다.

<Frame caption="라이브폼 암호화 설정 화면">
  <img src="https://mintcdn.com/argosidentity/352WpTnZFyEfW7I6/images/dashboard/new/data_protection/livefom_encryption.png?fit=max&auto=format&n=352WpTnZFyEfW7I6&q=85&s=4352a467e76d34ef2856b183a7db7b37" alt="라이브폼 암호화 설정" width="2230" height="634" data-path="images/dashboard/new/data_protection/livefom_encryption.png" />
</Frame>

### 암호화 알고리즘 방식 선택

라이브폼 URL의 Query String에서 암호화가 필요한 경우, 선택한 암호화 알고리즘 방식과 암호화 키를 사용하여 데이터를 암호화해야 합니다.

| 알고리즘                          | 설명                          |
| ----------------------------- | --------------------------- |
| **ECB (Electronic Codebook)** | 빠르고 간단한 블록 암호화 방식           |
| **GCM (Galois/Counter Mode)** | 인증 및 무결성 기능을 포함한 강화된 암호화 방식 |

<Info>
  **알고리즘 선택 후 사용 방법**

  암호화 알고리즘을 선택한 후, 라이브폼 URL의 Query String에서 암호화가 필요한 파라미터는 반드시 선택한 알고리즘 방식과 암호화 키를 통해 암호화한 후, `encrypted={암호화된_데이터}` 형태로 사용해야 합니다.
</Info>

### 암호화 전용 모드

모든 Query String 파라미터를 암호화하여 사용하고 싶은 경우, 암호화 전용 모드를 활성화합니다.

<Frame caption="암호화 전용 모드 설정">
  <img src="https://mintcdn.com/argosidentity/352WpTnZFyEfW7I6/images/dashboard/new/data_protection/encryption_only.png?fit=max&auto=format&n=352WpTnZFyEfW7I6&q=85&s=fa0b6c08e7061ddfb30948aef7bab335" alt="암호화 전용 모드" width="2230" height="71" data-path="images/dashboard/new/data_protection/encryption_only.png" />
</Frame>

암호화 전용 모드를 활성화하면 라이브폼 URL에서 `pid`, `encrypted`, `lang` 파라미터만 허용되며, 다른 모든 파라미터는 암호화되어 `encrypted` 파라미터에 포함되어야 합니다.

**허용되는 URL 형식:**

```
https://form.argosidentity.com?pid={project_Id}&encrypted={encrypted_data}&lang=ko
```

**허용되지 않는 URL 형식:**

```
https://form.argosidentity.com?pid={project_Id}&encrypted={encrypted_data}&email=user@example.com
```

<Warning>
  **암호화 전용 모드 주의사항**

  암호화 전용 모드를 활성화하면 암호화되지 않은 Query String 파라미터는 모두 무시됩니다. 모든 데이터는 `encrypted` 파라미터에 암호화하여 포함해야 합니다.
</Warning>

### 암호화 키 관리

암호화에 사용될 키를 관리합니다. API KEY를 사용하거나 전용 키(secretKey)를 발급받아 사용할 수 있습니다.

<Frame caption="암호화 키 관리 화면">
  <img src="https://mintcdn.com/argosidentity/352WpTnZFyEfW7I6/images/dashboard/new/data_protection/encryption_management.png?fit=max&auto=format&n=352WpTnZFyEfW7I6&q=85&s=6840abccd81e754c4aa8101c2f8e44f3" alt="암호화 키 관리" width="2230" height="185" data-path="images/dashboard/new/data_protection/encryption_management.png" />
</Frame>

<Frame caption="암호화 키 발급 팝업">
  <img src="https://mintcdn.com/argosidentity/352WpTnZFyEfW7I6/images/dashboard/new/data_protection/encryption_management_pop.png?fit=max&auto=format&n=352WpTnZFyEfW7I6&q=85&s=dc3efeb981c07fe0621789f0ae4d2062" alt="암호화 키 발급" width="450" height="372" data-path="images/dashboard/new/data_protection/encryption_management_pop.png" />
</Frame>

| 키 종류                 | 설명                            |
| -------------------- | ----------------------------- |
| **API KEY**          | 프로젝트에 부여된 기본 API 키를 암호화 키로 사용 |
| **전용 키 (secretKey)** | 라이브폼에서 신규로 발급받아 사용하는 전용 암호화 키 |

<Warning>
  **전용 키(secretKey) 중요 안내**

  새로 발급된 전용 키(secretKey)는 **발급 시에만 표시**되니 반드시 안전하게 저장해주세요. 분실 시 재발급하여 사용해야 하며, 기존 키는 더 이상 사용할 수 없습니다.
</Warning>

<Tip>
  **키 선택 가이드**

  * **API KEY 사용**: 간단한 설정으로 빠르게 시작할 수 있습니다.
  * **전용 키(secretKey) 사용**: 라이브폼과 API에서 서로 다른 키를 사용하여 보안을 강화할 수 있습니다.
</Tip>

***

## 라이브폼 URL 암호화 사용 방법

라이브폼 URL에서 Query String 파라미터를 암호화하여 사용하는 방법을 안내합니다.

### Step 1: 암호화할 데이터 준비

암호화할 Query String 파라미터를 JSON 형식으로 준비합니다.

<CodeGroup>
  ```json ID document 예시 theme={null}
  {
    "email": "user@example.com",
    "userid": "user123",
    "cf1": "custom_field_1",
    "cf2": "custom_field_2",
    "cf3": "custom_field_3",
    "token": "token_id"
  }
  ```

  ```json Knowledge-based 예시 theme={null}
  {
    "email": "user@example.com",
    "userid": "user123",
    "knowledgeField": "birthDate,gender,nationality",
    "knowledgePrefill": "gender=male,nationality=USA,birthDate=1980-01-01"
  }
  ```
</CodeGroup>

<Note>
  **암호화 불가 파라미터**

  `pid`, `lang` 쿼리 스트링 및 '추가 프로세스 (Injection)' 페이지에서 사용하는 `sid`, `action` 쿼리 스트링은 암호화를 지원하지 않습니다. 단, Injection 사용 시 `sid`와 `action`은 `encrypted` 파라미터 내부에 포함하여 암호화해야 합니다.
</Note>

### Step 2: 암호화 수행

선택한 암호화 알고리즘(ECB 또는 GCM)과 암호화 키(API KEY 또는 secretKey)를 사용하여 데이터를 암호화합니다.

<Card title="암호화 가이드" icon="lock" href="/ko/idcheck/getting-started/encrypt-and-decrypt-data/overview">
  상세한 암호화/복호화 방법과 코드 예시를 확인하세요.
</Card>

**암호화 예시 (ECB 방식):**

```javascript theme={null}
// Node.js 예시
const crypto = require('crypto');

function encryptECB(data, apiKey) {
  const hashedKey = crypto.createHash('sha256').update(apiKey).digest();
  const cipher = crypto.createCipheriv('aes-256-ecb', hashedKey, null);
  return cipher.update(JSON.stringify(data), 'utf8', 'base64') + cipher.final('base64');
}

// 사용 예시
const data = {
  email: "user@example.com",
  userid: "user123",
  token: "token_id"
};
const encrypted = encryptECB(data, 'YOUR_API_KEY_OR_SECRET_KEY');
```

### Step 3: 암호화된 데이터를 URL에 추가

암호화된 데이터를 `encrypted` 쿼리 파라미터에 추가합니다.

```
https://form.argosidentity.com?pid={project_Id}&encrypted={encrypted_data}
```

<Info>
  **URL 인코딩**

  암호화된 데이터는 URL에 사용하기 전에 반드시 URL 인코딩을 수행해야 합니다.
</Info>

***

## 보안 전송 설정

API 메서드를 통한 데이터 전송 시 보안을 강화하는 설정입니다.

<Frame caption="보안 전송 설정 화면">
  <img src="https://mintcdn.com/argosidentity/352WpTnZFyEfW7I6/images/dashboard/new/data_protection/secure_data_transfer.png?fit=max&auto=format&n=352WpTnZFyEfW7I6&q=85&s=cedeafc03cbd672531f76091fc3e6786" alt="보안 전송 설정" width="2246" height="227" data-path="images/dashboard/new/data_protection/secure_data_transfer.png" />
</Frame>

### 안전한 데이터 전송

안전한 데이터 전송 옵션을 활성화하면, 아르고스와 고객사 간의 모든 데이터 전송이 암호화됩니다.

| 설정             | 설명                                                  |
| -------------- | --------------------------------------------------- |
| **안전한 데이터 전송** | API 메서드(GET, POST, PATCH 등)와 웹훅에서 데이터를 암호화하여 전송합니다. |

<Warning>
  **중요: 암호화/복호화 필수**

  안전한 데이터 전송 옵션이 활성화되어 있으면, 모든 API 요청(Request)과 응답(Response) 데이터를 반드시 암호화/복호화해야 합니다. 암호화되지 않은 데이터로 요청하면 오류가 발생합니다.
</Warning>

### API 요청 데이터 암호화

안전한 데이터 전송이 활성화된 경우, API 요청 시 Request Body를 반드시 암호화하여 전송해야 합니다.

**암호화 방식:**

* **API 요청 (GET, POST, PATCH)**: AES-256-ECB 방식
* **웹훅 데이터**: AES-256-CBC 방식

**요청 예시:**

```javascript theme={null}
// POST /submission 요청 예시
const requestData = {
  email: "user@example.com",
  fullName: "John Doe",
  issuingCountry: "USA",
  birthDate: "1990-01-01"
};

// 데이터를 암호화
const encryptedBody = encryptECB(requestData, apiKey);

// 암호화된 데이터를 body로 전송
fetch('https://rest-api.argosidentity.com/v3/submission', {
  method: 'POST',
  headers: {
    'x-api-key': apiKey,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    body: encryptedBody
  })
});
```

### API 응답 데이터 복호화

안전한 데이터 전송이 활성화된 경우, API 응답도 암호화되어 전송되므로 복호화가 필요합니다.

**응답 형식:**

```json theme={null}
{
  "data": "encrypted-string",
  "isEncrypted": true
}
```

**복호화 예시:**

```javascript theme={null}
// 응답 처리
const response = await fetch('https://rest-api.argosidentity.com/v3/submission/{submissionId}', {
  headers: {
    'x-api-key': apiKey
  }
});

const responseData = await response.json();

if (responseData.isEncrypted) {
  // 암호화된 데이터 복호화
  const decryptedData = decryptECB(responseData.data, apiKey);
  const submission = JSON.parse(decryptedData);
  console.log(submission);
} else {
  // 암호화되지 않은 경우 (일반적으로 발생하지 않음)
  console.log(responseData);
}
```

### 웹훅 데이터 암호화/복호화

웹훅 데이터는 AES-256-CBC 방식으로 암호화됩니다.

<Card title="암호화 가이드" icon="lock" href="/ko/idcheck/getting-started/encrypt-and-decrypt-data/overview#4-안전한-데이터-전송-옵션">
  웹훅 데이터 암호화/복호화 방법을 자세히 확인하세요.
</Card>

***

## 설정 시나리오별 가이드

<AccordionGroup>
  <Accordion title="시나리오 1: 선택적 암호화 사용" icon="key">
    암호화 알고리즘을 선택하고 일부 Query String만 암호화하여 사용하는 경우입니다.

    **설정:**

    * 암호화 알고리즘: ECB 또는 GCM 선택
    * 암호화 키: API KEY 또는 전용 키 선택
    * 암호화 전용 모드: 비활성화

    **사용 예시:**

    ```
    https://form.argosidentity.com?pid={project_Id}&email=user@example.com&encrypted={암호화된_토큰_데이터}
    ```

    이 경우 `email`은 일반 파라미터로, `token` 등 민감한 정보는 `encrypted` 파라미터에 암호화하여 포함합니다.
  </Accordion>

  <Accordion title="시나리오 2: 전체 암호화 사용 (암호화 전용 모드)" icon="lock">
    모든 Query String 파라미터를 암호화하여 사용하는 경우입니다.

    **설정:**

    * 암호화 알고리즘: ECB 또는 GCM 선택
    * 암호화 키: API KEY 또는 전용 키 선택
    * 암호화 전용 모드: 활성화

    **사용 예시:**

    ```
    https://form.argosidentity.com?pid={project_Id}&encrypted={모든_파라미터_암호화_데이터}&lang=ko
    ```

    이 경우 `pid`, `lang`을 제외한 모든 파라미터는 `encrypted` 파라미터에 암호화하여 포함해야 합니다.
  </Accordion>

  <Accordion title="시나리오 3: API 데이터 전송 보안 강화" icon="shield-check">
    API를 통한 데이터 전송 시 보안을 강화하는 경우입니다.

    **설정:**

    * 안전한 데이터 전송: 활성화

    **필수 작업:**

    * 모든 API 요청(Request Body) 암호화
    * 모든 API 응답(Response Body) 복호화
    * 웹훅 수신 데이터 복호화

    <Warning>
      안전한 데이터 전송을 활성화하면 모든 API 통신이 암호화되므로, 클라이언트 측에서 암호화/복호화 로직을 반드시 구현해야 합니다.
    </Warning>
  </Accordion>
</AccordionGroup>

***

## 관련 문서

<CardGroup cols={2}>
  <Card title="접근 제어" icon="user-shield" href="/dashboard/ko/project-management/security-settings/access-control">
    프라이빗 모드 및 Token ID 관리 설정을 확인합니다.
  </Card>

  <Card title="암호화 가이드" icon="lock" href="/ko/idcheck/getting-started/encrypt-and-decrypt-data/overview">
    상세한 암호화/복호화 방법과 코드 예시를 확인합니다.
  </Card>

  <Card title="Query String 가이드" icon="link" href="/ko/idcheck/getting-started/liveform-url/querystring-and-token-guide">
    Query String 파라미터 사용 방법을 확인합니다.
  </Card>

  <Card title="API 참조" icon="code" href="/ko/idcheck/api-reference/api-reference-guide/overview">
    API 사용 방법을 확인합니다.
  </Card>
</CardGroup>
