Item 85. Alternatives Serialization
์๋ฐ ์ง๋ ฌํ์ ๋์์ ์ฐพ์ผ๋ผ
์ง๋ ฌํ๋ ๋ถ์ฐ ๊ฐ์ฒด๋ฅผ ์์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ์ง๋ง, ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ง๋ ฌํ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ๊ณต๊ฒฉ ๋ฒ์๊ฐ ๋๋ฌด ๋๊ณ ์ง์์ ์ผ๋ก ๋์ด์ ธ ๋ฐฉ์ดํ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ธ๋ฐ, ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
ObjectInputStream
์readObject
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ฒด๋ฅผ ์ญ์ง๋ ฌํ ์ํ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ญ์ง๋ ฌํํ๋ ๊ณผ์ ์์ ํ์ ๋ค ์์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ํํ๊ฒ ๋จ
์๋ ๊ฐ์ฒด์ ํด๋์ค ํ์ ์ ์ ์งํ๋ฉด์ ๋ณต์๋๋ฉฐ, ๊ทธ ๊ณผ์ ์์ ํด๋น ํด๋์ค์ ์ฝ๋๊ฐ ์คํ
๊ทธ ํ์ ๋ค์ ์ฝ๋ ์ ์ฒด๊ฐ ๊ณต๊ฒฉ ๋ฒ์์ ํฌํจํ๊ฒ ๋์ด, ๊ทธ ํ์ ๋ค์ ์ฝ๋๊ฐ ์ ์์ ์ธ ์ฝ๋๋ก ๋์ฒด๋ ์ ์์
๋ํ, ์ญ์ง๋ ฌํ๊ฐ ๋๋์ง ์๊ฒ ํ๋ ์ญ์ง๋ ฌํ ํญํ(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
Was this helpful?