본문 바로가기

XML 유효성 검사

짝이 맞지 않는 태그, 정의되지 않은 엔티티, 깨진 네임스페이스를 브라우저 자체의 XML 파서로 찾아 정확한 위치까지 알려 드립니다. 아무것도 저장하지 않습니다.

  • 저장되지 않음
  • 대기열 없음, 기다림 없음
  • 회원가입 없음, 워터마크 없음
정렬 결과

XML을 붙여 넣으면 입력하는 대로 검사해요.

사용 방법

1

XML 붙여넣기

또는 파일을 끌어다 놓으세요. 어디로도 전송되지 않습니다.

2

결과 확인

올바른 형식이면 안에 담긴 내용의 요약과 함께, 아니면 첫 번째 문제의 정확한 줄과 열을 알려 드립니다.

3

고치고 다시 검사

그 자리에서 수정하면 입력하는 대로 결과가 갱신됩니다.

서로 다른 두 가지 기준, 그리고 이 도구가 확인하는 것

XML에는 두 단계의 올바름이 정의되어 있으며, 둘은 흔히 혼동됩니다. 올바른 형식(well-formed)은 문서가 XML 자체의 문법을 지킨다는 뜻입니다. 루트 요소가 하나이고, 모든 태그가 닫혀 있고, 중첩이 올바르며, 허용되는 문자만 쓰였고, 앰퍼샌드와 꺾쇠괄호가 제대로 이스케이프되었고, 속성 값에 따옴표가 있고, 한 요소 안의 속성 이름이 중복되지 않는 것입니다. 유효함(valid)은 그보다 강한 의미로, 문서가 특정 스키마와도 일치해 올바른 요소가 올바른 순서로 올바른 종류의 값을 담고 있다는 뜻입니다. 이 페이지는 앞의 것을 확인합니다. 모든 XML 파서는 이 기준을 통과하지 못한 문서를 거부하므로, 파일을 애초에 읽을 수 있는지를 결정하는 검사입니다.

실패 원인은 뻔합니다. 이스케이프되지 않은 &가 단연 가장 흔합니다. &는 엔티티 참조의 시작이므로, 쿼리 문자열이 있는 URL을 요소 안에 그대로 붙여 넣으면 문서가 깨집니다. 텍스트 안의 <도 마찬가지입니다. 그다음은 짝이 맞지 않거나 닫히지 않은 태그, 잘못된 순서로 닫힌 요소, 두 개의 루트 요소, 그리고 파일 안에 보이지 않게 숨어 있지만 XML이 아예 허용하지 않는 제어 문자입니다.

DTD나 스키마는 의도적으로 절대 가져오지 않으며, 이는 빠진 기능이 아니라 보안상의 특성입니다. XML 문서는 외부 엔티티를 지정할 수 있고, 이를 해석하는 파서는 그것이 가리키는 대상, 즉 디스크의 파일이나 내부 네트워크의 주소를 실제로 가져옵니다. 이것이 XML 외부 엔티티(XXE) 취약점이며, 가장 많이 악용되는 버그 유형 중 하나입니다. 완전한 방어는 외부 엔티티를 해석하지 않는 것뿐입니다. 그래서 여기서는 어떤 곳에도 접속하지 않으며, 그 대가로 스키마 검증은 범위에서 제외됩니다.

결과로는 파싱이 멈춘 정확한 줄과 열을 알려 드립니다. 다른 파서와 마찬가지로 그 위치는 실수한 곳이 아니라 문서가 말이 안 되기 시작한 지점입니다. 닫히지 않은 태그는 보통 그 뒤에 나오는 예상치 못한 닫는 태그에서 보고되며, 때로는 수백 줄 뒤일 수도 있습니다. 보고된 위치는 고칠 곳이 아니라 거기서부터 위로 거슬러 올라가며 찾아볼 출발점입니다.

다른 작업이 필요할 때

스키마 기준으로 검증하려면 xmllint가 표준 도구입니다. XSD는 xmllint --noout --schema schema.xsd file.xml, RELAX NG는 --relaxng, DTD는 --noout --valid를 씁니다. 첫 번째 오류에서 멈추지 않고 모든 위반을 보고하므로, 문서가 단순히 깨진 것이 아니라 내용이 정말 잘못되었을 때 원하는 결과를 줍니다.

신뢰할 수 없는 입력을 다룬다면 검사기보다 파서 설정이 더 중요합니다. 사용하는 언어에서 외부 엔티티 해석과 DTD 처리를 명시적으로 끄세요. Python에서는 defusedxml, PHP에서는 LIBXML_NONET, Java에서는 보안 처리(secure processing)를 씁니다. 여러 인기 파서가 여전히 기본값으로 엔티티를 해석하며, 취약점은 바로 그 기본값에 있습니다.

자주 묻는 질문

제 XML이 어딘가에 저장되나요?

아니요. 서버 호출도, 로그 기록도 없으며 아무것도 저장하지 않습니다. 페이지를 불러온 뒤 인터넷 연결을 끊어도 계속 작동합니다. 이 점은 생각보다 중요합니다. 사람들이 온라인 포맷터에 붙여 넣는 것은 API 응답, 설정 파일, 오류 페이로드이며, 여기에는 토큰, 고객 기록, 내부 호스트 이름이 흔히 들어 있습니다.

“올바른 형식(well-formed)”이란 무슨 뜻인가요?

문서가 XML 자체의 규칙을 지킨다는 뜻입니다. 모든 태그가 닫혀 있고, 태그가 올바른 순서로 중첩되어 있고, 루트 요소가 정확히 하나이며, 속성에 따옴표가 있고, 모든 &와 <가 이스케이프되었거나 올바른 엔티티의 일부인 것입니다. 이는 XML에 대해 물을 수 있는 두 가지 질문 중 첫 번째입니다. 두 번째 질문, 즉 문서가 특정 스키마와 일치하는지는 별개이며 이 페이지는 답하지 않습니다.

DTD나 XSD 스키마로 검증하나요?

아니요. 이 도구는 문서가 올바른 형식의 XML인지 확인하며, 대부분의 사람이 실제로 겪는 문제가 이것입니다. 스키마 검증에는 스키마 파일과 검증 파서가 필요한데, 이를 탑재한 브라우저는 없습니다. 여기서 된다고 주장하려면 문서를 서버로 보내거나, 조용히 검사하지 않는 수밖에 없습니다. 이 구분은 알아 둘 가치가 있습니다. 문서가 완벽하게 올바른 형식이어도 스키마 기준으로는 틀릴 수 있습니다.

가장 흔한 XML 오류는 무엇인가요?

이스케이프되지 않은 앰퍼샌드가 가장 흔합니다. &는 URL 안에서도 &amp;로 써야 하므로, 쿼리 문자열을 요소 안에 그대로 붙여 넣으면 문서가 깨집니다. 그다음은 잘못된 순서로 닫힌 태그, 두 개의 루트 요소, &nbsp;처럼 정의되지 않은 엔티티(HTML에는 정의되어 있지만 XML에는 없음), 선언 없이 쓴 네임스페이스 접두사입니다. 각 오류를 이름과 위치까지 알려 드립니다.

HTML은 유효한 XML인가요?

대개 아니며, 이는 실수가 아니라 정상입니다. HTML은 <br>, <li> 같은 닫히지 않은 태그, 따옴표 없는 속성, 이스케이프되지 않은 앰퍼샌드를 허용하지만, XML은 이 중 어느 것도 허용하지 않습니다. XML로도 유효한 HTML이 필요하다면 그것이 XHTML이며, 모든 태그를 닫아야 합니다.

용량 제한이 있나요?

저희가 정한 한도가 아니라 사용 가능한 메모리가 한계입니다. 몇 MB짜리 문서는 즉시 처리되며, 매우 큰 문서는 저희 쪽의 어떤 제한이 아니라 한 번에 메모리에 담을 수 있는 양에 따라 제한됩니다.

참고: 스키마 검증이 아니라 올바른 형식(well-formedness)을 확인합니다. 태그의 짝, 올바른 중첩, 허용되는 문자를 검사하고, 첫 번째 문제가 있는 정확한 줄과 열을 알려 드립니다. DTD나 XSD로 검증하려면 그 파일을 가져와야 하는데, 이는 이 페이지가 의도적으로 절대 하지 않는 네트워크 요청입니다.

내 웹사이트에 이 도구 넣기

블로그, 수업 페이지, 도움말 글 어디에나 무료로 넣을 수 있습니다. 코드 한 줄만 붙여 넣으면 방문자가 페이지에서 바로 사용할 수 있습니다.