2025/03/23 2

Effective Java Item86. Serializable을 구현할지는 신중히 결정하라.

직렬화는 쉽다. implements Serializable만 붙이면 된다.Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다. 클래스가 Serializable을 구현하면 직렬화된 바이트 스트림 인코딩도 하나의 공개 API가 된다. 이 클래스가 널리 퍼진다면 그 직렬화 형태도 영원히 지원해야한다.기본 직렬화 형태에서는 클래스의 private과 package-private 인스턴스 필드들마저 API로 공개되는 꼴이 된다.(캡슐화가 깨진다). 필드로의 접근을 최대한 막아 정보를 은닉하라는 조언도 무력화된다.직렬화 가능 클래스를 만들고자 하면, 길게 보고 감당할 수 있을 만큼 고품질의 직렬화 형태도 주의해서 함께 설계해야 한다. 직렬화 설계 시 주의 사항스트림 고유 식별자, serialVersio..

Java/EffectiveJava 2025.03.23

Effective Java Item85. 자바 직렬화의 대안을 찾으라.

자바 직렬화분산 객체를 만들 수 있다는 구호보이지 않는 생성자, API와 구현 사이의 모호해진 경계, 잠재적인 정확성 문제, 성능, 보안, 유지보수성 등 대가가 컸다.직렬화의 근본적인 문제공격 범위가 너무 넓고 지속적으로 더 넓어져 방어하기 어렵다.ObjectInputStream의 readObject 메서드를 호출하면서 객체 그래프가 역직렬화되기 때문이다.readObject 메서드는 클래스패스 안의 거의 모든 타입의 객체를 만들어 낼 수 있는 생성자다.바이트 스트림을 역직렬화하는 과정에서 이 메서드는 그 타입들 안의 모든 코드를 수행할 수 있다.코드 전체가 공격 범위에 들어간다.모든 직렬화 가능 클래스들을 공격에 대비하도록 작성한다해도 취약하다.역직렬화에 시간이 오래 걸리는 짧은 스트림을 역직렬화하는 것..

Java/EffectiveJava 2025.03.23