

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# (선택 사항) 스키마 생성(고급 사용자)
<a name="create-schema"></a>

스키마 생성 기능은 고급 사용자를 위한 것입니다.

다음은 열 헤더가 있거나 없는 입력 파일의 JSON 스키마 파일 형식에 대한 설명입니다. 고급 사용자는 원하는 경우 스키마를 직접 작성하거나 수정할 수 있습니다.

**참고**  
C3R 암호화 클라이언트는 [예:sealed, fingerprint, cleartext 열을 사용하여 암호화 스키마 생성](gen-encryption-schema-csv.md#gen-encryption-schema)에서 설명하는 대화형 프로세스 또는 스텁 템플릿 생성을 통해 스키마를 만드는 데 도움을 줄 수 있습니다.

## 매핑된 테이블 스키마와 위치 테이블 스키마
<a name="mapped-and-positional-schemas"></a>

다음 섹션에서는 두 종류의 테이블 스키마에 대해 설명합니다.
+ **매핑된 테이블 스키마** - 이 스키마는 헤더 행과 Apache Parquet 파일이 있는.csv 파일을 암호화하는 데 사용됩니다.
+ **위치 테이블 스키마** - 이 스키마는 헤더 행이 없는.csv 파일을 암호화하는 데 사용됩니다.

C3R 암호화 클라이언트는 공동 작업을 위해 표 형식 파일을 암호화할 수 있습니다. 이렇게 하려면 입력에서 암호화된 출력을 도출하는 방법을 지정하는 해당 스키마 파일이 있어야 합니다.

C3R 암호화 클라이언트는 명령줄에서 C3R 암호화 클라이언트 스키마 명령을 실행하여 `INPUT` 파일에 대한 스키마를 생성하는 데 도움을 줄 수 있습니다. 명령의 예는 `java -jar c3r-cli.jar schema --interactive INPUT`입니다.

이 스키마는 다음 정보를 지정합니다:

1. 헤더 이름(매핑된 스키마) 또는 위치(위치 스키마)를 통해 출력 파일의 변환된 열에 매핑되는 원본 열

1. 어떤 대상 열을 cleartext로 유지해야 할까요

1. SELECT 쿼리를 위해 어떤 대상 열을 암호화해야 할까요

1. JOIN 쿼리를 위해 어떤 대상 열을 암호화해야 할까요

이 정보는 테이블별 JSON 스키마 파일에 인코딩되며, 이 파일은 `headerRow` 필드가 부울 값인 단일 객체로 구성됩니다. 헤더 행이 있는 Parquet 파일 및 .csv 파일의 경우 값은 `true`여야 하며, 그렇지 않은 경우 `false`여야 합니다.

### 매핑된 테이블 스키마
<a name="mapped-schemas"></a>

매핑된 스키마의 모양은 다음과 같습니다.

```
{
  "headerRow": true,
  "columns": [
    {
      "sourceHeader": STRING,
      "targetHeader": STRING,
      "type": TYPE,
      "pad": PAD
    },
    ...
  ]
}
```

`headerRow`가 `true`인 경우, 객체의 다음 필드는 `columns`이고, 이 필드는 소스 헤더를 대상 헤더에 매핑하는 열 스키마 배열(즉, 출력 열에 포함되어야 하는 내용을 설명하는 JSON 객체)을 포함합니다.
+ `sourceHeader`— 데이터가 파생된 소스 열의 `STRING` 헤더 이름.
**참고**  
동일한 소스 열을 여러 대상 열에 사용할 수 있습니다.  
스키마 어디에도 `sourceHeader`로 나열되지 않은 입력 파일의 열은 출력 파일에 나타나지 않습니다.
+ `targetHeader` – 출력 파일에 있는 해당 열의 `STRING` 헤더 이름.
**참고**  
이 필드는 매핑된 스키마의 경우 선택 사항입니다. 이 필드를 생략하면 출력의 헤더 이름으로 `sourceHeader`가 다시 사용됩니다. 출력 열이 fingerprint 열 또는 sealed 열인 경우 `_fingerprint` 또는 `_sealed`가 각각 추가됩니다.
+ `type` – 출력 파일에 있는 대상 열의 `TYPE`. 즉, 공동 작업에서 열이 사용되는 방식에 따라 `cleartext`, `sealed` 또는 `fingerprint` 중 하나를 선택합니다.
+ `pad`— `TYPE`이 `sealed`인 경우에만 존재하는 열 스키마 개체의 필드입니다.. `PAD`의 해당 값은 데이터를 암호화하기 전에 데이터를 어떻게 패딩해야 하는지를 설명하는 객체입니다.

  ```
  {
    "type": PAD_TYPE,
    "length": INT
  }
  ```

  사전 암호화 패딩을 지정하기 위해 `type` 및 `length`가 사용되며 다음과 같이 사용됩니다.
  + `PAD_TYPE` as `none` — 열의 데이터에 패딩이 적용되지 않으며 `length` 필드를 적용할 수 없습니다(즉, 생략).
  + `PAD_TYPE` as `fixed` — 열의 데이터가 지정된 `length` 바이트만큼 채워집니다.
  + `PAD_TYPE` as `max` — 가장 긴 값의 바이트 길이에 추가 `length` 바이트를 더한 크기로 열의 데이터가 채워집니다.

다음은 각 유형의 열이 있는 매핑된 스키마의 예시입니다.

```
{
  "headerRow": true,
  "columns": [
    {
      "sourceHeader": "FullName",
      "targetHeader": "name",
      "type": "cleartext"
    },
    {
      "sourceHeader": "City",
      "targetHeader": "city_sealed",
      "type": "sealed",
      "pad": {
        "type": "max",
        "length": 16
      }
    },
    {
      "sourceHeader": "PhoneNumber",
      "targetHeader": "phone_number_fingerprint",
      "type": "fingerprint"
    },
    {
      "sourceHeader": "PhoneNumber",
      "targetHeader": "phone_number_sealed",
      "type": "sealed",
      "pad": {
        "type": "fixed",
        "length": 20
      }
    }
  ]
}
```

좀 더 복잡한 예로, 다음은 헤더가 있는.csv 파일 예제입니다.

```
FirstName,LastName,Address,City,State,PhoneNumber,Title,Level,Notes
Jorge,Souza,12345 Mills Rd,Anytown,SC,703-555-1234,CEO,10,
Paulo,Santos,0 Street,Anytown,MD,404-555-111,CIO,9,This is a really long note that could really be a paragraph
Mateo,Jackson,1 Two St,Anytown,NY,304-555-1324,COO,9,""
Terry,Whitlock4 N St,Anytown,VA,407-555-8888,EA,7,Secret notes
Diego,Ramirez,9 Hollows Rd,Anytown,VA,407-555-1222,SDE I,4,null
John,Doe,8 Hollows Rd,Anytown,VA,407-555-4321,SDE I,4,Jane's younger brother
Jane,Doe,8 Hollows Rd,Anytown,VA,407-555-4322,SDE II,5,John's older sister
```

다음 매핑된 스키마 예제에서 열 `FirstName` 및 `LastName`은 열은 `cleartext` 열입니다. `State` 열은 `fingerprint` 열로 암호화되고 `none`의 패딩이 있는 `sealed` 열로 암호화됩니다. 나머지 열은 생략됩니다.

```
{
  "headerRow": true,
  "columns": [
    {
      "sourceHeader": "FirstName",
      "targetHeader": "GivenName",
      "type": "cleartext"
    },
    {
      "sourceHeader": "LastName",
      "targetHeader": "Surname",
      "type": "cleartext"
    },
    {
      "sourceHeader": "State",
      "targetHeader": "State_Join",
      "type": "fingerprint"
    },
    {
      "sourceHeader": "State",
      "targetHeader": "State",
      "type": "sealed",
      "pad": {
        "type": "none"
      }
    }
  ]
}
```

다음은 매핑된 스키마의 결과인.csv 파일입니다.

```
givenname,surname,state_fingerprint,state
John,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:FQ3n3Ahv9BQQNWQGcugeHzHYzEZE1vapHa2Uu4SRgSAtZ3qObjPA4TcsHt+BOkMKBcnHWI13BeGG/SBqmj7vKpI=
Paulo,Santos,01:hmac:CHF4eIrtTNgAooU9v4h9Qjc+txBnMidQTjdjWuaDTTA=,01:enc:KZ5n5GtaXACco65AXk48BQO2durDNR2ULc4YxmMC8NaZZKKJiksU1IwFadAvV4iBQ1Bus5TU5c4biez3bilfTY8=
Mateo,Jackson,01:hmac:iIRnjfNBzryusIJ1w35lgNzeY1RQ1bSfq6PDHW8Xrbk=,01:enc:mLKpS5HIOSgphdEsrzhEdIp/eN9nBO2gAbIygt4OFn4LalYn9Xyj/XUWXlmn8zFe2T4kyDTD8kGOvpQEUGxAUFk=
Diego,Ramirez,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:rmZhT98Zm+IIGw1UTjMIJP4IrW/AAltBLMXcHvnYfRgmWP623VFQ6aUnhsb2MDqEw4G5Uwg5rKKZepUxx5uKbfk=
Jorge,Souza,01:hmac:3BxJdXiFFyZ8HBbYNqqEhBVqhNOd7s2ZiKUe7QiTyo8=,01:enc:vVaqWC1VRbhvkf8gnuR7q0zxVPcvEjuaglYz34+KyyLcGZLpAmsDUc6wZ07f2KvHoOySqRsEU7dG1QfdHYcTSWE=
Terry,Whitlock01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:3c9VEWbODO/xbQjdGuccLvI7oZTBdPU+SyrJIyr2kudfAxbuMQ2uRdU/q7rbgyJjxZS8M2U35ILJf/lDgTyg7cM=
Jane,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:9RWv46YLveykeNZ/G0NdlYFg+AVdOnu05hHyAYTQkPLHnyX+0/jbzD/g9ZT8GCgVE9aB5bV4ooJIXHGBVMXcjrQ=
```

### 위치 테이블 스키마
<a name="positional-schemas"></a>

위치 스키마의 모양은 다음과 같습니다.

```
{
  "headerRow": false,
  "columns": [
    [
      {
        "targetHeader": STRING,
        "type": TYPE,
        "pad": PAD
      },
      {
        "targetHeader": STRING,
        "type": TYPE,
        "pad": PAD
      }
    ],
    [],
    ...
  ]
}
```

`headerRow`가 `false`인 경우, 개체의 다음 필드는 `columns`이고 이는 항목 배열을 포함하는 필드입니다. 각 항목 자체는 0개 이상의 위치 열 스키마(`sourceHeader` 필드 없음)로 구성된 배열입니다. 이 스키마는 출력에 포함되어야 하는 내용을 설명하는 JSON 객체입니다.
+ `sourceHeader`— 데이터가 파생되는 소스 열의 `STRING` 헤더 이름.
**참고**  
위치 스키마에서는 이 필드를 생략해야 합니다. 위치 스키마에서 소스 열은 스키마 파일에 있는 열의 해당 인덱스에 의해 유추됩니다.
+ `targetHeader`— 출력 파일에 있는 해당 열의 `STRING` 헤더 이름.
**참고**  
이 필드는 위치 스키마에 필요합니다.
+ `type`— 출력 파일에 있는 대상 열의 `TYPE`. 즉, 공동 작업에서 열이 사용되는 방식에 따라 `cleartext`, `sealed` 또는 `fingerprint` 중 하나를 선택합니다.
+ `pad`— `TYPE`이 `sealed`인 경우에만 존재하는 열 스키마 개체의 필드입니다.. `PAD`의 해당 값은 데이터를 암호화하기 전에 데이터를 어떻게 패딩해야 하는지를 설명하는 객체입니다.

  ```
  {
    "type": PAD_TYPE,
    "length": INT
  }
  ```

  사전 암호화 패딩을 지정하기 위해 `type` 및 `length`가 사용되며 다음과 같이 사용됩니다.
  + `PAD_TYPE` as `none` — 열의 데이터에 패딩이 적용되지 않으며 `length` 필드를 적용할 수 없습니다(즉, 생략).
  + `PAD_TYPE` as `fixed` — 열의 데이터가 지정된 `length` 바이트만큼 채워집니다.
  + `PAD_TYPE` as `max` — 가장 긴 값의 바이트 길이에 추가 `length` 바이트를 더한 크기로 열의 데이터가 채워집니다.
**참고**  
`fixed` 열 데이터의 바이트 크기 상한을 미리 알고 있는 경우에 유용합니다. 해당 열의 데이터가 지정된 `length` 값보다 길면 오류가 발생합니다.  
`max`는 입력 데이터의 정확한 크기를 알 수 없는 경우 데이터 크기와 상관없이 작동하므로 편리합니다. 하지만 `max`는 데이터를 두 번 암호화하기 때문에 추가 처리 시간이 필요합니다. `max`는 임시 파일에 읽어올 때 데이터를 한 번 암호화하고 열에 가장 긴 데이터 입력을 알고 나면 한 번 암호화합니다.  
또한 가장 긴 값의 길이는 클라이언트 호출 사이에 저장되지 않습니다. 데이터를 일괄적으로 암호화하거나 새 데이터를 주기적으로 암호화하려는 경우 결과 사이퍼텍스트 -길이는 배치마다 다를 수 있다는 점에 유의하세요.

다음은 위치 스키마의 예입니다.

```
{
  "headerRow": false,
  "columns": [
    [
      {
        "targetHeader": "name",
        "type": "cleartext"
      }
    ],
    [
      {
        "targetHeader": "city_sealed",
        "type": "sealed",
        "pad": {
          "type": "max",
          "length": 16
        }
      }
    ],
    [
      {
        "targetHeader": "phone_number_fingerprint",
        "type": "fingerprint"
      },
      {
        "targetHeader": "phone_number_sealed",
        "type": "sealed",
        "pad": {
          "type": "fixed",
          "length": 20
        }
      }
    ]
  ]
}
```

복잡한 예로, 다음은.csv 파일의 첫 번째 행에 헤더가 없는 경우의 예시.csv 파일입니다.

```
Jorge,Souza,12345 Mills Rd,Anytown,SC, 703 -555 -1234,CEO, 10,
Paulo,Santos, 0 Street,Anytown,MD, 404-555-111,CIO, 9,This is a really long note that could really be a paragraph
Mateo,Jackson, 1 Two St,Anytown,NY, 304-555-1324,COO, 9, ""
Terry,Whitlock, 4 N St,Anytown,VA, 407-555-8888,EA, 7,Secret notes
Diego,Ramirez, 9 Hollows Rd,Anytown,VA, 407-555-1222,SDE I, 4,null
John,Doe, 8 Hollows Rd,Anytown,VA, 407-555-4321,SDE I, 4,Jane's younger brother
Jane,Doe, 8 Hollows Rd,Anytown,VA, 407-555-4322,SDE II, 5,John's older sister
```

위치 스키마의 형식은 다음과 같습니다.

```
{
  "headerRow": false,
  "columns": [
    [
      {
        "targetHeader": "GivenName",
        "type": "cleartext"
      }
    ],
    [
      {
        "targetHeader": "Surname",
        "type": "cleartext"
      }
    ],
    [],
    [],
    [
      {
        "targetHeader": "State_Join",
        "type": "fingerprint"
      },
      {
        "targetHeader": "State",
        "type": "sealed",
        "pad": {
          "type": "none"
        }
      }
    ],
    [],
    [],
    [],
    []
  ]
}
```

위의 스키마는 지정된 대상 헤더를 포함하는 헤더 행과 함께 다음과 같은 출력 파일을 생성합니다.

```
givenname,surname,state_fingerprint,state
Mateo,Jackson,01:hmac:iIRnjfNBzryusIJ1w35lgNzeY1RQ1bSfq6PDHW8Xrbk=,01:enc:ENS6QD3cMVl9vQEGfe9MNWfR0UOupchswZFr94zOMG5jY/Q8m/Y5SA89dJwKpT5rGPp8e36h6klwDoslpFzGvU0=
Jorge,Souza,01:hmac:3BxJdXiFFyZ8HBbYNqqEhBVqhNOd7s2ZiKUe7QiTyo8=,01:enc:LKo0zirq2++XEIIIMNRjAsGMdyWUDwYaum0B+IFP+rUf1BNeZDJjtFe1Z+zbZfXQWwJy52Rt7HqvAb2WIK1oMmk=
Paulo,Santos,01:hmac:CHF4eIrtTNgAooU9v4h9Qjc+txBnMidQTjdjWuaDTTA=,01:enc:MyQKyWxJ9kvK1xDQQtXlUNwv3F+yrBRr0xrUY/1BGg5KFgOn9pK+MZ7g+ZNqZEPcPz4lht1u0t/wbTaqzOCLXFQ=
Jane,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:Pd8sbITBfb0/ttUB4svVsgoYkDfnDvgkvxzeci0Yxq54rLSwccy1o3/B50C3cpkkn56dovCwzgmmPNwrmCmYtb4=
Terry,Whitlock01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:Qmtzu3B3GAXKh2KkRYTiEAaMopYedsSdF2e/ADUiBQ9kv2CxKPzWyYTD3ztmKPMka19dHre5VhUHNpO3O+j1AQ8=
Diego,Ramirez,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:ysdg+GHKdeZrS/geBIooOEPLHG68MsWpx1dh3xjb+fG5rmFmqUcJLNuuYBHhHAlxchM2WVeV1fmHkBX3mvZNvkc=
John,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:9uX0wZuO7kAPAx+Hf6uvQownkWqFSKtWS7gQIJSe5aXFquKWCK6yZN0X5Ea2N3bn03Uj1kh0agDWoiP9FRZGJA4=
```