2009. 4. 14. 11:30

JAAS(Java Authentication and Authorization Service) 개요




JAAS(Java Authentication and Authorization Service) 개요

 

  JAAS는 클라이언트 및 서버 시스템을 보호하기 위한 유연하고 확장성 있는 자바 인증 및 권한 부여 서비스를 제공하는 표준 API 입니다.

 

  JAAS JDK 1.3에서는 선택적인 패키지로 소개되었으며, J2SE 1.4 부터 표준 확장 API(javax.security.auth)로 배포되고 있습니다.

 

  JAAS는 플러그 가능한 구조로 되어 있어 자바 용용 프로그램이 JAAS 구현 기술에 관계없이 구현할 수 있도록 지원합니다. , 응용 프로그램 개발자는 제공되는 SPI를 이용하여 JAAS 구현 부분과 인터페이스를 하고 구현 부분은 설정 파일을 통하여 구동 시 결정됩니다.

 

  따라서, JAAS 기반으로 개발된 응용 프로그램은 소스 변경 및 재 컴파일 없이 설정 파일을 변경함으로써 JAAS 구현 메커니즘을 변경할 수 있습니다.

 

  JAAS는 다음과 같은 패턴 및 프레임워크에서 많은 장점들을 받아들였습니다.

 

- PAM (Pluggable Authentication Module) Stackable Feature

- 2-PC (Two-phase commit)  - Transactional View

- Policy, Permission J2SE security package

- Subject Java security framework

 

 

1. 주요 SPI(Service Provider Interface) 인터페이스

 

1.1 LoginContext 클래스

  응용 프로그램과의 인터페이스를 정의 합니다. 응용 프로그램은 Login Context 인터페이스만을 사용하여 로그인 및 로그 아웃을 수행하고 Principal Credential에 대한 정보를 얻을 수 있습니다.

 

주요 메소드들은 다음과 같습니다.



login()      : 로그인을  수행합니다.

getSubject() : 로그인으로  인증된 사용자 정보를 리턴 합니다.

logout()     : 로그아웃을 수행합니다.


1.2 LoginModule 인터페이스

  LoginContext 클래스에서 내부적으로 사용되며 응용 프로그램이 직접 사용하지 않습니다.

서비스 제공자는 이 인터페이스를 구현해야 합니다. 구현된 클래스들은 환경설정 파일을 통하여 LoginContext 생성 시 동적으로 로드 됩니다.

 

  JDK 1.4부터 제공하는 로그인 모듈들은 다음과 같은 것들이 있습니다.

 


JndiLoginModule : com.sun.security.auth.module.JndiLoginModule

Krb5LoginModule : com.sun.security.auth.module.Krb5LoginModule

NTLoginModule : com.sun.security.auth.module.NTLoginModule

UnixLoginModule : com.sun.security.auth.module.UnixLoginModule

 


주요 메소드들은 다음과 같습니다.



initialize()     : 모듈 초기화를 수행합니다.

login()         : 사용자인증(로그인)을 수행합니다.

commit()      : 모든 로그인 모듈이 성공 한 후에 호출됩니다.

abort()         : 로그인을 취소합니다.

logout()        : 로그아웃을 수행합니다.

 

 

1.3 Subject 인터페이스

  한 사람에 대한 식별 이름(Principals: login id, 주민번호, email)들과 인증을 위하여 사용되는 개체 정보(Credentials: 비밀번호, ticket, key)들을 묶어서 관리합니다.

 

1.4 Principal 인터페이스

  개체를 나타내는 id (login id, 주민번호, email, etc)를 나타냅니다.

 

1.5 Credential 인터페이스

  인증을 위하여 사용되는 개체 정보(비밀번호, ticket, key)를 나타냅니다.

 

1.6 CallbackHandler, Callback 인터페이스

  사용자 인증에 필요한 정보 입력(예를 들어 id/pwd)을 처리하는 인터페이스로 응용프로그램에서 직접 구현 하거나 제공되는 다음과 같은 클래스들을 사용할 수 있습니다.



ChoiceCallback          : 선택항목들을 나열하고 하나 도는 다수를 선택하도록 합니다.

ConfirmationCallback  : YES/NO, OK/CANCEL, YES/NO/CANCEL등의 질문에 답하도록 합니다.

LanguageCallback      : 로케일을 입력 받습니다.

NameCallback           : 이름을 입력 받습니다.

PasswordCallback      : 프롬프트를 출력하고 비밀번호를 입력 받습니다.

TextInputCallback       : 프롬프트를 출력하고 텍스트를 입력 받습니다.

TextOutputCallback     : 경고 및 에러 메시지를 출력합니다.

 

 

 

2. JAAS 시스템 구조

   응용프로그램은 LoginContext 클래스만 사용하면 됩니다. 하부 JAAS SPI 구현은 LoginContext에 의하여 실행시 동적으로 로딩됩니다. SPI를 구현한 서비스 제공자는 데이터베이스, JNDI, 웹서비스, Unix 인증 등의 다양한 인증 서비스를 기반으로 작성 될 수 있습니다.

 

사용자 삽입 이미지
 

 

3. JAAS 설정파일

3.1 설정파일의 용도

  Login Module 구현 클래스들 및 파라미터 그리고 인증 프로세스를 제어하는 플래그들을 설정합니다.


3.2 설정 파일 이름 및 경로

  특별한 제한이 없으나 보통 파일명은 “jaas.conf”를 사용합니다. 설정파일 경로는 특별한 제한이 없으며 “javax.security.auth.login.Configuration” 시스템 환경변수를 이용하여 경로를 설정 해야 합니다.

 

  시스템 프로퍼티는 크게 두 가지 방법으로 설정할 수 있습니다. 첫 번째 방법은 운영체제에서 지원하는 시스템 환경 설정 방법을 이용하며 운영 체제 별로 다음과 같이 수행합니다.

 

- Windows :

 

    set JAVAOPTS=-Djavax.security.auth.login.Configuration=../conf/jaas.conf

 

    또는 GUI로 제공되는 환경 변수 설정 창을 이용합니다.


- Linux :

 

   export JAVAOPTS=-Djavax.security.auth.login.Configuration=../conf/jaas.conf

 

  두 번째 방법은 실행 시 명령 행을 이용하여 설정합니다.

 

   java Djavax.security.auth.login.Configuration ./jaas.conf AppClass

 

 

3.4 설정파일 구조

  설정파일은 하나 이상의 Application정의로 구성됩니다. Application은 보통 하나의 응용 프로그램에서 사용 될 LoginModule들의 구현에 대한 정보를 설정합니다. Application내에 LoginModule은 하나 이상 정의할 수 있으며 2-PC(Two-phase commit)로 인증 트랜잭션을 관리합니다.

 


      Application {

          ModuleClass  Flag    ModuleOptions;

          ModuleClass  Flag    ModuleOptions;

          ...

      };

 

      Application {

          ModuleClass  Flag    ModuleOptions;

          ...

      };

      ...



3.4.1 Application

  Application 이름으로 LoginContext 생성시 파라미터에 사용됩니다. 설정 파일에는 여러 응용프로그램들을 위한 LoginModule들이 정의될 수 있으므로 Application 이름으로 구분합니다.

 

3.4.2 ModuleClass

  LoginModule 인터페이스를 구현한 클래스 명을 기록합니다. 하나의 Application에는 하나 이상의 LoginModule들이 기술될 수 있으며 Flag에 따라 LoginModule들을 이용하여 인증을 수행합니다.

 

3.4.3 Flag

Application에 다수의 LoginModule들이 있을 때 인증(로그인) 과정을 제어하는데 사용됩니다.

 

- Required: 로그인 모듈 요구됨

  인증 성공이 요구되지만 하나이상의 LoginModule이 정의되어 있고 다른 로그인 모둘 중에 하나라도 성공하면 인증이 성공합니다. 따라서 반드시 성공할 필요는 없습니다. 하지만 Application LoginModule이 하나만 정의되어 있다면 반드시 성공해야 합니다.

 

- Requisite: 반드시 성공

  LoginModule을 통한 인증이 반드시 성공해야 합니다. 하나 이상의 LoginModule이 정의되어 있고 다른 LoginModule이 모두 성공하여도 이 LoginModule이 실패하면 최종적으로 실패하게 됩니다.

 

- Sufficient:이 것만 확인되면 충분함.

  만약 이 LoginModule의 인증이 성공 하면, 처리할 수 있는 다른 LoginModule이 있다고 하여도 더 이상 인증을 시도하지 않습니다. , 이 인증이 성공하면 바로 인증이 성공하게 됩니다.

 

- Optional : 선택사항

  이 LoginModule은 인증 트랜잭션에 아무런 영향을 주지 않습니다. LoginModule 인증을 수행하는 것은 옵션입니다.

 

3.4.4 ModuleOptions

  모듈에 전달할 옵션 값을 설정(모듈마다 다름)합니다. 예를 들어 데이터베이스에 연결하여 인증을 수행하는 경우라면 데이터베이스 연결정보가 될 것입니다.

       형식 : name=value name=value name=value ………

 

3.5 설정 파일 예제

 


Sample {

    com.sun.security.auth.module.NTLoginModule required debug=true;

};

 

Example {

      RdbmsLoginModule required debug="true driver="org.gjt.mm.mysql.Driver"

                url="jdbc:mysql://localhost/jaasdb?user=root;

};

 

 

3.6 JAAS Flow


0) 실행 시 명령 행 인자를 이용하여 시스템 프로퍼티 javax.security.auth.login.config를 설정하고 응용프로그램을 실행합니다.

 

1) 응용프로그램은 Application Name Subject(사용자 로그인을 위한 정보) Callback(사용자 로그인을 위한 정보를 입력 받기 위한)을 인자로 넘겨LoginContext를 생성합니다.

 

2) LoginContext는 환경설정 파일에서 Application Name에 해당하는 LoginModule 구현 클래스를 로딩합니다.

 

3) 생성된 LoginContext의 메소드들을 이용하여 인증 및 권한을 부여합니다.

 

사용자 삽입 이미지

 

4. 참고자료

 

-  JAAS 개요 및 LoginModule 작성방법

     http://www.javaworld.com/javaworld/jw-09-2002/jw-0913-jaas_p.html

 

-  JavaTM Authentication and Authorization Service (JAAS) Reference Guide

     http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html


-  Introduction to JAAS and Java GSS-API Tutorials

     http://java.sun.com/j2se/1.4.2/docs/guide/security/jgss/tutorials/index.html


javax.security.auth 패키지