Java Authentication and Authorization Service의 프로그램 로그인 개발
이 주제를 사용하여 Java™ Authentication and Authorization Service의 프로그램 로그인을 개발하십시오.
시작하기 전에
JAAS는
CORBA(Common Object Request Broker Architecture) 프로그램 로그인 API(Application Programming Interface)를 대신합니다.
- 씬 클라이언트 애플리케이션이 서버에서 원격 자원에 액세스하기 위한 환경을 설정하는 방법에 대한 자세한 사항은 CosNaming(CORBA Naming interface)를 사용하는 애플리케이션 개발에 대한 정보를 참조하십시오.
- 애플리케이션이 사용자 정의 JAAS 로그인 구성을 사용하는 경우에는 JAAS 로그인 구성이 제대로 정의되어 있는지 확인하십시오. 자세한 내용은 Java Authentication and Authorization Service의 프로그램 로그인 구성의 내용을 참조하십시오.
- 일부 JAAS API는 Java 2
보안 권한에 의해 보호됩니다. 이러한 API가 애플리케이션 코드에 의해 사용되는 경우에는 이러한 권한이 애플리케이션
was.policy 파일에 추가되는지 확인하십시오. 자세한 사항은 다음 기사를 참조하십시오. 어떤 API가 Java 2 보안 권한에 의해 보호되는지에 대한 자세한 사항은 보안: 학습할 자원 기사에서 IBM® Developer Kit, Java Technology Edition; JAAS 및 WebSphere Application Server 공개 API 문서를 참조하십시오.이 문서의 샘플 코드에 사용되는 일부 API 및 이러한 API가 필요로 하는 Java 2 보안 권한은 다음 목록에 있습니다.
- javax.security.auth.login.LoginContext 생성자는 javax.security.auth.AuthPermission "createLoginContext" 오브젝트에 의해 보호됩니다.
- javax.security.auth.Subject.doAs 및 com.ibm.websphere.security.auth.WSSubject.doAs 메소드는 javax.security.auth.AuthPermission "doAs" 오브젝트에 의해 보호됩니다.
- javax.security.auth.Subject.doAsPrivileged 및 com.ibm.websphere.security.auth.WSSubject.doAsPrivileged 메소드는 javax.security.auth.AuthPermission "doAsPrivileged" 오브젝트에 의해 보호됩니다.
- 권한 부여 검사를 위해 Java Platform,
Enterprise Edition(Java EE)
자원의 개선된 모델.
JAAS 버전 1.0에서 디자인 실수로 인해, javax.security.auth.Subject.getSubject 메소드는 java.security.AccessController.doPrivileged 코드 블럭 내에서 실행 중인 스레드와 연관되는 제목을 리턴하지 않습니다. 이러한 실수로 인해 일관되지 않은 동작이 생기고 이로 인해 원치 않는 영향이 미칠 수도 있습니다. com.ibm.websphere.security.auth.WSSubject 클래스는 제목을 실행 중인 스레드에 연관시키기 위한 임시 해결책을 제공합니다. com.ibm.websphere.security.auth.WSSubject 클래스는 JAAS 모델을 권한 부여 확인을 위해 Java EE(Java Platform, Enterprise Edition) 자원으로 확장합니다. 제목이 com.ibm.websphere.security.auth.WSSubject.doAs 메소드 내에서 실행 중인 스레드와 연관되거나 com.ibm.websphere.security.auth.WSSubject.doAsPrivileged 코드 블록에 제품 신임 정보가 포함되는 경우에는 제목은 Java EE 자원 권한 부여 확인에 사용됩니다.
- 새 JAAS 로그인 구성을 정의하기 위한 사용자 인터페이스 지원. 관리 콘솔에서 JAAS 로그인 구성을 구성하고 JAAS 로그인 구성을 구성 저장소에 저장할 수 있습니다. 애플리케이션은 관리 콘솔에서 새 JAAS 로그인 구성을 정의할 수 있고 데이터는 구성 저장소에서 지속됩니다. 그러나 WebSphere Application Server는 여전히 JAAS 기본 구현이 제공하는 기본 JAAS 로그인 구성 형식(일반 텍스트 파일)을 지원합니다. 구성 저장소 및 일반 텍스트 파일 형식 둘 모두에 중복된 로그인 구성이 정의된 경우에는 저장소에 있는 구성이 우선순위를 갖습니다. 로그인 구성을 구성 저장소에 정의하는 것의 장점은 다음과 같습니다.
- JAAS 로그인 구성을 정의할 때 관리 콘솔 지원
- JAAS 로그인 구성의 중앙 관리
- JAAS 로그인 구성의 분배
- 프로그램 인증을 위한 애플리케이션 지원.
WebSphere Application Server는 애플리케이션이 WebSphere 보안 런타임에 대해 프로그램 인증을 수행하기 위해 JAAS 로그인 구성을 제공합니다. 이러한 구성은 제공된 인증 데이터를 기반으로 WebSphere Application Server-구성 인증 메커니즘(SWAM(Simple WebSphere Authentication Mechanism), LTPA(Lightweight Third Party Authentication)) 및 사용자 레지스트리(로컬 OS, LDAP(Lightweight Directory Access Protocol), 사용자 정의 레지스트리 또는 연합 저장소) 및 Kerberos 인증에 대해 인증을 수행합니다. 이러한 JAAS 로그인 구성으로부터 인증된 제목에는 WebSphere 보안 런타임이 Java EE 역할 기반 보호 자원에서 권한 부여 확인을 수행하는 데 사용할 수 있는 필수 프린시펄 및 신임 정보가 포함됩니다.
참고: SWAM은 WebSphere Application Server 버전 9.0에서 더 이상 사용되지 않으며 이후 릴리스에서는 제거됩니다.다음은 WebSphere Application Server에 의해 제공되는 JAAS 로그인 구성입니다.- WSLogin JAAS 로그인 구성. 일반 JAAS 로그인 구성은 Java 클라이언트, 클라이언트 컨테이너 애플리케이션, 서블릿, JSP(JavaServer Pages) 파일 및 EJB(Enterprise JavaBeans) 컴포넌트를 사용하여 사용자 ID 및 비밀번호 또는 WebSphere Application Server의 보안 런타임에 대한 토큰을 기반으로 인증을 수행할 수 있습니다. 그러나 이 구성은 클라이언트 컨테이너 배치 디스크립터에 지정된 CallbackHandler 핸들러를 존중하지 않습니다.
- WSKRB5Login JAAS 로그인 구성. 일반 JAAS 로그인 구성은 Java 클라이언트, 클라이언트 컨테이너 애플리케이션, 서블릿, JSP(JavaServer Pages) 파일 및 EJB(Enterprise JavaBeans™) 컴포넌트를 사용하여 사용자 ID 및 비밀번호 또는 WebSphere Application Server의 보안 런타임에 대한 토큰을 기반으로 인증을 수행할 수 있습니다. 그러나 이 구성은 클라이언트 컨테이너 배치 디스크립터에 지정된 CallbackHandler 핸들러를 존중하지 않습니다.
- ClientContainer JAAS 로그인 구성. 이 JAAS 로그인 구성은 클라이언트 컨테이너 배치 디스크립터에 지정된 CallbackHandler 핸들러를 존중합니다.
애플리케이션 코드가 로그인 컨텍스트에 하나의 콜백 핸들러를 지정했더라도 이 로그인 구성의 로그인 모듈은 클라이언트 컨테이너 배치 디스크립터에서
CallbackHandler 핸들러를 사용합니다(지정된 경우). 이것은 클라이언트 컨테이너 애플리케이션을 위한 것입니다.
이전에 언급한 JAAS 로그인 구성으로 인증된 제목에는 com.ibm.websphere.security.auth.WSPrincipal 프린시펄 및 com.ibm.websphere.security.cred.WSCredential 신임 정보가 포함됩니다. 인증된 제목이 com.ibm.websphere.security.auth.WSSubject.doAs 또는 다른 doAs 메소드에 전달되면 제품 보안 런타임은 com.ibm.websphere.security.cred.WSCredential 제목을 기반으로 Java EE 자원에서 권한 부여 확인을 수행할 수 있습니다.
- 고객 정의 JAAS 로그인 구성.
클라이언트 또는 서버 프로세스에 사용자 정의 제목을 작성하는 프로그램 로그인을 수행하기 위해 다른 JAAS 로그인 구성을 정의할 수 있습니다. 제품 보안 런타임이 프로토콜을 통해 클라이언트로부터 인증 정보를 전송하기 위해서 사용하거나 서버에서 권한 부여를 처리하기 위해 사용하기 위해서는 제목에 특정 신임 정보와 프린시펄이 필요합니다. 필수 신임 정보는 제공된 로그인 모듈로부터 생성됩니다.
순수한 Java 클라이언트 로그인에 필요한 로그인 모듈은 다음과 같습니다.- com.ibm.ws.security.common.auth.module.WSLoginModuleImpl 필요함
- javax.security.auth.callback.NameCallback
- javax.security.auth.callback.PasswordCallback
순수한 Java 클라이언트를 위해 전파를 사용 가능으로 설정하는 방법에 대한 자세한 정보는 Application Server 간에 보안 속성 전파에서 해당하는 단계를 참조하십시오.참고: 이것이 제대로 발생하기 위해서는 제목에 추가된 클래스는 Java 직렬화 가능 및 직렬화 해제 가능이어야 합니다.서버 로그인을 위해 필요한 로그인 모듈은 다음과 같습니다.- com.ibm.ws.security.server.lm.ltpaLoginModule 필수
- com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule 필수
- 순수한 Java 클라이언트에서 프로그램 로그인의 이름 지정 요구사항.
순수한 Java 클라이언트에서 프로그램 로그인이 발생하고 특성 ancom.ibm.CORBA.validateBasicAuth이 true와 같으면 보안 코드는 SecurityServer가 어디에 상주하는지를 알아야 합니다. 일반적으로 java.naming.provider.url 특성이 시스템 특성으로 설정되거나 특성이 jndi.properties 파일에 설정되면 기본 InitialContext가 충분합니다. 다른 경우에는 시스템 전체 범위에 동일한 java.naming.provider.url 특성을 설정하는 것은 바람직하지 않습니다. 이 경우, sas.client.props 파일에 보안 특정 부트스트랩 정보를 지정해야 합니다. 다음 단계는 순수한 Java 클라이언트에서 SecurityServer를 찾는 방법을 판별하기 위한 우선순위 순서를 제공합니다.
프로시저
예: BasicAuth를 사용하는 프로그램 로그인
이 예는 애플리케이션 프로그램이 BasicAuth를 사용하여 프로그램 로그인을 사용하는 방법을 설명합니다.
Kerberos 토큰이 있는 프로그램 로그인을 추가하십시오.
LoginContext lc = null;
try {
lc = new LoginContext("WSKRB5Login",
new WSCallbackHandlerImpl("userName", "password"));
} catch (LoginException le) {
System.out.println("Cannot create LoginContext. " + le.getMessage());
// Insert the error processing code
} catch(SecurityException se) {
System.out.println("Cannot create LoginContext." + se.getMessage());
// Insert the error processing code
}
try {
lc.login();
} catch(LoginException le) {
System.out.println("Fails to create Subject. " + le.getMessage());
// Insert the error processing code
예에 표시된 대로 새 로그인 컨텍스트는 WSKRB5Login 로그인 구성 및 WSCallbackHandlerImpl 콜백 핸들러로 초기화됩니다. 프롬프트를 받고 싶지 않은 서버측 애플리케이션에서 WSCallbackHandlerImpl 인스턴스를 사용하십시오. WSCallbackHandlerImpl 인스턴스는 지정된 사용자 ID, 비밀번호 및 영역 정보에 의해 초기화됩니다. WSKRB5Login 로그인 구성에 의해 지정되는 현재 Krb5LoginModuleWrapperClient 클래스 구현은 지정된 콜백 핸들러로부터만 인증 정보를 검색할 수 있습니다. 제목 오브젝트를 사용하여 로그인 컨텍스트를 구성할 수 있지만 제목은 현재 Krb5LoginModuleWrapperClient 구현에 의해 무시됩니다.
순수한 Java 애플리케이션 클라이언트의 경우 제품은 WSStdinCallbackHandlerImpl 및 WSGUICallbackHandlerImpl의 두 개의 다른 콜백 핸들러 구현을 제공합니다. 이들은 각각 명령행과 팝업 패널에서 사용자 ID, 비밀번호 및 영역 정보를 프롬프트합니다. 특정 애플리케이션 환경에 따라서 이러한 제품 콜백 핸들러 구현을 선택할 수 있습니다. 이러한 구현이 특정 애플리케이션 요구사항에 적합하지 않으면 새 콜백 핸들러를 개발할 수 있습니다.
WSKRB5Login, WSAuthMechOidCallbackImpl 및 WSCcacheCallBackHandlerImpl과 함께 사용할 수 있는 추가 콜백이 있습니다. WSAuthMechOidCallbackImpl을 사용하면 인증 메커니즘 OID를 지정할 수 있고, Kerberos 인증 메커니즘 OID 값은 "1.2.840.113554.1.2.2"입니다. WSCcacheCallBackHandlerImpl을 사용하면 사용자 이름, Kerberos 영역 이름, Kerberos 신임 정보 캐시 전체 경로 및 Kerberos 신임 정보 캐시의 기본 위치를 사용하려는지 여부를 지정할 수 있습니다. Kerberos 신임 정보 캐시의 기본 위치를 사용하기로 선택한 경우에는 Kerberos 신임 정보 캐시가 무시됩니다. 인증을 위해 Kerberos를 사용 중인 경우에는 sas.client.props 파일을 업데이트해야 합니다.
기본 WSLoginModuleImpl 구현이 사용자의 요구사항을 충족하는 데 실패하는 경우에는 사용자 자체 로그인 모듈을 개발할 수도 있습니다. 이 제품은 사용자 로그인 모듈이 사용할 수 있는 유틸리티 기능을 제공하고 이는 다음 섹션에서 설명됩니다.
java.naming.provider.url 특성이 시스템 특성으로 설정되지 않거나
jndi.properties 파일에 설정되지 않으면 제품 서버가 localhost:2809 위치에 있지 않는 경우에는 기본
InitialContext 컨텍스트가 작동하지 않습니다. 이 상황에서는 JAAS 로그인 앞에 새 InitialContext 컨텍스트를 프로그래밍 방식으로 구성하십시오.
JAAS는 커미트 메소드를 수행하기 전에 입력된 사용자 ID 또는 비밀번호가 올바른지 확인하기 위해서
보안 서버가 어디에 상주하는지를 알아야 합니다. 이 주제에 나중에 지정되는 새 InitialContext 컨텍스트를 구성하여
보안 코드에는 보안 서버 위치 및 대상 영역을 찾는 데 필요한 정보가 있습니다.
java.naming.provider.url 특성이 시스템 특성으로 설정되지 않거나
jndi.properties 파일에 설정되지 않으면 제품 서버가 sever_name:2809 위치에 있지 않는 경우에는 기본
InitialContext 컨텍스트가 작동하지 않습니다. 이 상황에서는 JAAS 로그인 앞에 새 InitialContext 컨텍스트를 프로그래밍 방식으로 구성하십시오.
JAAS는 커미트 메소드를 수행하기 전에 입력된 사용자 ID 또는 비밀번호가 올바른지 확인하기 위해서
보안 서버가 어디에 상주하는지를 알아야 합니다. 이 주제에 나중에 지정되는 새 InitialContext 컨텍스트를 구성하여
보안 코드에는 보안 서버 위치 및 대상 영역을 찾는 데 필요한 정보가 있습니다.
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
...
// Perform an InitialContext and default lookup prior to logging in so that target realm
// and bootstrap host/port can be determined for SecurityServer lookup.
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc:iiop:myhost.mycompany.com:2809");
Context initialContext = new InitialContext(env);
Object obj = initialContext.lookup("");
LoginContext lc = null;
try {
lc = new LoginContext("WSLogin",
new WSCallbackHandlerImpl("userName", "realm", "password"));
} catch (LoginException le) {
System.out.println("Cannot create LoginContext. " + le.getMessage());
// insert error processing code
} catch(SecurityException se) {
System.out.printlin("Cannot create LoginContext." + se.getMessage();
// Insert error processing
}
try {
lc.login();
} catch(LoginException le) {
System.out.printlin("Fails to create Subject. " + le.getMessage());
// Insert error processing code
}