Item 85. Alternatives Serialization

μžλ°” μ§λ ¬ν™”μ˜ λŒ€μ•ˆμ„ 찾으라

μ§λ ¬ν™”λŠ” λΆ„μ‚° 객체λ₯Ό μ†μ‰½κ²Œ λ§Œλ“€ 수 있게 ν•΄μ£Όμ§€λ§Œ, μ‹¬κ°ν•œ λ³΄μ•ˆ 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλŠ” λ¬Έμ œκ°€ μžˆλ‹€. μ§λ ¬ν™”μ˜ 근본적인 λ¬Έμ œλŠ” 곡격 λ²”μœ„κ°€ λ„ˆλ¬΄ λ„“κ³  μ§€μ†μ μœΌλ‘œ λ„“μ–΄μ Έ λ°©μ–΄ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 점인데, κ·Έ μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. ObjectInputStream의 readObject λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 객체λ₯Ό 역직렬화 μˆ˜ν–‰

  2. λ°”μ΄νŠΈ μŠ€νŠΈλ¦Όμ„ μ—­μ§λ ¬ν™”ν•˜λŠ” κ³Όμ •μ—μ„œ νƒ€μž…λ“€ μ•ˆμ˜ λͺ¨λ“  μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κ²Œ 됨

    • μ›λž˜ 객체의 클래슀 νƒ€μž…μ„ μœ μ§€ν•˜λ©΄μ„œ λ³΅μ›λ˜λ©°, κ·Έ κ³Όμ •μ—μ„œ ν•΄λ‹Ή 클래슀의 μ½”λ“œκ°€ μ‹€ν–‰

  3. κ·Έ νƒ€μž…λ“€μ˜ μ½”λ“œ 전체가 곡격 λ²”μœ„μ— ν¬ν•¨ν•˜κ²Œ λ˜μ–΄, κ·Έ νƒ€μž…λ“€μ˜ μ½”λ“œκ°€ μ•…μ˜μ μΈ μ½”λ“œλ‘œ λŒ€μ²΄λ  수 있음

λ˜ν•œ, 역직렬화가 λλ‚˜μ§€ μ•Šκ²Œ ν•˜λŠ” 역직렬화 폭탄(deserialization bomb)μ΄λΌλŠ” 곡격에도 λ…ΈμΆœλ  수 μžˆλ‹€.

class Test {

    static byte[] bomb() {
        Set<Object> root = new HashSet<>(); // 객체 κ·Έλž˜ν”„ 루트
        Set<Object> s1 = root; // λ£¨νŠΈμ— λŒ€ν•œ 첫 번째 μ°Έμ‘°
        Set<Object> s2 = new HashSet<>(); // λ£¨νŠΈμ™€ 독립적인 μƒˆλ‘œμš΄ 집합
        for (int i = 0; i < 100; i++) {
            // HashSet 객체 생성
            Set<Object> t1 = new HashSet<>();
            Set<Object> t2 = new HashSet<>();
            t1.add("foo");

            // s1에 t1, t2 μΆ”κ°€
            s1.add(t1);
            s1.add(t2);
            // s2에 t1, t2 μΆ”κ°€
            s2.add(t1);
            s2.add(t2);

            // s1, s2λ₯Ό 각각 t1, t2둜 κ°±μ‹ 
            s1 = t1;
            s2 = t2;
        }
        return serialize(root);
    }
}

μœ„ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κ²Œ 되면, λ°˜λ³΅λ¬Έμ— μ˜ν•΄ κΉŠμ΄κ°€ 100인 HashSet 객체가 μƒμ„±λ˜κ³ , 이λ₯Ό μ—­μ§λ ¬ν™”ν•˜κΈ° μœ„ν•΄μ„  2^100번의 ν•΄μ‹± λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. 사싀상 μ˜μ›νžˆ κ³„μ†λ˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ²Œ 되며, 이λ₯Ό κ°μ§€ν•˜κΈ° 쉽지 μ•Šλ‹€λŠ” λ¬Έμ œλ„ μ‘΄μž¬ν•œλ‹€.

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„  역직렬화 자체λ₯Ό ν”Όν•˜λŠ” 것이 κ°€μž₯ μ’‹κ³ , ν•„μš”ν•˜λ‹€λ©΄ 직렬화 λŒ€μ‹  λ‹€μŒκ³Ό 같은 방법을 μˆ˜ν–‰ν•˜λŠ” 것이 μ’‹λ‹€.

  • μž„μ˜ 객체 κ·Έλž˜ν”„λ₯Ό 직렬화/역직렬화 ν•˜λŠ” λŒ€μ‹ , 속성-κ°’ 쌍의 μ§‘ν•©μœΌλ‘œ κ΅¬μ„±λœ κ°„λ‹¨ν•˜κ³  κ΅¬μ‘°ν™”λœ JSON κ³Ό 같은 데이터 ν‘œν˜„μ„ μ‚¬μš©

  • λ§Œμ•½ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œμœΌλ‘œ 직렬화λ₯Ό λ°°μ œν•  수 μ—†λŠ” 경우, μ‹ λ’°ν•  수 μ—†λŠ” λ°μ΄ν„°λŠ” μ ˆλŒ€ μ—­μ§λ ¬ν™”ν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ ν•œμ •

  • 역직렬화 필터링(ObjectInputFilter)을 μ‚¬μš©ν•  땐 λΈ”λž™λ¦¬μŠ€νŠΈ λŒ€μ‹  ν™”μ΄νŠΈλ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ 필터링

Last updated