파이썬에서 직렬화(객체를 저장/전송을 위해 바이트 시퀀스나 문자열로 변환하는 것)에 사용되는 모듈은 pickle과 json입니다:
Pickle을 통제되지 않은 당사자 간의 데이터 저장/전송에 사용하는 것은 위험합니다, 왜냐하면 역직렬화 시 임의의 악성 코드를 실행할 수 있기 때문입니다. json은 이런 단점이 없습니다.
작동 예시:
import pickle import json # Pickle (이진 직렬화) data = {'x': 10, 'func': lambda x: x + 1} with open('data.pkl', 'wb') as f: pickle.dump(data, f) # JSON (단순 객체만) data = {'x': 10, 'y': [1, 2, 3]} with open('data.json', 'w') as f: json.dump(data, f)
질문: pickle을 사용하여 모든 파이썬 객체를 세션 간에 직렬화하고 저장할 수 있습니까? 이 메커니즘을 사용자 데이터를 저장하는 데 권장하지 않는 이유는 무엇입니까?
답변:
아니오, pickle을 어디서나 사용하는 것은 나쁜 관행입니다. 보안 문제("타인의" pickled 객체를 로드할 때 실행이 손상될 수 있음) 외에도, 파이썬의 버전이나 클래스 불일치 문제가 있습니다 — 직렬화된 객체는 클래스 구조가 변경되면 로드되지 않거나 불안정하게 작동할 수 있습니다.
예시:
# pickle 파일 로드, 클래스 구조가 변경됨 import pickle with open('old_version.pkl', 'rb') as f: obj = pickle.load(f) # AttributeError 또는 구조 불일치
이야기
대규모 프로젝트에서 사용자 프로필 저장에 pickle이 사용되었습니다. 파이썬 버전 업데이트와 클래스 변경 후, 직렬화된 객체의 구조가 호환성을 잃어 시스템이 실패하고 대부분의 사용자 데이터를 잃게 되었습니다.
웹 서비스에서 사용자의 세션을 위해 pickle이 사용되었습니다. 악의적인 사용자가 악성 pickled 객체를 로드하여 서버에서 코드 삽입이 이루어졌습니다.
pickle을 통해 함수를 직렬화하여 네트워크로 전송하려는 시도가 여러 환경에서 실패했습니다: pickled 람다는 서로 다른 구성/버전의 머신 간에 перенос할 수 없습니다.