이야기박스
Effective java 3/E - 직렬화 (item 85~90) 본문
Item 85. 자바 직렬화의 대안을 찾으라
보안에 매우 취약함
자바 직렬화란?
- 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.
- 시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기합니다.
- 참고 -
< 폭탄을 만드는 코드 >
역직렬화를 하는순간 컴퓨터는 폭팔할 예정
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");
t2.add("boo");
s1.add(t1);
s1.add(t2);
s2.add(t1);
s2.add(t2);
s1 = t1;
s2 = t2;
}
return serialize(root);
}
static byte[] serialize(Set<Object> set) {
byte[] result = new byte[set.size()];
Iterator<Object> iterator = set.iterator();
for (int i = 0; i < set.size(); i++) {
result[i] = Byte.parseByte((String) iterator.next());
}
return result;
}
15:54 INFO chapter12.item85.SerializableBomb - now : 0, root : [[boo], [foo]]
15:55 INFO chapter12.item85.SerializableBomb - now : 1, root : [[boo, [boo], [foo]], [[boo], foo, [foo]]]
15:56 INFO chapter12.item85.SerializableBomb - now : 2, root : [[boo, [boo, [boo], [foo]], [[boo], foo, [foo]]], [[boo, [boo], [foo]], foo, [[boo], foo, [foo]]]]
" 직렬화 위험을 회피하는 가장 좋은 방법은 아무것도 역직렬화하지 않는 것이다. "
" 승리하는 유일한 길은 정쟁하지 않는 것이다"
==> 자바 직렬화를 써야하는 어떠한 이유도 없다
Cross-Platform Structured-Data Representation 사용할 것
'Programming Language > JAVA' 카테고리의 다른 글
Java) 하노이의 탑 < 완성본 > (7) | 2019.06.02 |
---|---|
Java) 하이로우 게임 (1) | 2019.06.02 |
Effective java 3/E - 동시성 (item 78~84) (0) | 2019.01.11 |
Effective java 3/E - 예외 (item 69~77) (0) | 2019.01.03 |
Effective java 3/E - 일반적인 프로그래밍 원칙 (item 57~68) (0) | 2018.12.27 |