SaslClient
SaslClient (SASL 클라이언트)
클라이언트로서 SASL 인증을 수행하는 인터페이스입니다.
본문
LDAP 같은 프로토콜 라이브러리는 특정 SASL 메커니즘으로 정의된 인증을 수행하기 위해 이 클래스의 인스턴스를 얻습니다. SaslClient 인스턴스의 메서드를 호출하면 SaslClient가 구현한 SASL 메커니즘에 따라 챌린지를 처리하고 응답을 만듭니다. 인증이 진행됨에 따라 인스턴스는 SASL 클라이언트의 인증 교환 상태를 캡슐화해요.
LDAP 라이브러리가 SaslClient를 사용하는 예는 다음과 같습니다.
SaslClient sc = Sasl.createSaslClient(mechanisms, authorizationId, protocol, serverName, props, callbackHandler);
// 초기 응답을 얻어 서버로 보낸다
byte[] response = (sc.hasInitialResponse() ? sc.evaluateChallenge(new byte[0]) : null);
LdapResult res = ldap.sendBindRequest(dn, sc.getName(), response);
while (!sc.isComplete() && (res.status == SASL_BIND_IN_PROGRESS || res.status == SUCCESS)) {
response = sc.evaluateChallenge(res.getBytes());
if (res.status == SUCCESS) {
if (response != null) {
throw new SaslException("Protocol error: attempting to send response after completion");
}
break;
}
res = ldap.sendBindRequest(dn, sc.getName(), response);
}
메커니즘이 초기 응답을 가지면 라이브러리는 빈 챌린지로 evaluateChallenge()를 호출해 초기 응답을 얻습니다. IMAP4처럼 첫 인증 명령에 초기 응답을 포함하지 않는 프로토콜은 hasInitialResponse()나 evaluateChallenge()를 먼저 호출하지 않고 인증을 시작하며, 서버가 명령에 응답할 때 초기 챌린지를 보내요. 클라이언트가 먼저 데이터를 보내는 SASL 메커니즘에서는 서버가 데이터 없는 챌린지를 내보내고, 결과적으로 클라이언트는 빈 챌린지로 evaluateChallenge()를 호출하게 됩니다.
String getMechanismName()
boolean hasInitialResponse()
byte[] evaluateChallenge(byte[] challenge) throws SaslException
boolean isComplete()
byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException
byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException
Object getNegotiatedProperty(String propName)
void dispose() throws SaslException
wrap과 unwrap은 협상된 QOP에 따라 메시지를 암호화·복호화하며, 협상이 "auth-int"나 "auth-conf"일 때 사용됩니다.