Metro 1.3으로 첨부 파일 보호

Java EE 2008/10/13 10:26 Posted by Sun

Metro는 확장 가능하고 손쉽게 사용할 수 있는 고성능의 웹 서비스 스택으로서 JAX-WS 참조 구현과 Project Tango를 결합한 것입니다. 웹 서비스 상호 운용 기술 또는 WSIT라고도 하는 Project Tango는 다른 구현과의 호환을 지원하고 보안, 신뢰성 및 트랜잭션 지원과 같은 서비스 품질(QOS)을 제공하기 위해 수많은 WS-* 표준을 구현합니다. Metro는 개방형 소스인 엔터프라이즈급 GlassFish v2 애플리케이션 서버와 모듈식 GlassFish v3 애플리케이션 서버에서 사용할 수 있습니다. Tomcat 웹 컨테이너에서도 실행됩니다. 뿐만 아니라 다른 애플리케이션 서버에서도 성공적으로 사용되어 왔습니다.

Metro 1.3은 최근에 출시되었습니다. 이제 이 Metro 1.3에서 구현하는 주요 WS-* 규격 모두에 대해 OASIS 규격 버전을 지원합니다. 이전 버전의 Metro에서는 이러한 규격에 대해 OASIS 제출 버전을 지원했었습니다. 따라서 이제 Metro는 OASIS 규격 버전을 지원하는 Microsoft .NET Framework 3.5와 상호 운용이 가능합니다. 이전 버전의 Metro는 Microsoft .NET Framework 3.0과 상호 운용할 수 있었습니다. Metro는 .NET 버전과의 상호 운용성에 대한 테스트를 거쳤고 이를 기본 출시 기준으로 삼았습니다. Metro에서 지원되는 전체 규격 목록 및 지원되는 버전은 Metro 사용자 설명서의 Metro 규격 절을 참조하십시오.

OASIS의 WS-SecurityPolicy v1.2 규격에 는 이제 SwA(SOAP Messages with Attachments) 첨부 파일 무결성과 기밀 보호에 대한 어설션이 포함됩니다. 이 어설션은 Metro 1.3에서도 지원되는 기능입니다. 이 팁에서는 Metro 1.3 및 NetBeans IDE 6.5(현재 베타버전으로 사용 가능)를 사용하여 SwA 첨부 파일을 보호하는 방법을 살펴보겠습니다. Metro 1.3 버전의 새 기능은 웹 서비스 플러그인을 통해 NetBeans IDE 6.5에서 사용할 수 있습니다.

이 팁과 함께 샘플 애플리케이션 패키지도 제공됩니다. 샘플 애플리케이션은 Metro 1.3을 사용하여 SwA 첨부 파일을 안전하게 교환하는 웹 서비스 및 클라이언트를 보여 줍니다.

Metro 보안의 다른 부분에 대해 알고 싶다면 2008년 3월 테크팁 Metro를 이용한 웹 서비스용 보안 대화 및 2007년 3월 테크팁 WSIT를 사용하여 웹 서비스 보호하기를 참조하십시오.

SwA와 보안의 예

첨부 파일 보호와 관련된 내용은 WSS:SwA 프로파일 사양에 설명되어 있습니다. SwA를 사용하여 OASIS 웹 서비스 보안: SOAP 메시지 보안 사양을 사용하는 방법에 대해 설명합니다. 보충하여 설명하자면, WSS:SwA 프로파일 사양에서는 웹 서비스 소비자가 첨부 파일 무결성, 기밀 보호, 출처 인증을 위해 SOAP 메시지 보안 기능을 사용하여 SOAP 첨부 파일을 보호하는 방법과 받는 사람이 그러한 메시지를 어떻게 처리할 수 있는지 설명합니다. SwA는 SOAP 메시지에 첨부된 패키징 첨부 파일에 대해 여러 부분으로 이루어진 MIME 구조를 정의합니다. 이 구조는 루트 부분에 기본 SOAP Envelope이 있고 MIME 부분에 첨부 파일이 하나 이상 포함된 구조입니다. 이러한 첨부 파일 중 일부에는 XML에 해당하는 콘텐츠 형식은 있지만 처리해야 할 기본 SOAP Envelope은 없을 수 있습니다. WSS:SwA 사양은 모든 첨부 파일을 불명료하다고 간주합니다. 즉, 첨부 파일이 XML이든 또는 다른 콘텐츠 형식이든 관계없이 모두 임의 바이너리 데이터로 간주합니다.

다음은 여러 부분으로 이루어진 MIME SOAP 메시지의 예입니다. 이 예에서는 첨부 파일의 무결성이 서명을 통해 보호됩니다. 참조를 위해 행 번호를 추가했습니다.

    1 --uuid:be998ab6-f21a-4ae7-9436-fac806d24efa
    2 Content-Type: text/xml
    3
    4 <?xml version='1.0' encoding='UTF-8'?>"
    5 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
    6 xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    7  xmlns:exc14n="http://www.w3.org/2001/10/xml-exc-c14n#"
    8  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    9 xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   10 <S:Header>
   11 .
   12 .
   13 <wsse:Security S:mustUnderstand="1">
   14.
   15.
   16 <ds:Signature Id="_1">
   17 <ds:SignedInfo>
   18 .
   19 .
   20 <ds:Reference URI="cid:9e0f3a51-dcfe-48f4-806f-70a9c8c3a482@example.jaxws.sun.com">
   21 <ds:Transforms>
   22 <ds:Transform Algorithm="http://docs.oasis-open.org/wss/oasis-wss-SwAProfile-1.1#Attachment-Content-Signature-Transform"/>
   23 </ds:Transforms>
   24 <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
   25 <ds:DigestValue>PSrQnx9L+3Vh1ORMk6EWwvY+Mn8=</ds:DigestValue>
   26 </ds:Reference>
   27 .
   28 </ds:SignedInfo>>
   29 <ds:SignatureValue>...</ds:SignatureValue>
   30 .
   31 .
   32 </ds:Signature>
   33 </wsse:Security>
   34 </S:Header>
   35 <S:Body wsu:Id="_5006">
   36 <ns2:uploadFile xmlns:ns2="http://service.techtip/">
   37 <fileName>java.jpg</fileName>
   38 <fileContent>cid:6a28e859-a93e-4d1f-a8b0-ce5a06b246cf@example.jaxws.sun.com</fileContent>
   39 </ns2:uploadFile>
   40 </S:Body>
   41 </S:Envelope>
   42 --uuid:be998ab6-f21a-4ae7-9436-fac806d24efa
   43 Content-Id:<9e0f3a51-dcfe-48f4-806f-70a9c8c3a482@example.jaxws.sun.com>
   44 Content-Type: image/jpeg
   45 Content-Transfer-Encoding: binary
   46 Binary JPEG Image data
   47 --uuid:be998ab6-f21a-4ae7-9436-fac806d24efa--

SOAP 메시지에서 SOAP 첨부 파일을 사용하면 SOAP 메시지가 MIME 헤더와 함께 표시되며, 이때 여러 개의 경계 부분이 나타날 수 있습니다. 이것을 SOAP 메시지 패키지라 고 합니다. 기본 SOAP Envelope은 일반적으로 MIME 첫 부분으로 전송됩니다. 첨부 파일은 다른 MIME 부분으로 전송되며 SOAP Envelope에서 참조합니다. 위 예에서 1 - 41행은 SOAP 메시지를 보여 주고, 42 - 47행은 첨부 파일이 포함된 MIME 부분(이 예예서는 JPEG 이미지)을 보여 줍니다. SOAP 본문(35 - 40행)에서 cid:Content-ID reference(38행)를 사용하여 첨부 파일은 참조합니다. 첨부 파일은 서명 참조 요소(20행)에서 참조하여 이 첨부 파일에 서명이 있음을 나타낼 수도 있습니다.

SwA 첨부 파일에 서명하기

예제의 메시지에서 보듯이 SwA 첨부 파일에 서명을 하면 그 첨부 파일을 가리키는 <ds:Reference> 요소(20행)가 <wsse:Security> 헤더(13-33행)의 <ds:Signature> 요소(16행) 내에 포함됩니다. <ds:Reference>(22행)의 transform 요소는 MIME 패키지의 콘텐츠만 서명해야 하는지(Attachment-Content-Signature-Transform) 또는 콘텐츠와 MIME 헤더를 모두 서명해야 하는지(Attachment-Complete-Signature-Transform)를 지정합니다. Metro 1.3에서는 Attachment-Content-Signature-Transform 옵션만 지원되며 기본적으로 사용됩니다. WS-SecurityPolicy 1.2 사양에서는 첨부 파일에 사용할 transform을 지정하는 방식을 제공하지 않기 때문입니다.

SwA 첨부 파일 암호화

기밀 보호를 위해 SwA 첨부 파일을 암호화할 수 있으며, 이 방식으로 SOAP 메시지의 MIME 부분 콘텐츠(첨부 파일 콘텐츠)를 보호합니다. XML 암호화 요소를 사용하여 암호화하고 보호합니다. 그 결과로 만들어지는 암호화 텍스트를 업데이트된 첨부 파일 본문에 넣고 <xenc:EncrptedData> 요소를 <wsse:Security> header에 넣습니다. <xenc:CipherReference> 요소는 <xenc:EncryptedData> 요소를 암호화 데이터에 연결해야 합니다. 다음은 암호화된 첨부 파일이 있는 SwA 메시지의 예입니다. 참조를 위해 행 번호를 추가했습니다.

    1 --uuid:f4fde266-9bd6-4b8d-a946-a98e4d11f4e5
    2 Content-Type: text/xml
    3 <?xml version='1.0' encoding='UTF-8'?>
    4 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
    5   xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    6   xmlns:exc14n="http://www.w3.org/2001/10/xml-exc-c14n#"
    7   xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    8   xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    9   xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
   10  <S:Header>
   11 .
   12 .
   13 <wsse:Security S:mustUnderstand="1">
   14 .
   15 .
   16 <xenc:EncryptedKey Id="_5007">
   17 <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
   18 <ds:KeyInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="keyInfo">
   19 .
   20 .
   21 </ds:KeyInfo>
   22 <xenc:CipherData>
   23 <xenc:CipherValue>...</xenc:CipherValue>
   24 </xenc:CipherData>
   25 <xenc:ReferenceList>
   26 <xenc:DataReference URI="#_5008"/>
   27 </xenc:ReferenceList>
   28 </xenc:EncryptedKey>
   29 <xenc:EncryptedData Id="_5008" MimeType="image/jpeg" Type="http://docs.oasis-open.org/wss/oasis-wss-SwAProfile-1.1#Attachment-Content-Only">
   30 <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
   31 <xenc:CipherData>
   32 <xenc:CipherReference URI="cid:0d3ed794-8492-4c7d-9d85-2568c37d1687@example.jaxws.sun.com">
   33 <xenc:Transforms>
   34 <ds:Transform Algorithm="http://docs.oasis-open.org/wss/oasis-wss-SwAProfile-1.1#Attachment-Ciphertext-Transform"/>
   35 </xenc:Transforms>
   36 </xenc:CipherReference>
   37 </xenc:CipherData>
   38 </xenc:EncryptedData>
   39 .
   40 .
   41 </wsse:Security>
   42 </S:Header>
   43 <S:Body wsu:Id="_5006">
   44 <ns2:uploadFile xmlns:ns2="http://service.techtip/">
   45 <fileName>java.jpg</fileName>
   46 <fileContent>cid:0d3ed794-8492-4c7d-9d85-2568c37d1687@example.jaxws.sun.com</fileContent>
   47 </ns2:uploadFile>
   48 </S:Body>
   49 </S:Envelope>
   50 --uuid:f4fde266-9bd6-4b8d-a946-a98e4d11f4e5
   51 Content-Id:<0d3ed794-8492-4c7d-9d85-2568c37d1687@example.jaxws.sun.com>
   52 Content-Type: application/octet-stream
   53 Content-Transfer-Encoding: binary
   54 Encrypted image data Here---
   55 --uuid:f4fde266-9bd6-4b8d-a946-a98e4d11f4e5--
   56

32행은 <xenc:EncryptedData> 요소(29행) 내의 <xenc:CipherReference> 요소를 보여 줍니다. <xenc:CipherReference> 요소는 암호화할 첨부 파일 콘텐츠 ID를 참조합니다. <xenc:EncryptedData> 요소의 MimeType 속성은 암호화 이전의 MIME 첨부 파일 콘텐츠 형식(이 예에서는 image/jpeg)을 나타냅니다. 첨부 파일을 암호화하면 Content-Type이 application/octet-stream으로 설정됩니다.

샘플 애플리케이션

샘플 애플리케이션은 Metro 1.3을 사용하여 SwA 첨부 파일을 안전하게 교환하는 웹 서비스 및 클라이언트를 보여 줍니다. 이 애플리케이션에는 FileUpload와 FileUploadClient 등 두 가지 프로젝트가 포함되어 있습니다. FileUpload 프로젝트는 서버에 바이너리 파일을 저장하는 FileUpload 웹 서비스를 제공합니다. FileUploadClient 프로젝트에는 FileUpload 웹 서비스에 대한 클라이언트로 작동하는 서블릿이 포함되어 있습니다.

이 서블릿은 서비스의 정책에 규정된 안전한 방법으로 바이너리 파일을 FileUpload 서비스로 보냅니다. 바이너리 파일은 서비스의 uploadFile() 메소드에 SwA 첨부 파일로 전송됩니다. 웹 서비스의 정책은 "전송하는 동안", 즉 클라이언트에서 서비스로 첨부 파일을 보내는 동안 첨부 파일의 무결성과 기밀성을 보호하도록 규정하고 있습니다.

샘플 실행

샘플을 실행하려면 다음 단계를 수행하십시오.

  1. 샘플 애플리케이션을 다운로드하고 압축된 내용을 풉니다. 이제 새로 생성된 <sample_install_dir>/sample 디렉토리가 보여야 합니다. 여기서 <sample_install_dir>은 샘플 애플리케이션을 설치한 디렉토리입니다. 예를 들어 Windows 시스템에서 C:\ 디렉토리에 압축을 풀었다면 새로 생성된 디렉토리는 C:\sample입니다.
  2. 아직 NetBeans IDE 6.5 베타 버전 이상과 GlassFish V2UR2를 설치하지 않았다면 설치합니다. GlassFish V2UR2는 NetBeans IDE 6.5 베타 다운로드 번들에서도 사용할 수 있으므로 IDE와 애플리케이션 서버를 함께 설치할 수 있습니다.
  3. Metro 1.3을 다운로드합니다. 그런 다음 아래와 같은 방법으로 GlassFish v2 UR2 설치에 추가합니다.
    • 명령줄을 열고 java -jar metro-1_3.jar 명령을 입력합니다. 그러면 metro 디렉토리가 생성되고 이 디렉토리에 Metro 1.3의 내용이 들어갑니다.
    • 다음 명령을 입력하여 metro 디렉토리로 바꿉니다. cd metro
    • 다음 명령을 입력합니다. ant -Das.home=<AS_HOME> -f metro-on-glassfish.xml install

      여기서 <AS_HOME>은 GlassFish가 설치된 위치입니다. AS_HOME을 환경 변수로 설정한 경우에는 명령에서 -Das.home을 지정할 필요가 없습니다. 이 명령은 Metro JAR 파일을 GlassFish 설치의 lib 디렉토리로 복사하고 도메인 구성 파일인 domain.xml에서 클래스 경로를 필요에 따라 적합하게 변경합니다. 유틸리티 스크립트 파일인 wsimportwsgen의 클래스 경로도 업데이트합니다.

  4. 아래와 같은 방법으로 GlassFish에서 메시지 덤프를 기록하도록 구성합니다.
    • 텍스트 편집기에서 <AS_HOME>/domains/domain1/config/domain.xml 파일을 엽니다.
    • 다음의 <jvm-options> 요소를 추가합니다.
          <jvm-options>-Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true</jvm-options>
          
  5. NetBeans IDE 6.5를 시작합니다.
  6. FileUpload 및 FileUploadClient 프로젝트를 엽니다. 각 프로젝트를 아래와 같은 방법으로 엽니다.
    • Projects 탭에서 Open Project를 클릭합니다.
    • 해당 프로젝트 폴더로 이동합니다. 샘플 애플리케이션의 sample 디렉토리에서 두 프로젝트에 대한 폴더를 찾을 수 있습니다.
    • Open Project 버튼을 클릭합니다.
  7. GlassFish 애플리케이션 서버를 시작합니다. 서버 목록에서 GlassFish V2를 마우스 오른쪽 버튼으로 클릭하면 NetBeans IDE Services 탭에서 GlassFish 애플리케이션 서버를 시작할 수 있습니다. 또는 다음 명령을 입력하면 됩니다.
       <AS_HOME>/bin/asadmin start-domain domain1
    
  8. 다음과 같이 FileUpload 서비스를 엽니다.
    • NetBeans IDE의 Project 탭에서 FileUpload 프로젝트를 확장합니다.
    • Web Services 노드를 확장합니다.
    • FileUpload 서비스를 마우스 오른쪽 버튼으로 클릭하고 Open을 선택합니다.
    • 편집기 창 위쪽의 Source 버튼을 클릭하여 FileUpload.java 파일의 내용을 표시합니다.

    그림 1에서 보는 바와 같이 클래스는 @WebService 주석으로 처리되어 웹 서비스임을 나타냅니다. 서비스에 있는 uploadFile() 메소드 하나도 @WebMethod 주석으로 처리되어 웹 메소드임을 나타냅니다. uploadFile() 메소드는 파일을 UPLOAD_LOC 변수가 확인한 서버 위치에 업로드합니다. UPLOAD_LOC의 값을 변경하여 바이너리 파일을 저장할 서버의 위치를 지정합니다.

    FileUpload 클래스

    그림 1. FileUpload 클래스

  9. 서비스에 대한 정책을 다음과 같이 설정합니다. (FileUpload 프로젝트에 대해서는 이러한 단계를 이미 실행했습니다.)
    • Projects 뷰의 FileUpload 프로젝트 아래에서 Web Services 노드를 확장합니다.
    • FileUpload 서비스를 마우스 오른쪽 버튼으로 클릭하고 Edit Web Service Attributes를 선택합니다. 그러면 그림 2에서 보는 바와 같이 FileUpload 서비스의 Quality of Service 속성을 나타내는 창이 열립니다.
      <code>FileUpload</code>의 서비스 정책

      그림 2. FileUpload의 서비스 정책

    • Version Compatibility를 .NET 3.5/Metro 1.3으로 설정합니다.
    • Secure Service 확인란을 선택하고 Security Mechanism 드롭다운 목록에서 Mutual Certificates Security를 선택합니다.
    • Use Development Defaults 확인란을 선택합니다. 그러면 사용할 기본 키 저장소와 인증서가 선택됩니다. 이 확인란을 선택하지 않는 경우 자체 인증서를 지정해야 합니다.
    • uploadFile 작업으로 스크롤을 내리고 Input Message 항목을 확장합니다.
    • Message Parts 버튼을 클릭합니다. 그러면 그림 3에서 보는 바와 같이 보안을 설정해야 할 메시지 부분을 지정하는 Message Parts 창이 열립니다.
      메시지 부분 보안

      그림 3. 메시지 부분 보안

    • Message Parts 창에서 Add Attachments 버튼을 클릭하여 SwA 첨부 파일에 서명하고 암호화합니다. Body and Attachment(s)에 대해 Sign and Encrypt 옵션을 선택해야 합니다.
    • 두 개의 열린 창에서 OK 버튼을 클릭하여 구성을 저장합니다.
  10. FileUpload 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Run을 선택합니다. 그러면 서비스가 배포되고 그림 4에서 보는 바와 같이 서비스의 WSDL을 나타내는 브라우저가 열립니다.
    웹 서비스의 WSDL

    그림 4. 웹 서비스의 WSDL

  11. FileUploadClient 프로젝트에서 다음과 같은 방법으로 uploadClient 클래스를 엽니다.
    • NetBeans IDE의 Project 탭에서 FileUpload 프로젝트를 확장합니다.
    • Source Packages 노드를 확장합니다.
    • techtip.client 소스 패키지 아래에서 FileUploadClient를 마우스 오른쪽 버튼으로 클릭하고 Open을 선택합니다.

    그림 5에서 보는 바와 같이 FileUploadClientFileUpload web service에 액세스하는 서블릿입니다. 서비스에 액세스하는 코드는 processRequest() 메소드에 있습니다.

    <code>FileUploadClient</code> 클래스

    그림 5. FileUploadClient 클래스

  12. 클라이언트에 대한 정책을 다음과 같이 설정합니다. FileUploadClient 프로젝트에 대해서는 이러한 단계를 이미 실행했습니다.
    • FileUploadClient 프로젝트에서 Expand Web Service Reference 노드를 확장합니다.
    • FileUpload 서비스를 마우스 오른쪽 버튼으로 클릭하고 Edit Web Service Attributes를 선택합니다. 그러면 그림 6에서 보는 바와 같이 FileUpload 서비스의 Quality of Service 속성을 나타내는 창이 열립니다.
      <code>FileUpload</code> 서비스 클라이언트의 서비스 정책

      그림 6. FileUpload 서비스 클라이언트의 서비스 정책

    • Security 아래에서 Use Development Defaults 확인란을 선택합니다. 그러면 사용할 기본 인증서가 선택됩니다.
    • OK 버튼을 클릭하여 변경 내용을 저장합니다.
  13. FileUploadClient 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Run을 선택합니다. 그러면 그림 7에서 보는 바와 같이 파일을 성공적으로 업로드했는지 여부를 나타내는 브라우저 창이 열립니다.
    파일 업로드 성공

    그림 7. 파일 업로드 성공

    그리고, FileUpload 클래스 내의 UPLOAD_LOC 변수에서 지정한 위치에서 첨부 파일인 java.jpg가 보여야 합니다. 다음은 이 파일의 그래픽 이미지입니다. java.jpg 그래픽
  14. <AS_HOME>/domains/domain1/logs/server 디렉토리에 있는 애플리케이션 서버의 로그 파일을 검토하여 첨부 파일의 보안을 확인하는 메시지 흐름을 볼 수 있습니다.

추가 자료

저자 정보

Ashutosh Shahi는 썬마이크로시스템즈 Web Services Security Group의 일원으로서, 현재 썬의 Metro 웹 서비스 스택에서의 보안과 관련된 WS-* 기술 구현에 참여하고 있습니다. 썬에 입사하기 전에는 Apache의 오픈 소스 SOAP 엔진인 Apache Axis의 개발을 담당했습니다.


이 글의 영문 원본은
Securing Attachments With Metro 1.3
에서 보실 수 있습니다.

"Java EE" 카테고리의 다른 글

2008/10/13 10:26 2008/10/13 10:26

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/669

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 23 24 25 26 27 28 29 30 31  ... 641  Next ▶