7.3. 클라이언트 인증 정보 제공

7.3.1. 개요

기본적으로 UsernameToken 클라이언트 자격 증명을 제공하는 두 가지 방법이 있습니다. 클라이언트의 블루프린트 XML 구성에서 사용자 이름과 암호를 직접 설정하거나 클라이언트 구성에서 사용자 이름을 설정하고 콜백 핸들러를 구현하여 암호를 프로그래밍 방식으로 제공할 수 있습니다. 후자의 접근 방식은 (프로그래밍에 의한) 암호는 보기에서 더 쉽게 숨길 수 있다는 장점이 있습니다.

7.3.2. 클라이언트 인증 정보 속성

표 7.1. “클라이언트 인증 정보 속성” 블루프린트 XML에서 클라이언트의 요청 컨텍스트에 대한 WS-Security 사용자 이름/암호 자격 증명을 지정하는 데 사용할 수 있는 속성이 표시됩니다.

표 7.1. 클라이언트 인증 정보 속성

속성설명

security.username

UsernameToken 정책 어설션의 사용자 이름을 지정합니다.

security.password

UsernameToken 정책 어설션의 암호를 지정합니다. 지정하지 않으면 콜백 처리기를 호출하여 암호를 가져옵니다.

security.callback-handler

UsernameToken 정책 어설션의 암호를 검색하는 WSS4J 콜백 처리기의 클래스 이름을 지정합니다. 콜백 처리기는 다른 종류의 보안 이벤트도 처리할 수 있습니다.

7.3.3. 블루프린트 XML에서 클라이언트 인증 정보 구성

블루프린트 XML에서 클라이언트의 요청 컨텍스트에서 사용자 이름/암호 자격 증명을 구성하려면 다음과 같이 security.usernamesecurity.password 속성을 설정합니다.

<beans ... >
    <jaxws:client name="{NamespaceName}LocalPortName"
                  createdFromAPI="true">
        <jaxws:properties>
            <entry key="security.username" value="Alice"/>
            <entry key="security.password" value="abcd!1234"/>
        </jaxws:properties>
    </jaxws:client>
    ...
</beans>

암호를 블루프린트 XML(보안 위험일 수 있음)에 직접 저장하지 않으려면 대신 콜백 처리기를 사용하여 암호를 제공할 수 있습니다.

7.3.4. 암호를 위한 콜백 처리기 프로그래밍

콜백 처리기를 사용하여 UsernameToken 헤더에 대한 암호를 제공하려면 먼저 블루프린트 XML의 클라이언트 구성을 수정하여 security.password 설정을 security.callback-handler 설정으로 교체해야 합니다.

<beans ... >
    <jaxws:client name="{NamespaceName}LocalPortName"
                  createdFromAPI="true">
        <jaxws:properties>
            <entry key="security.username" value="Alice"/>
            <entry key="security.callback-handler" value="interop.client.UTPasswordCallback"/>
        </jaxws:properties>
    </jaxws:client>
    ...
</beans>

앞의 예에서 콜백 처리기는 UTPasswordCallback 클래스에 의해 구현됩니다. 예 7.2. “UsernameToken 암호에 대한 콜백 처리기” 에 표시된 대로 javax.security.auth.callback.CallbackHandler 인터페이스를 구현하여 콜백 처리기를 작성할 수 있습니다.

예 7.2. UsernameToken 암호에 대한 콜백 처리기

package interop.client;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class UTPasswordCallback implements CallbackHandler {

    private Map<String, String> passwords =
        new HashMap<String, String>();

    public UTPasswordCallback() {
        passwords.put("Alice", "ecilA");
        passwords.put("Frank", "invalid-password");
        //for MS clients
        passwords.put("abcd", "dcba");
    }

    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (int i = 0; i < callbacks.length; i++) {
            WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];

            String pass = passwords.get(pc.getIdentifier());
            if (pass != null) {
                pc.setPassword(pass);
                return;
            }
        }

        throw new IOException();
    }

    // Add an alias/password pair to the callback mechanism.
    public void setAliasPassword(String alias, String password) {
        passwords.put(alias, password);
    }
}

콜백 기능은 CallbackHandler.handle() 메서드로 구현됩니다. 이 예제에서는 handle() 메서드로 전달된 콜백 오브젝트가 모두 org.apache.ws.security.WSPasswordCallback 유형이라고 가정합니다(더 직관적인 예에서 콜백 오브젝트 유형을 확인합니다).

클라이언트 콜백 처리기의 보다 비현실적인 구현은 사용자에게 암호를 입력하라는 메시지를 표시하는 것으로 구성될 수 있습니다.

7.3.5. WSPasswordCallback 클래스

UsernameToken 암호를 설정하기 위해 Apache CXF 클라이언트에서 콜백 처리기 를 호출하면 해당 WSPasswordCallback 오브젝트에 USERNAME_TOKEN 사용 코드가 있습니다.

WSPasswordCallback 클래스에 대한 자세한 내용은 org.apache.ws.security.WSPasswordCallback 을 참조하십시오.

WSPasswordCallback 클래스는 다음과 같이 여러 가지 사용 코드를 정의합니다.

USERNAME_TOKEN

UsernameToken 자격 증명의 암호를 가져옵니다. 이 사용 코드는 클라이언트 측과(서버로 전송할 암호를 얻기 위해) 및 서버 측에서 사용됩니다(클라이언트로부터 수신된 암호와 비교하기 위해 암호를 받기 위해).

서버 측에서 이 코드는 다음과 같은 경우에 설정됩니다.

  • 다이제스트 암호- UsernameToken에 다이제스트 암호가 포함된 경우 콜백은 지정된 사용자 이름( WSPasswordCallback.getIdentifier())에 대한 해당 암호를 반환해야 합니다. 암호 확인( 다이제스트 암호와 비교하여)은 WSS4J 런타임을 통해 수행됩니다.
  • 일반 텍스트 암호- 다이제스트 암호 케이스 (Apache CXF 2.4.0)와 동일한 방식으로 구현되었습니다.
  • 사용자 정의 암호 유형-if getHandleCustomPasswordTypes()org.apache.ws.security.WSSConfig 에서 true 인 경우 다이제스트 암호 케이스와 동일한 방식으로 구현됩니다(Apache CXF 2.4.0). 그렇지 않으면 예외가 발생합니다.

    서버 측의 수신된 UsernameToken에 Password 요소가 포함되어 있지 않은 경우 콜백 처리기는 호출되지 않습니다(Apache CXF 2.4.0).

암호 해독
Java 키 저장소에서 개인 키를 검색하려면 암호가 필요합니다. 여기서 WSPasswordCallback.getIdentifier() 는 키 저장소 항목의 별칭을 제공합니다. WSS4J는 이 개인 키를 사용하여 세션(symmetric) 키의 암호를 해독합니다.
서명
Java 키 저장소에서 개인 키를 검색하려면 암호가 필요합니다. 여기서 WSPasswordCallback.getIdentifier() 는 키 저장소 항목의 별칭을 제공합니다. WSS4J는 이 개인 키를 사용하여 서명을 생성합니다.
SECRET_KEY
아웃바운드 측에서 암호화 또는 서명에 대한 비밀 키 또는 인바운드 측의 암호 해독 또는 확인이 필요합니다. 콜백 처리기는 setKey(byte[]) 메서드를 사용하여 키를 설정해야 합니다.
SECURITY_CONTEXT_TOKEN
setKey(byte[]) 메서드를 호출하여 제공하는 wsc:SecurityContextToken 의 키가 필요합니다.
CUSTOM_TOKEN
token을 보유해야 하는 요소(element)입니다. 예를 들어 메시지에 없는 SAML Assertion 또는 SecurityContextToken에 대한 참조의 경우에 사용됩니다. 콜백 처리기는 setCustomToken( Cryostat) 메서드를 사용하여 토큰을 설정해야 합니다.
KEY_NAME
Apache CXF 2.4.0부터 이 사용 코드는 더 이상 사용되지 않습니다.
USERNAME_TOKEN_UNKNOWN
Apache CXF 2.4.0부터 이 사용 코드는 더 이상 사용되지 않습니다.
알 수 없음
WSS4J에서는 사용하지 않습니다.