[java] Apache XML Security 라이브러리와 XML 서명 보안 검사

소개

XML 서명은 XML 문서의 무결성과 인증을 검증하는 데 사용됩니다. Apache XML Security 라이브러리는 Java용 XML 보안 및 디지털 서명 라이브러리로, 여러 가지 XML 보안 표준을 지원합니다.

이 블로그 포스트에서는 Apache XML Security 라이브러리를 사용하여 XML 서명을 만들고 유효성을 검사하는 방법에 대해 살펴보겠습니다.

Apache XML Security 라이브러리 추가

Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가하여 Apache XML Security 라이브러리를 프로젝트에 추가할 수 있습니다.

<dependency>
    <groupId>org.apache.santuario</groupId>
    <artifactId>xmlsec</artifactId>
    <version>2.2.1</version>
</dependency>

Gradle을 사용하는 경우, build.gradle 파일에 다음과 같이 추가할 수 있습니다.

implementation group: 'org.apache.santuario', name: 'xmlsec', version: '2.2.1'

의존성을 추가한 후 프로젝트를 다시 빌드하여 라이브러리를 사용할 수 있습니다.

XML 서명 생성

Apache XML Security 라이브러리를 사용하여 XML 서명을 생성하는 방법은 다음과 같습니다.

import org.apache.xml.security.Init;
import org.apache.xml.security.exceptions.XMLSecurityException;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.transforms.Transforms;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;

// 초기화
Init.init();

// XML 문서 불러오기
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document = documentBuilderFactory.newDocumentBuilder().parse("input.xml");

// 서명 생성
XMLSignature signature = new XMLSignature(document, "", XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256);
Transforms transforms = new Transforms(document);
signature.addDocument("", transforms, "http://www.w3.org/2000/09/xmldsig#enveloped-signature");

// 서명 키 쌍 설정
KeyPair keyPair = getKeyPair(); // 서명용 키 쌍 생성 메서드
signature.addKeyInfo(keyPair.getPublic());

// 서명 생성
signature.sign(keyPair.getPrivate());

// 서명 결과
signature.getElement().normalize();
System.out.println("서명된 XML: " + signature.getElement());

XML 서명 유효성 검사

Apache XML Security 라이브러리를 사용하여 서명된 XML의 유효성을 검사하는 방법은 다음과 같습니다.

import org.apache.xml.security.Init;
import org.apache.xml.security.exceptions.XMLSecurityException;
import org.apache.xml.security.signature.XMLSignature;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;

// 초기화
Init.init();

// 서명된 XML 문서 불러오기
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document = documentBuilderFactory.newDocumentBuilder().parse("signed.xml");

// 서명 유효성 검사
NodeList signatures = document.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (signatures.getLength() == 0) {
    throw new RuntimeException("서명된 XML에 서명이 없습니다.");
}

XMLSignature signature = new XMLSignature((Element) signatures.item(0), "");

if (!signature.checkSignature(keyPair.getPublic())) {
    throw new RuntimeException("서명이 유효하지 않습니다.");
}

System.out.println("서명이 유효합니다.");

결론

Apache XML Security 라이브러리를 사용하면 Java 애플리케이션에서 XML 서명을 생성하고 검증할 수 있습니다. 이를 통해 XML 문서의 보안을 보장하고 무결성을 유지할 수 있습니다.

참고: Apache XML Security - 공식 웹사이트