# ActiveRecord 모델의 우발적 직렬화 방지

**URL:** https://meta.discourse.org/t/preventing-accidental-serialization-of-activerecord-models/314495
**Category:** Developer Guides
**Tags:** reference
**Created:** [7월 1, 2024, 7:58오후 UTC](https://meta.discourse.org/t/preventing-accidental-serialization-of-activerecord-models/314495 "2024-07-01T19:58:28Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [7월 1, 2024, 7:58오후 UTC](https://meta.discourse.org/t/preventing-accidental-serialization-of-activerecord-models/314495/1 "2024-07-01T19:58:28Z")

</div>

ActiveRecord 모델을 직렬화할 때 직렬화할 필드를 명시하지 않는 경우의 우발적 직렬화를 방지하기 위한 패치를 도입했습니다. 이 변경 사항은 포함할 필드를 우리가 제어할 수 있도록 하여, 불완전하거나 과도한 데이터가 노출될 수 있는 잠재적 문제를 방지합니다.

기본적으로 ActiveRecord 모델을 JSON으로 렌더링하면 모든 속성이 포함되지만, 많은 경우 이는 바람직하지 않을 수 있습니다. 더 나은 관행을 강제하기 위해 직렬화해야 할 필드를 명시해야 합니다.

### 사용 예시

**잘못된 사용법:**

```rb
def show
  @user = User.first
  render json: @user
end

```

개발 및 테스트 환경에서 이 경우 다음과 같은 결과가 발생합니다:

```plaintext
ActiveRecordSerializationSafety::BlockedSerializationError:
필드를 지정하지 않고 ActiveRecord 모델(User)을 직렬화하는 것은 허용되지 않습니다.
Serializer를 사용하거나 #serializable_hash에 :only 옵션을 전달하세요. 자세한 정보: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

```

**올바른 사용법:**

1. Serializer 사용

```rb
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end

```

1. `:only` 옵션 사용

```rb
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

```

* * *

이 문서는 버전 관리됩니다 - 변경 사항을 [github](https://github.com/discourse/discourse/blob/main/docs/developer-guides/docs/03-code-internals/18-accidental-serialization-of-activerecord-models.md)에서 제안하세요.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [7월 2, 2024, 9:59오전 UTC](https://meta.discourse.org/t/preventing-accidental-serialization-of-activerecord-models/314495/3 "2024-07-02T09:59:47Z")

</div>

실제로 이 문제를 겪는 분들을 위해 명확히 하자면, `ActiveModel::Serialization`의 직렬화 메서드, 예를 들어 `as_json`은 컨텍스트(스펙 포함)와 관계없이 `only` 옵션을 전달하지 않으면 오류가 발생합니다. 자세한 내용은 아래를 참고하세요.

> **[ActiveModel::Serializers::JSON#as\_json - APIdock](https://apidock.com/rails/ActiveModel/Serializers/JSON/as_json)**
>
> ActiveModel::Serializers::JSON#as\_json - Ruby on Rails API documentation. View source code and usage examples.

예제는 아래를 참고하세요:

> <https://github.com/paviliondev/discourse-custom-wizard/commit/247a3d551cdfcacacded7ca5640e4df1d084d07d>
>
> See https://meta.discourse.org/t/preventing-accidental-serialization-of-activere…cord-models/314495

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 17, 2024, 6:15오후 UTC](https://meta.discourse.org/t/preventing-accidental-serialization-of-activerecord-models/314495/4 "2024-07-17T18:15:34Z")

</div>

게시물이 새 주제로 분리되었습니다: [새 직렬화 보호에 대한 도움말](https://meta.discourse.org/t/help-with-new-serialization-protectionsd/316864)

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 23, 2024, 5:59오후 UTC](https://meta.discourse.org/t/preventing-accidental-serialization-of-activerecord-models/314495/5 "2024-07-23T17:59:58Z")

</div>

글쎄, 21일이나 걸렸지만, 마침내 링크된 코드에서 말씀하신 내용을 적어도 한 가지 컨텍스트에서는 이해할 수 있게 되었습니다. 위에서 언급된 분할된 토픽에서 언급된 다른 한 가지도 이해했기를 바랍니다. 기억에 따르면, 문제가 정확히 어디에 있는지 잘 모르기 때문에 그쪽은 더 어려운 것 같습니다.

오늘을 구해주셔서 감사합니다 (아니면, 적어도 오늘만이라도). 🍻

다른 문제는 제 `server` 모델에 `user` 모델이 포함되어 있었고, `server` 시리얼라이저에서 `user` 모델의 사용자 시리얼라이저를 호출하거나(또는 필드를 제한해야) 했던 것이었습니다.

결국 제 `server` 모델에는 `user` 모델이 전혀 필요하지 않았습니다. (`user_id_was`는 이미 있었고, 실제로 그걸조차 필요로 하지 않을 가능성이 꽤 있습니다).
