[Project를 위한 공부]

[Project 를 위한 공부] Serializer 와 Deserializer

dyk98 2025. 1. 16. 17:18

Serializer vs Deserializer

  1. Serializer
    데이터를 객체(Object)에서 전송 가능한 형식(예: JSON, XML, YAML 등)으로 변환하는 과정.
    예를 들어, Python의 객체를 JSON 문자열로 변환하여 HTTP 응답에 포함하거나 파일로 저장.
  2. Deserializer
    전송된 데이터를 다시 객체(Object)로 변환하는 과정.
    예를 들어, JSON 문자열을 받아 Python 객체로 변환하여 사용할 수 있도록 처리.
  • Serializer 과 Deserializer은 데이터 전송과 저장을 효율적으로 처리하기 위해 사용됩니다. 특히 다음과 같은 상황에서 활용이 됨

    1. 데이터 전송
      • RESTful API에서 클라이언트와 서버 간 데이터를 주고받기 위해.
      • 클라이언트가 요청(Request) 데이터를 서버가 이해할 수 있는 객체로 변환 (Deserialization).
      • 서버의 응답(Response)을 클라이언트가 처리할 수 있는 형식으로 변환 (Serialization).
    2. 데이터 저장
      • 데이터를 데이터베이스에 저장하거나 파일로 기록할 때 객체를 저장 가능한 형식으로 변환.
    3. 데이터 처리 간소화
      • 데이터 모델을 직관적으로 관리하고 쉽게 변환할 수 있도록 도움.
  • 데이터르 Serializer 과 Deserializer 했을때의 장,단점장점

    1. 데이터 전송의 표준화
      • 서로 다른 시스템 간에 데이터를 전송할 때 표준 형식(JSON, XML 등)을 사용하여 호환성을 높임.
    2. 데이터 가공 용이
      • 모델 데이터를 쉽게 가공하거나 사용자 정의 로직을 추가하여 전송할 수 있음.
    3. API 개발 간소화
      • Django REST framework 같은 라이브러리는 Serializer를 이용해 데이터를 쉽게 변환하고 유효성 검사를 수행.
    4. 유효성 검사 (Validation)
      • Deserialization 과정에서 데이터의 유효성을 검증하여 잘못된 데이터를 방지.

단점

  1. 성능 문제
    • 대량의 데이터를 Serialization/Deserialization할 경우 성능에 영향을 줄 수 있음.
      • 예: 복잡한 JSON 구조나 대량의 데이터 처리 시 시간과 리소스 소모.
  2. 데이터 손실 가능성
    • 데이터 변환 과정에서 일부 데이터가 누락되거나 변질될 가능성.
  3. 복잡성 증가
    • 데이터 모델이 복잡할수록 Serializer/Deserializer 코드가 복잡해질 수 있음.
  4. 포맷 종속성
    • 특정 형식(JSON, XML 등)에 의존할 경우, 다른 형식을 지원하려면 추가 작업이 필요.

이러한 과정을 Parsing 이라고 하는데 그중에 우리는 Json Parsing 을 보통한다.

  1. JSON Parsing이란?
  • JSON Parsing은 JSON 형식으로 표현된 데이터를 컴퓨터가 처리할 수 있는 프로그래밍 언어의 객체로 변환하는 과정을 의미합니다.
  • 간단히 말해, JSON 문자열 데이터를 읽어서 객체화하는 작업입니다.
  1. JSON이란?
  • JSON (JavaScript Object Notation)은 데이터를 구조적으로 표현하기 위한 경량 데이터 교환 형식입니다.
  • 사람이 읽고 쓰기 쉽고, 기계가 분석하고 생성하기도 간편합니다.
  • 주로 API 통신에서 서버와 클라이언트 간 데이터 전송에 사용됩니다.

JSON Parsing은 어떻게 이루어지나?

  1. JSON 문자열 → 객체 (Deserialization)
    • JSON 형식 데이터를 객체로 변환하여 프로그래밍 언어에서 사용 가능하게 만듦.
  2. 객체 → JSON 문자열 (Serialization)
    • 객체를 JSON 형식의 문자열로 변환하여 데이터 전송 및 저장에 적합하게 만듦.
  • JSON Parsing이 필요한 이유
  1. 데이터 교환
    • 서버와 클라이언트 간 데이터 교환 시 JSON 형식을 주로 사용.
    • 전송된 데이터를 파싱하여 사용할 수 있어야 함.
  2. 인간과 기계 간의 데이터 이해
    • JSON은 사람이 읽기 쉬운 구조이지만, 기계는 객체 형태로 데이터를 처리해야 함.
    • 따라서 파싱이 필수적.
  3. 데이터 유연성
    • JSON 형식은 객체, 배열, 문자열, 숫자 등 다양한 데이터를 표현 가능하므로 여러 상황에서 사용 가능.

장점

  • 경량화
    • 데이터 구조가 간단하고 네트워크 전송에 적합.
  • 표준화
    • JSON은 언어 독립적이므로 Python, JavaScript, Java 등 다양한 언어에서 지원.
  • 가독성
    • 사람이 쉽게 이해할 수 있는 형식.단점
  • 성능
    • JSON 파싱은 XML보다 빠르지만, 대량의 데이터를 다룰 때 메모리 사용량이 증가할 수 있음.
  • 유형 제한
    • JSON은 기본 데이터 타입만 지원하므로 복잡한 데이터 타입(예: 날짜)을 처리하려면 추가 작업이 필요.
  • 보안 문제
    • JSON 데이터를 파싱할 때 잘못된 입력이 코드 실행을 유발할 수 있으므로 반드시 신뢰할 수 있는 데이터만 처리해야 함.

JSON 파싱 시 발생할 수 있는 보안 문제는 주로 악의적인 JSON 데이터가 포함된 공격 때문입니다. 이러한 공격은 서버나 클라이언트에 코드 실행, 데이터 유출, 서비스 거부(DoS) 등을 유발할 수 있습니다. 이러한 보안 문제를 해결하기 위해 다음과 같은 방법들을 적용할 수 있음.
그럼 Json parsing 시 보안문제는 어떻게 해결할수 잇을까?

  1. JSON 데이터 유효성 검증 (Validation)
    • 스키마를 이용한 검증: JSON 데이터를 사전에 정의한 스키마(JSON Schema)와 비교하여 올바른 형식인지 확인
    • 사용자 정의 검증: 수동으로 필수 필드와 데이터 유형을 검사하여 JSON 데이터의 무결성을 확인
  2. 파싱 라이브러리의 안전한 사용
    • JSON 파싱 라이브러리에서 안전 모드를 사용하는 것이 중요합니다.
      • Python: json.loads 사용 시 신뢰할 수 없는 입력을 직접 처리하지 않도록 주의
      • JavaScript: JSON 데이터 파싱 시 eval 대신 항상 JSON.parse를 사용
  3. 최대 데이터 크기 제한
    • JSON 데이터 크기를 제한하여 서비스 거부(DoS) 공격을 방지합니다.
    • 서버에서 허용 가능한 최대 JSON 크기를 설정
  4. JSON 데이터 인코딩
    • JSON 데이터에서 특수 문자나 악의적인 스크립트를 방지하기 위해 반드시 데이터를 인코딩 처리합니다.
      • HTML 이스케이프 처리: 악성 스크립트 삽입(XSS)을 방지하기 위해 데이터를 인코딩하여 처리.
  5. 신뢰할 수 없는 JSON 소스 차단
    • CORS 정책 강화: 서버에서 신뢰할 수 있는 출처(origin)에서만 요청을 허용.
    • 입력 데이터 무결성 검사: JSON 데이터에 디지털 서명(HMAC 또는 RSA)을 사용하여 무결성을 검증.
  6. JSON 데이터를 비동기로 처리
    • 대규모 JSON 파일을 비동기 방식으로 스트리밍하여 처리 성능을 개선하고 리소스 고갈 공격을 방지
      • 예: Python ijson 라이브러리를 사용
  7. 정기적인 보안 점검 및 업데이트
    • JSON 파싱 라이브러리 및 의존성을 최신 버전으로 유지하여 보안 취약점을 최소화합니다.
    • 코드 리뷰 및 정기적인 침투 테스트로 취약성을 사전에 발견.
  8. JSON Web Token (JWT) 데이터 사용 시 보안
    • JSON 데이터를 JWT 형식으로 전송할 때:
      • 서명 검증을 통해 데이터 위변조 방지.
      • 민감한 데이터는 토큰에 직접 포함하지 말고 별도로 암호화하여 저장.

그러므로 Json parsing 시 보안문제를 해결하기위해, 데이터의 유효성 검증과, 크기제한 인코딩, 시뢰할수 잇는 소스 확인 등의 예방책을 적용하며, 최신 라이브러리를 유지하는게 좋을듯 함.

그러하면 Json Parsing 만 존제하냐? 선택하는 방식은 프로젝트 요구 사항, 데이터 구조, 성능 요구 사항에 따라 달라질 수 있기에 여러가지 방식이 잇다.

  1. XML (eXtensible Markup Language)
  • 개념

    • JSON 이전에 많이 사용된 데이터 표현 방식.

    • 태그 기반의 계층적 데이터 구조를 가짐.

      <user>
      <name>Daeyeop Kim</name>
      <age>29</age>
      <skills>
      <skill>Python</skill>
      <skill>Django</skill>
      </skills>
      </user>

장점

  • 유연성: 복잡한 데이터 구조 표현 가능.
  • 형식화: 스키마(XML Schema)를 통해 데이터 구조를 명확히 정의 가능.
    단점
  • 데이터가 더 크고, JSON보다 읽기 어렵고, 파싱 속도가 느림.
  1. Protocol Buffers (Protobuf)
  • 개념

    • Google에서 개발한 바이너리 직렬화 형식.

    • JSON보다 훨씬 작고 빠른 데이터 직렬화 및 역직렬화 방식.

      message User {
      string name = 1;
      int32 age = 2;
      repeated string skills = 3;
      }

    장점

  • 효율성: 데이터 크기가 작고 전송 및 처리 속도가 빠름.

  • 스키마 지원: 명시적으로 데이터 구조를 정의할 수 있음.

  • 언어 독립성: 다양한 언어에서 지원.
    단점

  • JSON처럼 사람이 읽기 쉽지 않음.

  • 초기 설정(Protobuf 컴파일러 등)이 필요.

  1. YAML (Yet Another Markup Language)
  • 개념
    • JSON과 비슷하지만 더 간단한 문법을 가진 데이터 표현 형식.
      name: Daeyeop Kim  
      age: 29  
      skills:
      Python
      Django  
      장점
  • 가독성: 사람이 읽고 쓰기에 더 직관적.
  • 간단한 문법: JSON보다 단순하고 깔끔한 문법.
    단점
  • JSON보다 파싱 속도가 느림.
  • 대규모 데이터 처리에 부적합.
  1. CSV (Comma-Separated Values)
  • 개념

    • 테이블 형태 데이터를 저장하고 전송하는 데 사용.

      name,age,skills
      Daeyeop Kim,29,"Python, Django"

    장점

  • 간단한 구조: 행렬 데이터를 표현하기 적합.

  • 광범위한 지원: 대부분의 프로그래밍 언어 및 도구에서 지원.
    단점

  • 계층적 데이터 표현 불가.

  • 데이터가 복잡해질수록 가독성이 낮아짐