기술 면접을 대비해
Java의 Serialization와 관련된 질문과 답을
꼬리 질문 형태로 작성한 글입니다.
Q. 직렬화(serialization)란 무엇이며 왜 자바에서 사용하나요? 답변해주세요.
A : Java의 객체를 외부와 상호작용 할때, 데이터 형태를 맞춰주기 위해서 사용합니다.
답변에 대한 평가: 40점
평가 이유: 답변은 일부 맞는 내용을 포함하고 있지만, 직렬화의 개념을 충분히 설명하지 않았습니다. 또한, 왜 자바에서 직렬화를 사용하는지에 대한 이유도 명확히 언급되지 않았습니다.
Q. Java에서 객체를 직렬화하는 과정에는 어떤 단계들이 포함되어 있나요? 직렬화된 객체를 외부와 상호작용할 때 어떤 장점이 있는지 설명해주세요.
A : 직렬화 과정은 먼저, 직렬화가 필요한 클래스에 Serializable 인터페이스를 구현해야 합니다. 객체를 ObjectOutputStream을 사용하여 바이트 스트림으로 변환하고 파일에 저장하거나 네트워크를 통해 전송합니다. 나중에 ObjectInputStream을 사용하여 바이트 스트림을 객체로 복원할 수 있습니다. 클래스에 serialVersionUID를 정의하여 직렬화된 데이터와 클래스의 호환성을 유지합니다. 장점은 직렬화는 파일 저장 및 복원을 간편하게 처리할 수 있도록 해줍니다, 객체를 네트워크로 전송하여 분산 시스템에서 데이터를 공유할 수 있습니다, 직렬화된 객체는 다른 시스템과 플랫폼 독립적으로 데이터 교환이 가능합니다, 애플리케이션에서 캐싱된 데이터를 저장하고 재사용할 수 있습니다.
답변에 대한 평가: 90점
평가 이유: 답변에는 직렬화 과정에 대한 상세한 설명과 serialVersionUID의 중요성에 대해 언급하였습니다. 또한 직렬화의 장점을 다양하게 설명해 주었습니다.
Q. serialVersionUID가 없을 때의 직렬화된 데이터와 클래스의 호환성이 어떻게 처리되는지 설명해주세요. 또한, 직렬화된 객체를 역직렬화할 때 보안상 주의할 점은 무엇인가요?
A : serialVersionUID는 직렬화된 클래스의 버전 정보를 나타냅니다. 클래스에 명시적으로 정의되지 않은 경우, JVM이 자동으로 클래스 구조를 기반으로 생성합니다. 클래스 구조가 변경되면 새로운 serialVersionUID가 생성되어, 이전에 직렬화된 데이터와 호환되지 않아 InvalidClassException이 발생할 수 있습니다. 따라서 호환성을 유지하려면 serialVersionUID를 명시적으로 정의해야 합니다.
역직렬화 공격은 직렬화된 데이터를 악의적으로 조작하여 애플리케이션에 피해를 줄 수 있습니다. 이를 방지하기 위해 다음과 같은 대책을 사용할 수 있습니다 신뢰할 수 있는 데이터만 역직렬화하도록 데이터 출처를 검증합니다. 클래스의 readObject() 메서드를 재정의하여 데이터의 유효성을 검증합니다. 객체 역직렬화 시 허용된 클래스만 처리하도록 화이트리스트 기반 검증을 추가합니다. 필요하지 않은 클래스에서는 Serializable 인터페이스를 구현하지 않도록 설계합니다.
답변에 대한 평가: 100점
평가 이유: 학생의 답변은 serialVersionUID에 대한 정확한 설명과 역직렬화 공격을 방지하기 위한 대책들을 자세히 설명하고 있습니다. 또한, 실제적인 방어 전략을 제시하고 있어 매우 우수한 답변입니다.
Q. 객체 역직렬화 시 허용된 클래스만을 처리하기 위해 외부에서 입력되는 데이터를 어떤 방식으로 검증해야 하는지 자세히 설명해주세요. 또한, 화이트리스트 기반의 검증과 블랙리스트 기반의 검증의 차이는 무엇인가요?
A : 화이트리스트 기반 검증: 역직렬화 가능한 클래스의 목록을 미리 정의하고, 해당 목록에 포함된 클래스만 역직렬화를 허용합니다. 예를 들어, ValidatingObjectInputStream을 사용해 허용할 클래스를 지정하거나, JSON/XML 기반의 안전한 대안을 사용할 수 있습니다.
readObject() 메서드 재정의는 객체가 역직렬화된 후 readObject() 메서드에서 객체의 상태를 검증하여 비정상적인 데이터를 차단할 수 있습니다. 바이트 스트림 검증은 역직렬화 전에 입력 데이터를 분석하여 유효성을 검증합니다.
화이트리스트 검증은 허용된 클래스만 역직렬화할 수 있어 높은 보안 수준을 제공합니다. 다만, 허용할 클래스 목록을 지속적으로 관리해야 합니다. 반면, 블랙리스트 검증은 금지된 클래스나 패턴만 지정하여 이를 차단하지만, 미지의 악성 클래스를 차단하지 못할 위험이 있어 새로운 취약점에 취약할 수 있습니다. 결론적으로 보안이 중요한 시스템에서는 화이트리스트 기반 검증을 사용하는 것이 더 안전하며, 역직렬화 과정에서 데이터를 신중히 검증해야 역직렬화 공격과 같은 보안 문제를 예방할 수 있습니다.
'Java' 카테고리의 다른 글
부동 소수점 (0) | 2025.01.11 |
---|---|
immutable 객체로 만드는 방법 (2) | 2025.01.09 |
JVM 정복하기 (0) | 2025.01.09 |
[Effective Java] 생성자 대신 팩터리 메서드를 고려하라 (0) | 2024.12.11 |
자바 메모리 구조 (0) | 2024.10.02 |