XML 문서를 DOM 분석 및 객체화시키기

섹션 1 : DOM Parsing을 통한 웹 트래픽 크롤링 자동화 툴 생

by Younggi Seo

보안 업무 특성상 해당 웹페이지 메시지의 페이로드(payload)* 부분만을 확인해달라는 요청을 받을 수 있다. 왜냐하면 정상적인 패킷이 아닌 것으로 사료되어 어떠한 데이터가 포함되어 있는지 확인해서 악성코드의 오탐 여부를 확인하기 위해서이다. 이때, XML 웹페이지일 경우 Java의 JAXP(Java API for XML Processing) 클래스 라이브러리를 통해 서버에서 보낸 XML 파일을 분리(Parsing)시켜 객체로 처리된 DOM(Document Object Model) Tree 형태로 컴파일할 수 있다. 프로그램 코딩은 간단하다. 다만, 파싱(구문 분석)하려는 문서 내부의 구조에 따라서 파싱 여부가 결정된다.




"프로세서(processor)와 애플리케이션(application) 프로세서는 마크업**을 분석하고 구조화된 정보를 애플리케이션에 넘긴다. 이 명세는 XML 프로세서가 무엇을 해야 하고 하지 말아야 하는지 제시하지만, 애플리케이션에 대해서는 다루지 않는다. 이 프로세서(명세가 부르기를)는 흔히 'XML parser'라 불린다."



XML 응용 프로그램(Application)을 처리하기 위한 Java Source



XML 문서를 Parser 프로그램에 의해 주어진 문장(Element)들을 분석하거나 문법적 관계를 해석하는 행위(Parsing)를 함으로써 개발자나 보안 분석가에게 '유효한 Data'를 추출하는 과정이 위의 Java 소스코드로 이루어진다. 21, 22행 코드에서 볼 수 있듯이 일단 private.xml 문서의 찾으려는 첫 번째 태그(tag, 이름표)가 'project-private'이다. 이 엘러먼트(element, 요소) 내부에 자식 요소(child elements)들을 for 반복문을 통해 전부 출력하고 있다. 그리고 그 불러들인 자식 요소들의 id가 'file'과 같다면 최종적으로 그 태그의 내용에 해당하는 요소를 출력한다.


파싱한 XML 파일의 내용은 아래와 같다.


DOM Tree 형태로 객체화되는 XML 파일 내용은 크게 마크업(< > 안의 태크)과 Content(내용)로 나뉜다.


웹 서비스는 SOAP(Simple Object Access Protocol, 웹 서비스에서 기본적인 메시지를 전달하는 기반)***을 통해 XML을 사용하여 정보를 교환한다. XML(eXtensible Markup Language)은 데이터 객체를 담는 데이터를 생성하고 해석하는 방식을 제공한다. SOAP(Simple Object Access Protocol)은 HTTP 메시지에 XML 데이터를 담는 방식에 관한 표준이다(고울리, 2014).**



그럼 XML 문서는 기존의 HTTP 웹 페이지와 무엇이 차별화되어서 개발되었나? HTML의 한계를 극복하기 위해서인데, 이것을 알려면 WebDAV(Web Distributed Authoring and Versioning, 웹 분산 저작과 버저닝)에 대해서 언급해야 한다. 웹 배포 공동 작업에 대한 또 다른 영역을 개척한 이 산업 표준(RFC 2518)은 공동 저작에 적합한 플랫폼을 제공하려고 HTTP를 확장하는 데 집중하였다(고울리, 2014).


그래서 WebDAV가 수정한 HTTP 메서드는 DELETE, PUT 그리고 OPTIONS이다. 전부 보안과 긴밀히 연관된 메서드들이다(역주). WebDAV의 메서드는 요청과 응답 관련 정보를 모두 잘 다루어야 한다. HTTP는 보통 이 정보를 메시지 헤더에 담아 전달한다(고울리, 2014).


하지만 헤더에만 정보를 담아 전송하는 것은, 하나의 요청에 있는 여러 개의 리소스나 계층 관계에 있는 리소스들에 대한 정보를 헤더에 '선택적'으로 기술하기 어려운 점 등의 한계가 있다.



WebDAV는 이 문제를 해결하기 위해 XML(eXtensible Markup Language)을 지원한다. XML은 구조화된 데이터를 표현할 때 사용하는 포맷으로, '메타 마크업 언어'다. WebDAV는 XML을 다음과 같은 용도로 사용한다.


데이터를 어떻게 처리할 것인지 설명하는 명령 포맷

서버의 복잡한 응답을 표현하는 데 사용하는 포맷

컬렉션과 리소스를 처리하는 데 사용하는 커스텀 정보 포맷

데이터 자체를 표현할 수 있는 유연한 포맷

대부분의 국제화 관련 문제에 대한 해결책


복잡한 XML 스키마는 WebDAV 명세인 RFC 4918(본래 2518이나 폐기됨.)에 정의되어있다. 이미 정의된 스키마는, 구문 분석(parsing) 소프트웨어가 DTD(Document Type Definition, 문서 타입 정의) 파일을 읽고 그것들을 정확히 해석할 필요 없이, XML 스키마에서 데이터를 추정할 수 있게 한다(고울리, 2014).


그러면 DOM(Document Object Model) 형태로 기존의 XML 문서를 구문 분석(Parsing)하는 까닭은 사용자에게 유의미한 데이터를 제공해서만일까? 문서 전체의 데이터를 쪼개어 객체화시킴으로써 DOM은 다음과 같은 특징을 가진다.


XML 문서를 구조화함.

XML 데이터 접근이 편리함.

XML 데이터 생성과 편집에 유리함.

메모리 사용률이 높은 편임.

파싱 속도가 느림.


XML의 제자 격이 W3C이라는 것을 알고, 다음의 자바 소스는 유닛 테스트를 이용해서 구문 분석(Parsing)을 가능하게 만든 코드다. 이후 세션 편에서는 Python 언어로 HTML 웹 페이지를 파싱 하는 방법과 웹 스크랩을 하는 과정을 살펴보겠다.

junit lIbrary를 통한 파싱 테스팅. 해당 노드의 태그 값이 없어서 Error가 발생했다.




* 페이로드(payload) : 압축(Encription)된 상위 데이터의 내용을 payload라고 부르기도 하나, 컴퓨터 보안에서는 페이로드를 또한 멀웨어(Malware, 악성코드)의 일부를 뜻한다. 웜, 바이러스, 트로이목마 같은 해로운 소프트웨어를 분석할 때 페이로드는 그 소프트웨어가 주는 피해를 뜻한다. 예를 들어 페이로드에는 데이터 훼손, 스팸메일, 개인정보를 알아내기 위해 다수에게 보내는 이메일 등이 있다. 즉 페이로드는 전송 행위의 본래 의도를 뜻함. 하지만, KISA에서 주관하는 정보보안기사에서 말하는 네트워크 분야의 OSI개념 모델의 각 계층에서 부르는 페이로드는 전자의 설명과 같이 사용에 있어서 전송되는 상위 계층의 데이터를 뜻하기도 한다. 이때 페이로드는 전송의 근본적인 목적이 되는 데이터의 일부분으로 그 데이터와 함께 전송되는 현재 속한 계층의 헤더와 메타데이터와 같은 데이터는 제외한다.


** 마크업(Markup) : 마크업을 구성하는 문자열은 문자 <로 시작하여 문자 >로 끝나거나, 문자

&로 시작하여 문자 ;로 끝나며, 마크업이 아닌 문자열은 내용. Retrived from https://ko.wikipedia.org/wiki/XML


*** SOAP(Simple Object Access Protocol) : 일반적으로 널리 알려진 HTTP, HTTPS, SMTP 등을 통해 XML 기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 프로토콜. Retrieved from https://ko.wikipedia.org/wiki/SOAP


** 더 자세한 정보는, https://www.w3.org/TR/soap12-part1/를 참고하라. (HTTP 완벽 가이드의 옮긴이) 현대 웹 서비스의 데이터 교환 방식은 SOAP보다 REST 방식을 더 많이 쓰며, 데이터의 포맷도 XML보다는 JSON을 주로 사용한다.





참조

1) Gourley, D., & Totty, B. (2002). HTTP: The definitive guide. Beijing: OReilly. 한국어판 HTTP 완벽 가이드(2002년도 초판을 2014년에 번역 및 재출간한 판임. 그런데 이를 번역한 한국의 한 IT 대기업에서 종사하시는 분들이 혹시 이 주석을 보시면, 아마 원작에서 나온 'building block'이라는 용어를 직역으로 '빌딩 블록'이 아니라 "필수 구성 요소"라고 의역해야 했다는 것을 참조하셨으면 한다.)

매거진의 이전글나의 Java 매뉴얼