Growth-Collectors / effective-java

repository for effective java study
3 stars 2 forks source link

아이템 85. 자바 직렬화의 대안을 찾으라 #87

Open HanaHww2 opened 1 year ago

eternalklaus commented 1 year ago

직렬화

직렬화: 객체 -> 바이트 스트림 역직렬화: 바이트 스트림 -> 객체

왜 직렬화를 사용하는가?

직렬화가 왜 문제가 되나?

역직렬화 폭탄

@DisplayName("역직렬화 폭탄 테스트")
@Test
void deserializeBomb() {
    byte[] bomb = bomb();

    // 역직렬화를 하면 엄청 많은 시간이 걸린다.
    deserialize(bomb);
    assertThat(bomb).isNotEmpty();
}

static byte[] bomb() {
    Set<Object> root = new HashSet<>();
    Set<Object> s1 = root;
    Set<Object> s2 = new HashSet<>();
    for (int i = 0; i < 100; i++) {
        Set<Object> t1 = new HashSet<>();
        Set<Object> t2 = new HashSet<>();
        t1.add("foo");
        s1.add(t1);
        s1.add(t2);
        s2.add(t1);
        s2.add(t2);
        s1 = t1;
        s2 = t2;
    }
    return serialize(root); // 직렬화 수행
} 
  1. HashSet 을 역직렬화하려면 원소들의 해쉬코드를 계산해야 한다.
  2. 해쉬코드 계산함수를 2**100번 호출해야 함

IMG_0343{: width="50%" height="50%"} => 200개의 객체만으로 2**100의 call을 유발하는 가성비좋은(?) 공격

대처는 어떻게?

HanaHww2 commented 1 year ago

직렬화에 대해서 더 자세히 알게 되었습니다.