[Java 직렬화, JSON 직렬화, Hessian 직렬화]

소개

메모리의 데이터 객체는 데이터 지속성과 네트워크 전송을 위해 바이너리 스트림으로만 변환될 수 있습니다. 데이터 개체를 이진 스트림으로 변환하는 프로세스를 개체 직렬화라고 합니다.
반대로 바이너리 스트림을 데이터 개체로 복원하는 프로세스를 역직렬화라고 합니다.
직렬화는 데이터 개체를 복원하기에 충분한 정보를 유지해야 하지만 저장 공간과 네트워크 대역폭을 절약하려면 직렬화된 이진 스트림이 최대한 작아야 합니다.
직렬화의 일반적인 사용 시나리오는 RPC 프레임워크에서의 데이터 전송입니다. 세 가지 일반적인 직렬화 방법이 있습니다.

JAVA 네이티브 직렬화

Java 클래스는 직렬화 가능 인터페이스를 구현하여 이 클래스의 객체 직렬화를 구현합니다. 이 인터페이스는 매우 특별하며 메소드가 없으며 단지 식별자 역할만 합니다.
Java 직렬화는 객체 클래스의 메타데이터(클래스, 멤버 변수, 상속된 클래스 정보 등)와 객체 데이터 등을 유지하며 호환성이 가장 뛰어나지만 언어 간 지원하지 않으며 평균 성능 .
직렬화 가능 인터페이스를 구현하는 클래스의 경우 serialVersionUID 필드 값을 설정하는 것이 좋으며, 설정하지 않으면 컴파일러는 클래스 이름, 인터페이스 이름, 메소드, 속성 등을 포함한 클래스의 내부 구현을 기반으로 매회 serialVersionUID를 자동으로 생성합니다. 실행되는 시간입니다.
클래스의 소스 코드가 수정되면 재컴파일 후 serialVersionUID 값이 변경될 수 있습니다. 따라서 직렬화 가능 인터페이스를 구현하는 클래스는 serialVersionUID 특성 값을 명시적으로 정의해야 합니다.
클래스 수정 시 serialVersionUID는 호환성에 따라 수정 여부를 결정해야 하며, 호환되는 업그레이드라면 deserialization 실패를 방지하기 위해 serialVersionUID 필드는 수정하지 마세요.
업그레이드와 호환되지 않는 경우 직렬화 해제 혼동을 피하기 위해 serialVersionUID 값을 수정해야 합니다.
Java 네이티브 직렬화를 사용하는 경우 Java deserialization 중에는 클래스의 매개변수 없는 생성자가 호출되지 않지만 네이티브 메서드가 호출되어 해당 유형의 초기값에 멤버 변수를 할당하게 되므로 주의하시기 바랍니다.
성능 및 호환성 고려 사항으로 인해 Java 기본 직렬화는 권장되지 않습니다 .

헤세 직렬화

Hessian 직렬화는 동적으로 유형이 지정되고 언어 간 객체 기반 전송을 지원하는 네트워크 프로토콜입니다.
Java 객체 직렬화된 바이너리 스트림은 다른 언어(C++/Python)로 역직렬화될 수 있습니다. Hessian 프로토콜에는 다음과 같은 기능이 있습니다.
자기 설명적 직렬화 유형. 외부 설명 파일이나 인터페이스 정의에 의존하지 않고 일반적인 기본 유형을 나타내려면 1바이트를 사용하십시오.

  • 바이너리 스트림을 대폭 단축합니다.
  • 언어 독립적이며 스크립팅 언어를 지원합니다.
  • 이 프로토콜은 Java의 기본 직렬화보다 간단하고 효율적입니다.

Hessian 1.0과 비교하여 Hessian 2.0은 압축 인코딩을 추가합니다. 직렬화된 이진 스트림 크기는
Java 직렬화의 50%, 직렬화 시간은 Java 직렬화의 30%, 역직렬화 시간은
Java 역직렬화의 20%입니다. Hessian은 다음의 모든 속성을 저장합니다. 직렬화를 위한 Map의 복잡한 객체
따라서 상위 클래스와 하위 클래스에 동일한 이름의 멤버 변수가 있을 때 Hessian 직렬화를 수행할 때 하위 클래스가 먼저 직렬화되고 그 다음 상위 클래스가 직렬화되므로 deserialization 결과적으로 멤버
는 동일한 이름을 가진 하위 클래스의 변수는 상위 클래스의 값으로 덮어쓰여집니다.
효율성이 높고 호환성이 좋지 않아 권장되지 않습니다 .

JSON 직렬화

JSON(JavaScript ect Notation)은 경량 데이터 교환 형식입니다 . JSON 직렬화는 데이터 객체를 JSON 문자열로 변환하는 것입니다.
형식 정보는 직렬화 프로세스 중에 삭제되므로 역직렬화 중에는 형식 정보만 정확하게 역직렬화할 수 있습니다. 처음 두 가지 방법에 비해 JSON은 디버깅에 더 읽기 쉽고 편리합니다 .
직렬화는 일반적으로 네트워크를 통해 개체를 전송하고 개체에는 민감한 데이터가 포함되는 경우가 많기 때문에 직렬화는 해커의 공격 지점이 되는 경우가 많습니다. 공격자는 교묘하게 역직렬화 프로세스를 사용하여 악성 코드를 구성하여 역직렬화 프로세스 중에 프로그램이 임의의 코드를 실행하게 만듭니다.
Apache Commons Collections Jackson fastjson 및 Java 프로젝트에서 널리 사용되는 기타 항목에서 역직렬화 취약점이 발생했습니다. 이런 종류의 해커 공격을 방지하는 방법은 무엇입니까?
일부 개체의 민감한 속성 은 직렬화 및 전송이 필요하지 않습니다. 이 속성 정보가 직렬화된 바이너리 스트림으로 변환되는 것을 방지하려면 임시 키워드를 추가할 수 있습니다 .
객체의 민감한 속성을 전송해야 하는 경우 대칭 및 비대칭 암호화를 사용하여 속성을 독립적으로 전송한 다음 메소드를 사용하여 속성을 객체에 복원할 수 있습니다.
애플리케이션 개발자는 직렬화에 대한 보안 예방 조치에 대해 어느 정도 인식하고, 들어오는 데이터의 내용을 확인하거나 권한을 제어하고, 적시에 보안 취약성을 업데이트하여 공격을 방지해야 합니다.
위의 지식 포인트는 Efficient Code: Java Development Manual에서 발췌한 것입니다. 이 글은 읽은 후 노트로 모든 사람에게 노트로 공유됩니다.

JSON 직렬화는 실제 개발에서 자주 사용됩니다. 예를 들어
샘플 코드
이 인터페이스는 JSON 직렬화를 사용합니다. 입력 매개변수 객체는 @RequestBody 주석을 사용하여 입력 매개변수를 Java 객체로 변환합니다. @ResponseBody 주석은 반환 값을 변환하는 데 사용됩니다. JSON 형식으로의 인터페이스 일반적인 JSON 직렬화 참조 예를 반환합니다.


추천

출처blog.csdn.net/uziuzi669/article/details/123003806