7.3. 클라이언트 인증 정보 제공
7.3.1. 개요
기본적으로 UsernameToken
클라이언트 자격 증명을 제공하는 두 가지 방법이 있습니다. 클라이언트의 블루프린트 XML 구성에서 사용자 이름과 암호를 직접 설정하거나 클라이언트 구성에서 사용자 이름을 설정하고 콜백 핸들러를 구현하여 암호를 프로그래밍 방식으로 제공할 수 있습니다. 후자의 접근 방식은 (프로그래밍에 의한) 암호는 보기에서 더 쉽게 숨길 수 있다는 장점이 있습니다.
7.3.2. 클라이언트 인증 정보 속성
표 7.1. “클라이언트 인증 정보 속성” 블루프린트 XML에서 클라이언트의 요청 컨텍스트에 대한 WS-Security 사용자 이름/암호 자격 증명을 지정하는 데 사용할 수 있는 속성이 표시됩니다.
속성 | 설명 |
---|---|
| UsernameToken 정책 어설션의 사용자 이름을 지정합니다. |
| UsernameToken 정책 어설션의 암호를 지정합니다. 지정하지 않으면 콜백 처리기를 호출하여 암호를 가져옵니다. |
| UsernameToken 정책 어설션의 암호를 검색하는 WSS4J 콜백 처리기의 클래스 이름을 지정합니다. 콜백 처리기는 다른 종류의 보안 이벤트도 처리할 수 있습니다. |
7.3.3. 블루프린트 XML에서 클라이언트 인증 정보 구성
블루프린트 XML에서 클라이언트의 요청 컨텍스트에서 사용자 이름/암호 자격 증명을 구성하려면 다음과 같이 security.username
및 security.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).
-
다이제스트 암호- UsernameToken에 다이제스트 암호가 포함된 경우 콜백은 지정된 사용자 이름(
- DECRYPT
-
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에서는 사용하지 않습니다.