Serializer vs Deserializer
- Serializer
데이터를 객체(Object)에서 전송 가능한 형식(예: JSON, XML, YAML 등)으로 변환하는 과정.
예를 들어, Python의 객체를 JSON 문자열로 변환하여 HTTP 응답에 포함하거나 파일로 저장. - Deserializer
전송된 데이터를 다시 객체(Object)로 변환하는 과정.
예를 들어, JSON 문자열을 받아 Python 객체로 변환하여 사용할 수 있도록 처리.
Serializer 과 Deserializer은 데이터 전송과 저장을 효율적으로 처리하기 위해 사용됩니다. 특히 다음과 같은 상황에서 활용이 됨
- 데이터 전송
- RESTful API에서 클라이언트와 서버 간 데이터를 주고받기 위해.
- 클라이언트가 요청(Request) 데이터를 서버가 이해할 수 있는 객체로 변환 (Deserialization).
- 서버의 응답(Response)을 클라이언트가 처리할 수 있는 형식으로 변환 (Serialization).
- 데이터 저장
- 데이터를 데이터베이스에 저장하거나 파일로 기록할 때 객체를 저장 가능한 형식으로 변환.
- 데이터 처리 간소화
- 데이터 모델을 직관적으로 관리하고 쉽게 변환할 수 있도록 도움.
- 데이터 전송
데이터르 Serializer 과 Deserializer 했을때의 장,단점장점
- 데이터 전송의 표준화
- 서로 다른 시스템 간에 데이터를 전송할 때 표준 형식(JSON, XML 등)을 사용하여 호환성을 높임.
- 데이터 가공 용이
- 모델 데이터를 쉽게 가공하거나 사용자 정의 로직을 추가하여 전송할 수 있음.
- API 개발 간소화
- Django REST framework 같은 라이브러리는 Serializer를 이용해 데이터를 쉽게 변환하고 유효성 검사를 수행.
- 유효성 검사 (Validation)
- Deserialization 과정에서 데이터의 유효성을 검증하여 잘못된 데이터를 방지.
- 데이터 전송의 표준화
단점
- 성능 문제
- 대량의 데이터를 Serialization/Deserialization할 경우 성능에 영향을 줄 수 있음.
- 예: 복잡한 JSON 구조나 대량의 데이터 처리 시 시간과 리소스 소모.
- 대량의 데이터를 Serialization/Deserialization할 경우 성능에 영향을 줄 수 있음.
- 데이터 손실 가능성
- 데이터 변환 과정에서 일부 데이터가 누락되거나 변질될 가능성.
- 복잡성 증가
- 데이터 모델이 복잡할수록 Serializer/Deserializer 코드가 복잡해질 수 있음.
- 포맷 종속성
- 특정 형식(JSON, XML 등)에 의존할 경우, 다른 형식을 지원하려면 추가 작업이 필요.
이러한 과정을 Parsing 이라고 하는데 그중에 우리는 Json Parsing 을 보통한다.
- JSON Parsing이란?
- JSON Parsing은 JSON 형식으로 표현된 데이터를 컴퓨터가 처리할 수 있는 프로그래밍 언어의 객체로 변환하는 과정을 의미합니다.
- 간단히 말해, JSON 문자열 데이터를 읽어서 객체화하는 작업입니다.
- JSON이란?
- JSON (JavaScript Object Notation)은 데이터를 구조적으로 표현하기 위한 경량 데이터 교환 형식입니다.
- 사람이 읽고 쓰기 쉽고, 기계가 분석하고 생성하기도 간편합니다.
- 주로 API 통신에서 서버와 클라이언트 간 데이터 전송에 사용됩니다.
JSON Parsing은 어떻게 이루어지나?
- JSON 문자열 → 객체 (Deserialization)
- JSON 형식 데이터를 객체로 변환하여 프로그래밍 언어에서 사용 가능하게 만듦.
- 객체 → JSON 문자열 (Serialization)
- 객체를 JSON 형식의 문자열로 변환하여 데이터 전송 및 저장에 적합하게 만듦.
- JSON Parsing이 필요한 이유
- 데이터 교환
- 서버와 클라이언트 간 데이터 교환 시 JSON 형식을 주로 사용.
- 전송된 데이터를 파싱하여 사용할 수 있어야 함.
- 인간과 기계 간의 데이터 이해
- JSON은 사람이 읽기 쉬운 구조이지만, 기계는 객체 형태로 데이터를 처리해야 함.
- 따라서 파싱이 필수적.
- 데이터 유연성
- JSON 형식은 객체, 배열, 문자열, 숫자 등 다양한 데이터를 표현 가능하므로 여러 상황에서 사용 가능.
장점
- 경량화
- 데이터 구조가 간단하고 네트워크 전송에 적합.
- 표준화
- JSON은 언어 독립적이므로 Python, JavaScript, Java 등 다양한 언어에서 지원.
- 가독성
- 사람이 쉽게 이해할 수 있는 형식.단점
- 성능
- JSON 파싱은 XML보다 빠르지만, 대량의 데이터를 다룰 때 메모리 사용량이 증가할 수 있음.
- 유형 제한
- JSON은 기본 데이터 타입만 지원하므로 복잡한 데이터 타입(예: 날짜)을 처리하려면 추가 작업이 필요.
- 보안 문제
- JSON 데이터를 파싱할 때 잘못된 입력이 코드 실행을 유발할 수 있으므로 반드시 신뢰할 수 있는 데이터만 처리해야 함.
JSON 파싱 시 발생할 수 있는 보안 문제는 주로 악의적인 JSON 데이터가 포함된 공격 때문입니다. 이러한 공격은 서버나 클라이언트에 코드 실행, 데이터 유출, 서비스 거부(DoS) 등을 유발할 수 있습니다. 이러한 보안 문제를 해결하기 위해 다음과 같은 방법들을 적용할 수 있음.
그럼 Json parsing 시 보안문제는 어떻게 해결할수 잇을까?
- JSON 데이터 유효성 검증 (Validation)
- 스키마를 이용한 검증: JSON 데이터를 사전에 정의한 스키마(JSON Schema)와 비교하여 올바른 형식인지 확인
- 사용자 정의 검증: 수동으로 필수 필드와 데이터 유형을 검사하여 JSON 데이터의 무결성을 확인
- 파싱 라이브러리의 안전한 사용
- JSON 파싱 라이브러리에서 안전 모드를 사용하는 것이 중요합니다.
- Python: json.loads 사용 시 신뢰할 수 없는 입력을 직접 처리하지 않도록 주의
- JavaScript: JSON 데이터 파싱 시 eval 대신 항상 JSON.parse를 사용
- JSON 파싱 라이브러리에서 안전 모드를 사용하는 것이 중요합니다.
- 최대 데이터 크기 제한
- JSON 데이터 크기를 제한하여 서비스 거부(DoS) 공격을 방지합니다.
- 서버에서 허용 가능한 최대 JSON 크기를 설정
- JSON 데이터 인코딩
- JSON 데이터에서 특수 문자나 악의적인 스크립트를 방지하기 위해 반드시 데이터를 인코딩 처리합니다.
- HTML 이스케이프 처리: 악성 스크립트 삽입(XSS)을 방지하기 위해 데이터를 인코딩하여 처리.
- JSON 데이터에서 특수 문자나 악의적인 스크립트를 방지하기 위해 반드시 데이터를 인코딩 처리합니다.
- 신뢰할 수 없는 JSON 소스 차단
- CORS 정책 강화: 서버에서 신뢰할 수 있는 출처(origin)에서만 요청을 허용.
- 입력 데이터 무결성 검사: JSON 데이터에 디지털 서명(HMAC 또는 RSA)을 사용하여 무결성을 검증.
- JSON 데이터를 비동기로 처리
- 대규모 JSON 파일을 비동기 방식으로 스트리밍하여 처리 성능을 개선하고 리소스 고갈 공격을 방지
- 예: Python ijson 라이브러리를 사용
- 대규모 JSON 파일을 비동기 방식으로 스트리밍하여 처리 성능을 개선하고 리소스 고갈 공격을 방지
- 정기적인 보안 점검 및 업데이트
- JSON 파싱 라이브러리 및 의존성을 최신 버전으로 유지하여 보안 취약점을 최소화합니다.
- 코드 리뷰 및 정기적인 침투 테스트로 취약성을 사전에 발견.
- JSON Web Token (JWT) 데이터 사용 시 보안
- JSON 데이터를 JWT 형식으로 전송할 때:
- 서명 검증을 통해 데이터 위변조 방지.
- 민감한 데이터는 토큰에 직접 포함하지 말고 별도로 암호화하여 저장.
- JSON 데이터를 JWT 형식으로 전송할 때:
그러므로 Json parsing 시 보안문제를 해결하기위해, 데이터의 유효성 검증과, 크기제한 인코딩, 시뢰할수 잇는 소스 확인 등의 예방책을 적용하며, 최신 라이브러리를 유지하는게 좋을듯 함.
그러하면 Json Parsing 만 존제하냐? 선택하는 방식은 프로젝트 요구 사항, 데이터 구조, 성능 요구 사항에 따라 달라질 수 있기에 여러가지 방식이 잇다.
- 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보다 읽기 어렵고, 파싱 속도가 느림.
- Protocol Buffers (Protobuf)
개념
Google에서 개발한 바이너리 직렬화 형식.
JSON보다 훨씬 작고 빠른 데이터 직렬화 및 역직렬화 방식.
message User { string name = 1; int32 age = 2; repeated string skills = 3; }
장점
효율성: 데이터 크기가 작고 전송 및 처리 속도가 빠름.
스키마 지원: 명시적으로 데이터 구조를 정의할 수 있음.
언어 독립성: 다양한 언어에서 지원.
단점JSON처럼 사람이 읽기 쉽지 않음.
초기 설정(Protobuf 컴파일러 등)이 필요.
- YAML (Yet Another Markup Language)
- 개념
- JSON과 비슷하지만 더 간단한 문법을 가진 데이터 표현 형식.
장점name: Daeyeop Kim age: 29 skills: Python Django
- JSON과 비슷하지만 더 간단한 문법을 가진 데이터 표현 형식.
- 가독성: 사람이 읽고 쓰기에 더 직관적.
- 간단한 문법: JSON보다 단순하고 깔끔한 문법.
단점 - JSON보다 파싱 속도가 느림.
- 대규모 데이터 처리에 부적합.
- CSV (Comma-Separated Values)
개념
테이블 형태 데이터를 저장하고 전송하는 데 사용.
name,age,skills Daeyeop Kim,29,"Python, Django"
장점
간단한 구조: 행렬 데이터를 표현하기 적합.
광범위한 지원: 대부분의 프로그래밍 언어 및 도구에서 지원.
단점계층적 데이터 표현 불가.
데이터가 복잡해질수록 가독성이 낮아짐
'[Project를 위한 공부]' 카테고리의 다른 글
[Project 를 위한 공부] Middleware 정리 (0) | 2025.01.21 |
---|---|
[Project를 위한 공부] RAG 정의 정리 (1) | 2025.01.20 |
[Project를 위한 공부] github.io 로 블로그 정검하기 (3) | 2025.01.14 |
[Project를 위한 공부] Meta data 정리 (2) | 2025.01.13 |
[Project를 위한 공부] COSMOS 읽어보기 (2) (1) | 2025.01.10 |