> For the complete documentation index, see [llms.txt](https://docs.panther.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.panther.com/ko/data-onboarding/custom-log-types/transformations.md).

# 변환

## 개요

변환은 사용자 지정 로그 소스 스키마에서 Panther로 수집할 때 데이터의 형태를 수정하는 데 사용할 수 있는 함수입니다. 데이터는 이후 새 형식으로 저장됩니다.

변환은 저장된 데이터를 디택션과 쿼리 로직의 요구에 맞게 정렬하여, 임시 데이터 조작이 필요 없게 하고 디택션 작성 및 검색을 더 빠르게 해줍니다.

다음 변환을 사용할 수 있습니다:

* [`복사`](#copy)
* [`이름 변경`](#rename)
* [`연결`](#concat)
* [`분할`](#split)
* [`마스킹`](#mask)
* [`isEmbeddedJSON`](#isembeddedjson)

{% hint style="info" %}
수집 시 다음을 사용하여 데이터를 추가로 조작할 수 있습니다: [스크립트 로그 파서](/ko/data-onboarding/custom-log-types/script-parser.md).
{% endhint %}

### 변환 실행 순서

변환이 수행되는 특정 순서가 있으며, 이를 통해 변환이 예측 가능한 방식으로 하나씩 적용됩니다. 실행 순서는 [위의 Overview에 있는 변환 목록에 제공된 순서입니다](#overview).

정의된 순서를 따라 데이터를 정확하게 변환하세요. 순서의 각 변환은 이전 변환이 남긴 상태의 데이터에서 작동합니다. 이 순서를 알면 일관성을 유지하고 예상치 못한 결과를 방지할 수 있습니다.

#### 변환 결합

개별 변환은 더 복잡한 데이터 변환을 달성하기 위해 쌍이나 순서로 결합할 수 있습니다. 이를 통해 더 큰 유연성과 맞춤 설정이 가능해져 특정 데이터 요구 사항을 충족하고 효율적인 디택션 생성과 검색 작업을 지원합니다.

개인 식별 번호(PIN)를 포함하는 필드가 있다고 가정해 보세요. 보안상의 이유로, PIN을 가리기 위해 마스크를 적용하면서 필드 이름을 덜 노출되는 이름으로 바꾸고 싶습니다.

이를 위해 다음을 사용할 수 있습니다: `이름 변경` 변환을 사용하여 필드 이름을 추상적인 이름으로 바꿀 수 있습니다. 예를 들어 필드 이름을 다음으로 변경할 수 있습니다: `userId`.

다음으로 다음 변환을 적용하세요: `마스킹` 변환을 다음에 적용합니다: `userId` 필드에서 PIN의 숫자를 미리 정의한 개수의 별표로 바꿉니다. 이렇게 하면 PIN이 숨겨진 상태로 유지되어 데이터 프라이버시가 보장됩니다.

필드 스키마를 다음과 같은 것과 함께 정의할 수 있습니다: `이름 변경` 및 다음을 함께 `마스킹` 같은 지시문:

```yaml
- name: userId
  type: string
  이름 변경:
    from: PIN
  mask:
    type: redact
    to: "*****"
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "PIN": "1234"
}
```

다음과 같이:

```json
{
  "userId": "*****"
}
```

## `복사`

해당 `복사` 변환은 중첩된 필드의 값을 다른 최상위 필드로 복사합니다. 데이터의 JSON 구조를 평평하게 만들고 싶을 때 유용할 수 있습니다. 원하면 이후 새로 정의한 필드를 다음으로 표시할 수 있습니다: [`지표`](/ko/search/panther-fields.md#indicator-fields).

다음을 사용하여 필드 스키마를 정의하면 `복사` 와 같은 지시문을 통해:

```yaml
- name: message
  type: string
  copy:
    from: attributes.message
- 이름: attributes
  유형: json
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "attributes": {
      "message": "hello there", 
      "user": "someone"
  }
}
```

다음과 같이:

```json
{
  "message": "hello there",
  "attributes": {
      "message": "hello there", 
      "user": "someone"
  }
}
```

## `이름 변경`

해당 `이름 변경` 변환은 필드 이름을 변경합니다. 데이터 소스 전반에서 필드 이름을 표준화하거나, 데이터 구조의 명확성을 높이거나, 잘못된 문자나 예약 키워드를 포함한 필드 이름을 조정하려는 경우 유용할 수 있습니다.

다음을 사용하여 필드 스키마를 정의하면 `이름 변경` 와 같은 지시문을 통해:

```yaml
- 이름: user
  type: string
  이름 변경: 
    from: "@user"
- name: role
  type: object
  fields:
   - 이름: level
     type: string
     이름 변경:
       from: type
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "@user": "john"
  "role": {
    "type": "admin"
  }
}
```

다음과 같이:

```json
{
  "user": "john"
  "role": {
    "level": "admin"
  }
}
```

## `연결`

해당 `연결` 변환을 사용하면 여러 필드의 값을 새 필드의 값으로 연결할 수 있습니다. 이렇게 결합된 필드는 예를 들어 보강을 위한 키로 사용할 수 있습니다.

다음 값을 가진 필드는 `유형` 있거나 `timestamp` 연결 연산에 사용할 수 없습니다.

사용하려면 `연결`, 다음을 선언하세요 `문자열` 연결 결과를 저장할 필드를 선언하세요. 다음 안에서 `연결`, 다음을 정의하세요 `경로`, 그리고 선택적으로 다음을 `구분자`. 다음 안에서 `경로`, 결합하려는 기존 스키마 필드를 지정하려면 절대 경로를 사용해야 합니다. 이 필드들의 순서가 연결 순서를 결정합니다. 만약 `구분자` 가 정의되지 않으면 기본 구분자는 빈 문자열 (`""`).

다음을 사용하여 필드 스키마를 정의하면 `연결` 와 같은 지시문을 통해:

```yaml
- 이름: ip
  type: string
- name: ports
  type: object
  fields:
   - name: https
     유형: int
- name: socket
  type: string
  concat:
   separator: ":"
   paths: 
    - ip
    - ports.https
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "ip": "192.168.0.1"
  "ports": {
    "https": 443
  }
}
```

다음과 같이:

```json
{
  "ip": "192.168.0.1"
  "ports": {
    "https": 443
  },
  "socket": "192.168.0.1:443"
}
```

## `분할`

해당 `분할` 변환을 사용하면 구분자를 기준으로 문자열 필드를 분할하여 특정 값을 추출할 수 있습니다. 이렇게 분할된 필드는 개별 스키마 필드로 취급할 수 있어, 이를 다음으로 지정할 수 있습니다: [indicators](/ko/search/panther-fields.md#indicator-fields). Split 변환은 데이터를 표준화된 필드로 정규화하는 데도 도움이 되며, 비정형 데이터 형식을 더 쉽게 처리할 수 있게 해줍니다.

다음 유형의 필드만 `문자열` 다른 필드로 분할할 수 있습니다(즉, `split:from:` 는 다음을 포함하는 필드여야 합니다: `type: string`).

사용하려면 `분할`, 결과를 저장할 임의의 기본형 필드를 선언하세요(즉, object, array, JSON 제외). 다음 안에서 `분할` 지시문에 다음 필수 필드를 포함하세요:

* `from`: 분할할 필드의 절대 경로를 지정하세요.
* `구분자`: 분할 기준 문자를 지정하세요.
* `index`: 분할로 생성된 결과 배열에서 값의 위치를 지정하세요.

다음을 사용하여 필드 스키마를 정의하면 `분할` 와 같은 지시문을 통해:

```yaml
- name: socket
  type: string
- 이름: ip
  type: string
  split:
   from: socket
   separator: ":"
   index: 0
- name: port
  유형: int
  split:
   from: socket
   separator: ":"
   index: 1  
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "socket": "192.168.0.1:443"
}
```

다음과 같이:

```json
{
  "socket": "192.168.0.1:443",
  "ip": "192.168.0.1",
  "port": 443
}
```

다음도 사용할 수 있습니다 `분할` 배열 요소를 분할하는 데 사용할 수도 있습니다. 예를 들어 다음 스키마를 사용하면:

```yaml
- name: traffic
  type: array
  element: 
    type: object
    fields:
      - name: socket
        type: string
      - 이름: ip
        type: string
        indicators: [ip]
        split: 
          from: traffic.socket
          separator: ":"
          index: 0
      - name: port
        유형: int
        split: 
          from: traffic.socket
          separator: ":"
          index: 1
       
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "traffic": [
   {
     "socket": "192.168.0.1:443"
   },
   {
     "socket": "192.168.0.2:80"
   } 
  ]
}
```

다음과 같이:

```json
{
  "traffic": [
   {
     "socket": "192.168.0.1:443",
     "ip": "192.168.0.1",
     "port": 443
   },
   {
     "socket": "192.168.0.2:80",
     "ip": "192.168.0.2",
     "port": 80
   } 
  ]
}
```

## `마스킹`

해당 `마스킹` 변환을 사용하면 로그의 민감한 정보를 숨길 수 있습니다. 마스킹은 특정 데이터의 기밀성을 보호해야 할 때 유용합니다.

마스킹 기법에는 두 가지가 있습니다:

* [난독화](#obfuscation-hashing) (해싱이라고도 함): 이 기법은 선택적 salt 값을 사용하여 데이터를 해시합니다. 이 기법에서는 값의 참조 무결성이 유지됩니다.
* [마스킹](#redaction): 이 기법은 민감한 값을 다음으로 대체합니다 `REDACTED`, 또는 사용자가 지정한 다른 문자열로. 이 기법에서는 값의 참조 무결성이 사라집니다.

특정 필드를 마스킹하면 나중에 Panther의 [검색 도구](/ko/search.md) 를 사용해 원래 값을 조회할 수 없지만, 해시된 값은 검색할 수 있습니다.

### 난독화(해싱)

들어오는 데이터를 해시하면 향후 사용성을 유지하면서 보안을 강화할 수 있습니다. 해싱이 제공하는 보호를 강화하려면 salt를 포함할 수 있습니다.

난독화를 사용하려면, 스키마의 대상 필드에 다음을 포함하세요 `마스킹`. 아래에 `마스킹`, 다음을 포함하세요 `유형`선택적으로 `salt`.

다음의 값은 `유형` 사용하려는 해싱 알고리즘입니다. 지원되는 값은 다음과 같습니다:

* `SHA256`
* `MD5`
* `SHA1`
* `sha512`

선택적 항목의 값은 `salt` key는 사용자가 선택한 문자열입니다. 이 값은 해시되기 전에 필드 값 뒤에 추가됩니다.

사용할 때 `마스킹`, 대상 필드의 `유형` 값은 항상 다음으로 설정해야 합니다: `문자열`. 실제 입력 데이터는 어떤 유형이든 될 수 있지만, `type: string` 값이 마스킹된 후 데이터 레이크에 문자열로 저장되기 때문에 필요합니다.

다음을 사용하여 필드 스키마를 정의하면 `마스킹` 와 같은 지시문:

```yaml
- 이름: username
  type: string # 반드시 string으로 설정해야 함(모든 데이터 유형 허용)
  mask:
    type: sha256 
    salt: random_salt # Optional
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "username": "john"
}
```

다음과 같이:

```json
{
  "username": "98b4ceb956e9ed4539b0721add25cab0bacce4307cf3140c4430c1513476a3e4"
}
```

### 마스킹

들어오는 데이터를 삭제한다는 것은 이를 미리 정의된 값으로 바꾸는 것을 의미합니다. 이 기법은 민감한 정보가 접근 가능하거나 복구 가능하지 않도록 보장하고 싶을 때 유용합니다.

마스킹을 사용하려면, 스키마의 대상 필드에 다음을 포함하세요 `마스킹`. 아래에 `마스킹`, 다음을 포함하세요 `type: redact`선택적으로 `에서`.

선택적 `에서` key는 실제 이벤트 값을 대체할 문자열 값을 받습니다. 만약 `에서` 이 포함되지 않으면, 기본값인 `REDACTED`REDACTED

사용할 때 `마스킹`, 대상 필드의 `유형` 값은 항상 다음으로 설정해야 합니다: `문자열`. 실제 입력 데이터는 어떤 유형이든 될 수 있지만, `type: string` 값이 마스킹된 후 데이터 레이크에 문자열로 저장되기 때문에 필요합니다.

다음을 사용하여 필드 스키마를 정의하면 `마스킹` 와 같은 지시문:

```yaml
- 이름: username
  type: string # 반드시 string으로 설정해야 함(모든 데이터 유형 허용)
  mask:
    type: redact 
    to: "XXXX" # Optional, default: "REDACTED"
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "username": "john"
}
```

다음과 같이:

```json
{
  "username": "XXXX"
}
```

## `isEmbeddedJSON`

때때로 JSON 값은 문자열 안에 포함된 형태로 전달됩니다.

Panther가 문자열 내부의 이스케이프된 JSON을 파싱하도록 하려면 다음을 사용하세요: `isEmbeddedJSON: true` 플래그입니다. 이 플래그는 다음 유형의 값에 유효합니다: `object`, `배열` 그리고 `JSON`.

다음을 사용하여 필드 스키마를 정의하면 `isEmbeddedJSON` 와 같은 지시문:

```yaml
- name: message
  type: object
  isEmbeddedJSON: true
  fields:
    - name: foo
      type: string
```

다음과 같은 페이로드를 변환하게 됩니다:

```json
{
  "timestamp": "2021-03-24T18:15:23Z",
  "message": "{\"foo\":\"bar\"}"
}
```

다음과 같이:

```json
{
  "timestamp": "2021-03-24T18:15:23Z",
  "message": {
    "foo": "bar"
  }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.panther.com/ko/data-onboarding/custom-log-types/transformations.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
