직렬화를 사용해야 하는 경우

  • 자바 시스템 내부의 객체나 데이터를 외부 자바 시스템에서도 사용할 수 있도록 byte 형태의 데이터로 변환하는 기술임
  • 데이터 포맷을 맞춰줘야하는 번거로움이 없어서 편리하게 사용가능

 

 

직렬화 단점

  • 직렬화의 근본적인 문제는 (외부에서) 공격 범위가 너무 넓고 지속적으로 더 넓어져 방어하기 어렵다는 점이다.
  • 바이트스트림을 역직렬화하는 과정에서 그 타입들 안의 모든 코드를 수행하는데 이는 즉, 그 타입들의 코드 전체가 공격 범위에 들어간다는 뜻이다.
  • 자바의 표준 라이브러리나 아파치 커먼즈 컬렉션같은 서드파티 라이브러리는 물론 어플리케이션 자신의 클래스들도 공격 범위에 포함된다.
  • 역직렬화시에 데이터 구조가 변형되는 것도 큰 문제이다.
  • 여러가지 정보를 담아야 하기 때문에 직렬화시에 용량이 커진다

 

 

직렬화의 위험을 피하는 방법

  • 가장 좋은 방법은 아무것도 역직렬화하지 않는 것
  • 객체와 바이트 시퀀스를 변환해주는 다른 메커니즘이 많다.
    • 책에서는 직렬화와 구분하고자 크로스-플랫폼 구조화된 데이터 표현이라 한다.
    • 이 표현들의 공통점은 자바 직렬화보다 훨씬 간단하다는 것이다.
    • 임의 객체 그래프를 자동으로 직렬화 / 역직렬화하지 않는다.
    • 대신 속성-값 쌍의 집합으로 구성된 간단하고 구조화된 데이터 객체를 사용한다.
    • 그리고 기본 타입 몇 개와 배열 타입만 지원할 뿐이다.
  • 크로스-플랫폼 구조화된 데이터 표현의 선두주자는 JSON과 프로토콜 버퍼(protobuf)다
  • JSON은 텍스트 기반이고 프로토콜 버퍼는 이진 표현이다.

 

 

자바 직렬화를 피하지 못할 때의 방법

  • 신뢰할 수 없는 데이터는 절대 역직렬화하지 않는 것이다.
  • 특히 신뢰할 수 없는 RMI는 절대 수용해서는 안된다.
  • 객체 역직렬화 필터링(java.io.ObjectInputFilter)을 사용하자
    • 데이터 스트림이 역직렬화되기 전에 필터를 설치하는 기능이다.

+ Recent posts