정의
직렬화란 java code처럼 사람이 읽기 좋은 형태인 코드를 바이트 코드로 바꾸는 것을 의미합니다.
직렬화 방법
데이터를 전송할 때, java code로 만들어진 데이터를 다른 컴퓨터로 보낸다고 가정하겠습니다.
이런 데이터는 다른 컴퓨터에 도착합니다.
하지만 모든 PC의 OS는 서로 다른 가상 메모리를 가집니다.
따라서 값을 바로 저장하는 Primitive 타입이 아닌 Reference 타입은 Serializable 인터페이스로 구현을 해야합니다.
이렇게 만든 바이트 코드는 데이터베이스나 파일과 같은 외부 저장소에 저장하고 다른 컴퓨터에 도착하게 되면
그 데이터를 역직렬화를 통해 자바 객체로 반환해서 JVM 메모리에 적재하게 됩니다.
효율적인 직렬화란?
하지만 이러한 직렬화에도 역사적인 문제점이 많습니다.
이를 고려해서 사용해야합니다.
1. 보안적 문제
2000년대 초에는 ObjectInputStream의. readObject를 사용해서 역직렬화를 사용했습니다. 하지만 바이트 스트림을 역직렬화하는 과정에서 코드 전체가 랜섬웨어의 공격 범위에 들어가게 됩니다.
이러한 것을 가젯체인(gadget)이라고 부릅니다.
2. 시간적 문제
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);
}
return serialize(root);
}
이렇게 구성하면 201개의 HashSet 인스턴스로 구성되고 3개 이하의 객체 참조를 갖게 됩니다. 스트림의 전체크기는 작지만 역직렬화는 오랜 시간이 걸리게됩니다.
=> hashCode 메서드를 계속 부르면서 시간도 오래걸리고, 문제가 생겼다는 알람조차 없다는 문제가 있습니다.
이를 위해 역직렬화를 사용하지 말자는 얘기도 있었다고 합니다.
이에 대한 해결방안으로 나온것이
1) JSON과 프로토콜 버퍼입니다.
Json은 사람이 읽기 좋게 자바스크립트용으로 만들어졌습니다.
그리고 프로토콜 버퍼는 c++용으로 이진표현이라 효율이 높습니다.
2) 필터도 해결방안으로 나왔습니다.
신뢰할 수 없는 데이터의 역직렬화가 문제라면 신뢰할수 있는 데이터만 역직렬화하자 에서 나오게 됩니다.
즉, 역직렬화를 쓸때, 대안으로 나온 json, 프로토콜 버퍼를 사용하거나 필터를 통해 신뢰할 수 잇는 데이터만 직렬화를 지원하도록 만들자가 결론입니다.
'기술 스텍 > Java' 카테고리의 다른 글
Casting 이란? (0) | 2024.02.17 |
---|---|
Object 클래스란? (0) | 2024.02.07 |
Call By Value와 Call By Reference 차이점 분석 (0) | 2024.01.20 |
JVM 내부 구조 정리 (1) | 2024.01.14 |
String과 String Builder, String Buffer 차이점 (1) | 2024.01.11 |