XML 서명
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
XML 서명은 `http://www.w3.org/2000/09/xmldsig#` 네임스페이스를 기반으로 하는 `Signature` 요소를 사용하여 XML 문서의 무결성을 보장하는 기술이다. 주요 구성 요소로는 서명된 데이터를 포함하거나 참조하는 `SignedInfo`, 서명 값을 담는 `SignatureValue`, 서명 검증에 필요한 키 정보를 제공하는 `KeyInfo`, 선택적으로 서명된 데이터를 포함하는 `Object` 요소가 있다. XML 서명은 서명 대상 데이터와의 관계에 따라 detached, enveloped, enveloping의 세 가지 유형으로 나뉘며, 검증 과정은 참조 검증과 서명 검증으로 구성된다. XML 정규화는 XML 문서의 논리적 표현을 표준화하여 서명의 무결성을 보장하며, 복잡성, 성능 저하 등의 문제로 비판을 받기도 한다. 다양한 분야에서 활용되며, 네덜란드의 감사 등에서 디지털 서명에 사용된다.
더 읽어볼만한 페이지
- 암호 표준 - 신뢰 플랫폼 모듈
신뢰 플랫폼 모듈(TPM)은 신뢰 컴퓨팅 그룹(TCG)에서 구상한 보안 장치로, 하드웨어 난수 생성, 암호 키 안전 생성, 원격 증명, 바인딩, 밀봉된 저장소 등의 기능을 제공하여 플랫폼 무결성 보장, 디스크 암호화, 디지털 권한 관리(DRM) 등 다양한 분야에 활용되며 여러 유형으로 구현되고 있다. - 암호 표준 - XML 암호화
XML 암호화는 XML 문서의 일부 또는 전체를 암호화하는 기술로, `EncryptedData` 또는 `EncryptedKey` 요소를 사용하여 데이터를 암호화하고 `KeyInfo` 요소로 키 정보를 제공하며, 저장되거나 전송되는 데이터 자체를 보호하기 위해 개발되었고 보안 강화를 위해 1.1 버전에서는 갈루아/카운터 모드 블록 암호 알고리즘이 추가되었다. - XML 기반 표준 - XAML
XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다. - XML 기반 표준 - 아톰 (표준)
Atom은 웹 사이트 업데이트 정보와 콘텐츠 배포를 위한 XML 기반 문서 형식으로, Atom 배포 형식과 Atom 출판 프로토콜로 구성되어 있으며, RSS를 대체하기 위해 고안되었고 국제화 지원 및 모듈성에서 차이를 보인다.
XML 서명 | |
---|---|
개요 | |
유형 | 디지털 서명 |
표준 | XML RFC 3275 W3C 권고 |
개발 | W3C |
상세 정보 | |
목적 | 디지털 서명을 위한 XML 구문 |
특징 | 데이터 무결성 보장 인증 부인 방지 |
서명 유형 | 둘러싸는 서명 (Enveloping Signature) 둘러싸인 서명 (Enveloped Signature) 분리된 서명 (Detached Signature) |
암호화 알고리즘 | 다양한 암호화 알고리즘 지원 (예: RSA, DSA, SHA-1, SHA-256) |
표준 준수 | W3C XML Signature Syntax and Processing RFC 3275 |
활용 분야 | 전자 상거래 전자 정부 문서 보안 |
관련 기술 | |
관련 기술 | XML Encryption XML Key Management Specification (XKMS) SOAP 웹 서비스 보안 (WS-Security) |
참고 자료 | |
참고 자료 | XML Signature Syntax and Processing Version 1.1 |
2. 구조
XML 서명은 http://www.w3.org/2000/09/xmldsig#
네임스페이스에 정의된 Signature
요소를 최상위 요소로 사용한다. 이 Signature
요소는 서명된 정보와 실제 서명 값, 그리고 서명 검증에 필요한 키 정보 등을 담는 컨테이너 역할을 한다. 주요 구성 요소로는 서명 대상과 사용된 알고리즘 정보를 포함하는 SignedInfo
, 실제 서명 값을 담는 SignatureValue
, 그리고 선택적으로 키 정보(KeyInfo
)나 서명 대상 데이터 자체(Object
)를 포함할 수 있다. 각 요소의 구체적인 역할과 구조는 하위 섹션에서 자세히 설명한다.
2. 1. 기본 구조
```
각 요소의 역할은 다음과 같다.
- `'SignedInfo'`: 서명 대상이 되는 데이터에 대한 정보와 서명 생성 및 검증에 사용된 알고리즘을 명시한다. 이 요소 자체도 서명되어 변조되지 않았음을 보장한다.
- `'CanonicalizationMethod'`: `'SignedInfo'` 요소를 서명하거나 검증하기 전에 일관된 형태로 변환하는 XML 정규화 방법을 지정한다.
- `'SignatureMethod'`: 서명을 생성하고 검증하는 데 사용될 알고리즘(예: RSA-SHA256)을 지정한다.
- `'Reference'`: 서명할 리소스를 지정한다. URI를 통해 외부 리소스를 참조하거나, ID를 통해 문서 내부의 특정 요소를 참조할 수 있다. 하나 이상의 `'Reference'` 요소가 포함될 수 있다.
- `'Transforms'`: 서명 대상 리소스에 적용할 변환 과정을 지정한다. 예를 들어, 특정 부분만 서명하기 위해 XPath를 사용하거나, XML 정규화를 적용할 수 있다.[3]
- `'DigestMethod'`: 리소스의 해시 값을 계산하는 데 사용할 알고리즘(예: SHA-256)을 지정한다.
- `'DigestValue'`: 지정된 변환(`'Transforms'`)을 거친 리소스에 대해 `'DigestMethod'`로 지정된 알고리즘을 사용하여 계산한 해시 값이다. 이 값은 Base64로 인코딩되어 저장된다.
- `'SignatureValue'`: `'SignedInfo'` 요소를 `'CanonicalizationMethod'`에 명시된 방법으로 정규화한 후, `'SignatureMethod'`에 지정된 알고리즘과 키를 사용하여 생성한 실제 디지털 서명 값이다. 이 값도 Base64로 인코딩된다.
- `'KeyInfo'` (선택 사항): 서명을 검증하는 데 필요한 공개 키 정보를 포함한다. 주로 X.509 디지털 인증서나 공개 키 값 자체를 담는다. 이 요소가 생략되면, 서명 검증자는 다른 경로를 통해 필요한 키 정보를 획득해야 한다.
- `'Object'` (선택 사항): 서명할 데이터를 XML 서명 문서 내부에 직접 포함시키는 경우(이를 '봉투 서명', enveloping signature라고 한다) 사용된다. 서명 대상 데이터를 담는 컨테이너 역할을 한다.
2. 2. 각 요소 설명
각 요소의 역할은 다음과 같다.
'''SignedInfo'''
: 서명 대상이 되는 정보와 서명 생성 및 검증에 사용된 알고리즘을 포함한다. 이 요소 자체는 변조되지 않도록 보호된다.CanonicalizationMethod
: 서명 생성 전에SignedInfo
요소를 정규화하는 방법을 지정한다. (자세한 내용은 XML 정규화 참조)SignatureMethod
: 서명을 생성하고 검증하는 데 사용되는 알고리즘을 지정한다.Reference
: 서명할 대상을 지정하는 하나 이상의 요소이다. 각Reference
요소는 다음 하위 요소를 포함할 수 있다.Transforms
(선택 사항): 서명 대상 데이터에 적용할 변환(예: XPath 필터링, 정규화) 목록을 지정한다.[3]DigestMethod
: 서명 대상 데이터의 해시 값을 계산하는 데 사용할 알고리즘(예: SHA-256)을 지정한다.DigestValue
: 계산된 해시 값을 Base64로 인코딩하여 포함한다.
'''SignatureValue'''
:SignedInfo
요소 전체를CanonicalizationMethod
에 지정된 방식으로 정규화하고,SignatureMethod
에 지정된 알고리즘과 키를 사용하여 생성한 디지털 서명 값을 Base64로 인코딩하여 포함한다.
'''KeyInfo'''
(선택 사항): 서명을 검증하는 데 필요한 공개키 정보를 포함한다. 이 정보는 X.509 인증서, 키 이름, 또는 키 검색 정보 등의 형태로 제공될 수 있다. 만약KeyInfo
요소가 없다면, 서명 수신자는 다른 방법(예: 미리 약속된 키)을 통해 검증 키를 확보해야 한다.
'''Object'''
(선택 사항): 서명할 데이터를 XML 서명 내부에 직접 포함할 때 사용된다. 이러한 방식을 'Enveloping 서명'이라고 부른다.
3. 서명 유형
XML 서명은 임의의 종류의 자원(전형적으로 XML 문서)에 서명하기 위해 사용된다. 서명과 서명 대상 데이터의 관계에 따라 다음과 같은 세 가지 유형으로 나눌 수 있다.
;detachedeng 서명
: 서명을 포함하는 XML 문서 밖의 리소스에 사용되는 서명이다.
;envelopedeng 서명
: 서명을 포함하는 XML 문서의 일부분에 사용되는 서명이다.
;envelopingeng 서명
: 자기 안에 서명하는 데이터를 포함하는 서명이다.
3. 1. Detached 서명
detached|디태치드영어 서명은 서명을 포함하는 XML 문서 밖의 리소스에 사용되는 서명이다.3. 2. Enveloped 서명
Enveloped 서명은 서명 정보가 담긴 XML 요소가, 서명 대상이 되는 데이터가 포함된 원래의 XML 문서 내부에 포함되는 방식의 서명이다. 즉, 서명 자체가 서명 대상 문서의 일부가 되는 형태를 말한다.3. 3. Enveloping 서명
enveloping|인벨로핑eng 서명은 자기 안에 서명하는 데이터를 포함하는 서명을 의미한다.4. 검증 및 보안 고려 사항
XML 서명을 검증할 때는 핵심 검증 절차를 따른다. 이 절차는 각 ''Reference''의 유효성을 확인하는 참조 검증과 ''SignedInfo'' 자체를 검증하는 서명 검증의 두 단계로 구성된다.[14][15]
이 핵심 검증 절차는 리소스가 주장하는 주체에 의해 실제로 서명되었는지 확인하는 데 목적이 있다. 그러나 검증 과정에서는 사용된 알고리즘이 원본 데이터의 의미를 변경하지 않았는지 신뢰성을 확인하고, "서명 래핑(signature wrapping)" 공격과 같은 보안 위협에 대비하여 문서 구조를 신중히 검토해야 한다.[10] 이를 위해 XPath 절대 경로를 사용하는 것이 권장된다.[10]
4. 1. 참조 검증
각 ''Reference'' 요소의 다이제스트 값은 관련 리소스를 가져와, 지정된 모든 변환을 적용하고, 지정된 다이제스트 알고리즘을 적용하여 검증된다.[14] 계산된 결과는 ''DigestValue''에 기록된 값과 비교하며, 두 값이 일치하지 않으면 검증은 실패한 것으로 간주된다.4. 2. 서명 검증
XML 서명을 검증할 때는 '''핵심 검증'''(Core Validation|코어 벨리데이션영어)이라는 절차를 따른다. 이 절차는 두 단계로 이루어진다.# '''참조 검증'''[14]: 각 'Reference' 요소에 포함된 다이제스트 값('DigestValue')을 검증하는 단계이다. 먼저 해당 리소스를 가져와 명시된 변환(transform)을 적용한다. 그 후, 지정된 다이제스트 방식(digest method)을 적용하여 계산한 결과와 기록된 'DigestValue'를 비교한다. 두 값이 일치하지 않으면 검증은 실패한다.
# '''서명 검증'''[15]: 'SignedInfo' 요소 자체의 서명을 검증하는 단계이다. 'SignedInfo' 요소는 'CanonicalizationMethod'에 지정된 정규화(canonicalization) 방법을 사용하여 직렬화된다. 그런 다음 'KeyInfo' 요소나 다른 수단을 통해 얻은 키(key) 데이터와 'SignatureMethod'에 지정된 알고리즘을 사용하여 서명이 유효한지 검증한다.
이 핵심 검증 절차는 해당 리소스가 주장하는 주체에 의해 실제로 서명되었는지 확인하는 데 목적이 있다. 그러나 검증 과정에서 사용되는 정규화 및 변환 방법은 확장될 수 있으므로, 검증하는 측에서는 실제로 서명되거나 다이제스트된 내용이 원본 데이터의 의미를 그대로 유지하는지 추가로 확인할 필요가 있다. 즉, 사용된 알고리즘이 데이터의 본질적인 의미를 변경하지 않았는지 신뢰할 수 있어야 한다.
또한, 서명된 XML 문서의 구조가 악의적으로 조작되어 "서명 래핑(signature wrapping)" 공격에 악용될 가능성이 있다. 따라서 검증 과정에서는 XML 문서의 구조 자체도 주의 깊게 다루어야 한다. 예를 들어, 서명된 요소나 서명 관련 요소를 찾을 때는 단순히 이름으로 검색하는 방식('getElementByName' 등) 대신, 절대 경로를 사용하는 XPath 표현식을 사용하는 것이 권장된다.[10]
4. 3. 보안 취약점
XML 서명을 검증하는 과정에서 보안 취약점이 발생할 수 있다. 정규화 및 변환 방법이 확장 가능하기 때문에, 검증하는 측에서는 실제로 서명되거나 해시 계산된 내용이 원본 데이터와 동일한지, 즉 사용된 알고리즘이 서명된 데이터의 의미를 변경하지 않았는지 신뢰할 수 있는지 확인해야 한다.또한, 서명된 문서의 구조가 서명 래핑(Signature Wrapping) 공격에 악용될 수 있도록 조작될 가능성이 있다. 이러한 공격을 방지하기 위해 검증 프로세스는 XML 문서의 구조까지 신중하게 검토해야 한다. 구체적으로, 서명된 요소와 서명 요소를 선택할 때 `
getElementByName
`과 같은 이름 기반 메서드 대신 절대 XPath 표현식을 사용하는 것이 권장된다.[10]5. XML 정규화 (Canonicalization)
XML 서명 생성은 일반적인 디지털 서명 생성 과정보다 복잡하다. 이는 하나의 정보 집합으로 표현되는 특정 XML 문서[16]가 문법적으로는 동일하지만 여러 방식으로 직렬화될 수 있기 때문이다. 예를 들어, XML 요소 태그 내의 공백 유무(<Elem >
와 <Elem>
)는 구문적으로 동일하게 취급된다.
디지털 서명은 직렬화된 데이터의 무결성을 보장하기 위해 사용되며, 데이터에서 단 1바이트만 달라져도 서명 값 자체가 완전히 달라진다. 디지털 서명은 직렬화된 XML 문서에 암호학적 해시 함수[17]를 적용한 결과에 비대칭 키 알고리즘[18]을 사용하여 생성된다. XML 문서는 컴퓨터 간 전송 과정에서 줄 바꿈 문자가 변경되거나(예: CR, LF, CR LF), 처리 프로그램에 따라 공백 추가, URL 형식 변경(상대/절대), XML 네임스페이스 정의 순서 변경 등 다양한 방식으로 표현될 수 있다. 특히 원격 문서를 참조하는 경우, 서버 상태에 따라 문서 표현이 달라질 수 있어 문제가 될 수 있다.
이러한 문제를 해결하고 논리적으로 동일한 XML 문서가 항상 동일한 디지털 서명 값을 갖도록 보장하기 위해 XML 표준화 변환 (종종 '''C14n'''으로 축약됨) 과정이 사용된다. 이 과정은 XML 문서를 서명할 때 거의 필수적으로 수행되며, 특히 `SignedInfo` 요소에 서명할 때는 반드시 필요하다. XML 정규화 알고리즘은 의미적으로 동일한 문서들이 항상 정확히 동일한 직렬화된 표현을 갖도록 보장한다.
하지만 기본적인 정규화 알고리즘은 XML 네임스페이스 선언을 처리하는 방식에서 또 다른 복잡성을 야기한다. 서명된 XML 문서를 다른 XML 문서 내부에 삽입하는 경우가 많은데, 이때 기본 정규화 방식으로는 원래 문서만 단독으로 처리했을 때와 다른 결과가 나올 수 있다. 이러한 문제를 해결하기 위해 배타적 정규화(Exclusive Canonicalization|배타적 캐노니컬라이제이션eng)[19] 방식이 개발되었다. 이 방식은 주변 XML 문서의 내용과 관계없이 XML 네임스페이스 선언을 독립적으로 처리하여 일관된 정규화 결과를 보장한다.
6. 비판
XML 보안 아키텍처 전반[4], 특히 XML 정규화는 복잡성, 내재된 처리 요구 사항 및 성능 저하로 인해 XML 데이터의 서명 및 암호화 역할에 적합하지 않다는 비판이 제기된다.[5][6][7] XML 정규화를 수행하면 거래나 성능에 민감한 SOA 애플리케이션에서 과도한 지연이 발생하여 극복하기 어렵다는 주장이다.
또한, 적절한 정책과 구현이 없다면[10] SOAP 및 WS-Security에서 XML 서명(XML Dsig)을 사용할 때 XML 서명 래핑과 같은 취약점이 발생할 수 있다.[11][12]
이러한 문제들은 [http://www.w3.org/2008/xmlsec/ XML 보안 작업 그룹]에서 해결하기 위해 노력하고 있다.[8][9]
7. 응용 분야
XML 서명은 다양한 분야에서 활용될 수 있으며, 그 예시는 다음과 같다.
참조
[1]
웹사이트
XML Signature Syntax and Processing Version 1.1
https://www.w3.org/T[...]
[2]
웹사이트
XML Signature Syntax and Processing Version 1.1
https://www.w3.org/T[...]
[3]
문서
XML-Signature XPath Filter 2.0
http://www.w3.org/TR[...]
[4]
웹사이트
Why XML Security is Broken
https://www.cs.auckl[...]
[5]
문서
Performance of Web Services Security
http://grids.ucs.ind[...]
[6]
문서
Performance Comparison of Security Mechanisms for Grid Services
http://www.extreme.i[...]
[7]
웹사이트
Accelerate WSS applications with VTD-XML
https://www.infoworl[...]
2007-01-09
[8]
문서
W3C Workshop on Next Steps for XML Signature and XML Encryption
http://www.w3.org/20[...]
2007
[9]
웹사이트
XML Security 2.0 Requirements and Design Considerations
http://www.w3.org/TR[...]
[10]
웹사이트
Secure SAML validation to prevent XML signature wrapping attacks
http://ipsec.pl/node[...]
[11]
웹사이트
XML Signature Element Wrapping Attacks and Countermeasures
http://domino.resear[...]
IBM Research Division
2023-09-07
[12]
웹사이트
On Breaking SAML: Be Whoever You Want to Be
https://www.usenix.o[...]
[13]
웹사이트
SBR Assurance
https://www.sbr-nl.n[...]
2023-09-07
[14]
문서
Reference Validation
[15]
문서
Signature Validation
[16]
문서
XML開発者の間では一般に「Infoset」と呼ぶ。
[17]
문서
一般的にはSHA-1
[18]
문서
一般的にはRSA
[19]
문서
Exclusive Canonicalization
[20]
웹인용
XML Signature Syntax and Processing Version 1.1
https://www.w3.org/T[...]
[21]
웹인용
XML Signature Syntax and Processing Version 1.1
https://www.w3.org/T[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com