PHpullh
학습 라이브러리/Java/Serialization과 역직렬화

JAVA · 파일/IO

Serialization과 역직렬화

Java 직렬화의 동작 원리, 보안 위험, 대안을 알아봅니다.

파일/IO고급Serializable직렬화transientserialVersionUID

핵심 설명

Java 직렬화의 동작 원리, 보안 위험, 대안을 알아봅니다.

Java code

import java.io.*;

public class SerializationDemo {
    // Serializable 구현
    static class User implements Serializable {
        private static final long serialVersionUID = 1L;

        private String name;
        private transient String password; // 직렬화 제외
        private int age;

        User(String name, String password, int age) {
            this.name = name;
            this.password = password;
            this.age = age;
        }

        @Override
        public String toString() {
            return String.format("User{name=%s, pw=%s, age=%d}",
                name, password, age);
        }
    }

    public static void main(String[] args) throws Exception {
        User user = new User("홍길동", "secret123", 30);

        // 직렬화
        byte[] bytes;
        try (var baos = new ByteArrayOutputStream();
             var oos = new ObjectOutputStream(baos)) {
            oos.writeObject(user);
            bytes = baos.toByteArray();
        }
        System.out.println("직렬화 크기: " + bytes.length + " bytes");

        // 역직렬화
        try (var bais = new ByteArrayInputStream(bytes);
             var ois = new ObjectInputStream(bais)) {
            User restored = (User) ois.readObject();
            System.out.println(restored);
            // password는 null (transient)
        }

        // 권장: JSON 직렬화 (Jackson)를 대신 사용
        // ObjectMapper mapper = new ObjectMapper();
        // String json = mapper.writeValueAsString(user);
    }
}

학습 팁

Java 직렬화보다 JSON(Jackson, Gson)이나 Protocol Buffers를 사용하세요. 직렬화는 보안 취약점의 주요 원인입니다.

주의할 점

serialVersionUID를 선언하지 않으면 클래스 변경 시 역직렬화가 실패합니다. 항상 명시적으로 선언하세요.

자주 묻는 질문

Serialization과 역직렬화란 무엇인가요?

Java 직렬화의 동작 원리, 보안 위험, 대안을 알아봅니다.

Serialization과 역직렬화 학습 시 주의할 점은 무엇인가요?

serialVersionUID 를 선언하지 않으면 클래스 변경 시 역직렬화가 실패합니다. 항상 명시적으로 선언하세요.