You cannot see this page without javascript.

Josso

Server 조회 수 3235 추천 수 0 2013.12.19 13:51:19

Java와 PHP를 위한 SSO 모듈인 JOSS(Java Open Single Sign-On)를 정리한다. JOSSO는 J2EE와 Spring 기반의 SSO 솔루션 이다.


목차

 [숨기기

설치 가이드 - JOSSO Gateway

Windows 환경에서 Apache Tomcat 6.0.16에 JOSSO Gateway(Idp)를 설치 한다. 사용자 인증을 위해서는 MySQL 5.0.51을 사용 한다.

설치전 사전 준비 사항


JOSSO용 Database 설정

  • MySQL에 JOSSO에서 사용할 Schmea를 등록한다.
  • MySQL Administrator에 root 관리자로 로그인 한다.
  • 좌측 상단 창에서 "Catalogs"를 선택한다.
  • 좌측 하단의 "Schemata" 창에서 우측 마우스를 누른다.
  • "Create New Schema" 메뉴를 선택하여 Schema를 생성한다.
  • Schema 생성화면에서 "Schema name"으로 "jossodb"를 입력한다.
0001.png


  • MySQL에 JOSSO에서 사용할 사용자를 등록한다.
  • 좌측 상단 창에서 "User Administration"을 선택한다.
  • 좌측 하단의 "Users Accounts" 창에서 우측 마우스를 누른다.
  • "Add new user" 메뉴를 선택하여 사용자를 생성한다.
  • "User Information" 탭에서 "MySQL User"("josso"), "Password", "Confirm Password" 등을 등록한다.
0002.png


  • MySQL에 JOSSO에서 사용할 사용자의 권한을 설정한다.
  • "Schema Privileges" 탭에서 사용자가 사용할 Schema("jossodb")를 선택한다.
  • "Available Privileges"의 모든 권한을 "Assigned Privileges"로 이동한다.
  • "Apply changes" 버튼을 눌려 등록된 정보를 저장한다.
0003.png


  • MySQL Query Browser에 접속한다.
  • 상단의 "Tools" 메뉴에서 "MySQL Query Browser" 메뉴를 선택한다.
0004.png


  • 사용자의 MySQL 데이터베이스 접속 정보를 추가한다.
  • 우측의 "Schemata" 탭에서 "mysql"을 더블 클릭하여 선택한다.
  • grant all privileges on jossodb.* to josso@localhost identified by '암호'; (사용자에게 Schmea에 대한 권한을 추가)
  • flush privileges; (위 명령을 통해 설정한 권한을 데이터베이스에 반영)
  • select host, user, password from user order by user, host; (사용자의 접속 정보 확인)
0005.png
  • MySQL Query Browser가 아니라 DOS 창에서 접속 정보를 추가하는 방법
mysql -uroot -pxxx mysql
    grant all privileges on jossodb.* 
        to josso@localhost identified by '암호';
    flush privileges;
    select host, user, password from user order by user, host;
    exit


  • MySQL Query Browser를 실행하여 jossodb에 josso 사용자로 로그인 한다.
  • 아래 SQL문을 실행하여 JOSSO에서 사용할 table을 생성 한다.
  • MySQL에서 password는 예약어이므로 password라는 항목명은 passwd로 변경 하여 테이블을 생성 하였다.
DROP TABLE IF EXISTS `JOSSO_ROLE`;
CREATE TABLE `JOSSO_ROLE` (
  `name` varchar(16) NOT NULL,
  `description` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `JOSSO_USER`;
CREATE TABLE `JOSSO_USER` (
  `login` varchar(16) NOT NULL,
  `passwd` varchar(20) NOT NULL,
  `name` varchar(64) DEFAULT NULL,
  `description` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `JOSSO_USER_PROPERTY`;
CREATE TABLE `JOSSO_USER_PROPERTY` (
  `login` varchar(16) NOT NULL,
  `name` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`login`,`name`), 
  CONSTRAINT `JOSSO_USER_PROPERTY_ibfk_1` 
    FOREIGN KEY (`login`) REFERENCES `JOSSO_USER` (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

DROP TABLE IF EXISTS `JOSSO_USER_ROLE`;
CREATE TABLE `JOSSO_USER_ROLE` (
  `login` varchar(16) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`login`,`name`),
  KEY `name` (`name`),
  CONSTRAINT `JOSSO_USER_ROLE_ibfk_2` 
    FOREIGN KEY (`login`) REFERENCES `JOSSO_USER` (`login`),
  CONSTRAINT `JOSSO_USER_ROLE_ibfk_1` 
    FOREIGN KEY (`name`) REFERENCES `JOSSO_ROLE` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • InnoDB를 사용하지 않을 경우에는 "ENGINE=InnoDB DEFAULT CHARSET=utf8;" 대신 "TYPE=MyISAM;"를 사용한다.


  • JOSSO가 정상 실행되는지 테스트를 원할 경우 다음 SQL문을 실행한다.
  • MySQL에서 password는 예약어이므로 password라는 항목명은 passwd로 변경 하여 SQL문을 작성 하였다.
INSERT INTO JOSSO_ROLE (NAME,DESCRIPTION) VALUES('role1','The Role1');
INSERT INTO JOSSO_ROLE (NAME,DESCRIPTION) VALUES('role2','The Role2');
INSERT INTO JOSSO_ROLE (NAME,DESCRIPTION) VALUES('role3','The Role3');

INSERT INTO JOSSO_USER (LOGIN,PASSWD,DESCRIPTION)VALUES('user1', 'user1pwd', 'The User1'); INSERT INTO JOSSO_USER_ROLE (LOGIN,NAME) VALUES('user1', 'role1'); INSERT INTO JOSSO_USER_ROLE (LOGIN,NAME) VALUES('user1', 'role2'); INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)VALUES('user1', 'user.name', 'User1 Name'); INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)VALUES('user1', 'user.lastName', 'User1 Last Name'); INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)VALUES('user1', 'user.registrationDate', 'User1 Registration Date');
INSERT INTO JOSSO_USER (LOGIN,PASSWD,DESCRIPTION)VALUES('user2', 'user2pwd', 'The User2') ; INSERT INTO JOSSO_USER_ROLE (LOGIN,NAME)VALUES('user2', 'role3'); INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)VALUES('user2', 'user.name', 'User2 Name'); INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)VALUES('user2', 'user.lastName', 'User2 Last Name'); INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)VALUES('user2', 'user.registrationDate', 'User2 Registration Date');


  • 참고 문헌


JOSSO Gateway 설치

  • 압축을 풀어 d:/josso 폴더에 복사한다.


  • DOS 창에서 JOSSO Agent를 다음과 같이 설치 한다.
  • Windows Vista의 경우, 관리자 권한으로 실행 한다.
cd d:/josso/bin
josso-gsh.bat
  gateway install --target "$TOMCAT_HOME" --platform tc60
  exit
  • $JAVA_HOME 변수에 공백이 들어 있어 "지정된 경로를 찾을 수 없습니다."라는 오류가 발생할 경우에는, PATH 환경 변수에 $JAVA_HOME/bin 폴더를 추가하고 josso-gsh.bat를 다음과 같이 수정 한다.
"%JAVACMD%" %JAVA_OPTS% -jar "%BOOTJAR%" %ARGS% 를 삭제하고 아래 라인을 추가
java %JAVA_OPTS% -jar "%BOOTJAR%" %ARGS%


  • 설치가 정상적으로 진행이 되면 $TOMCAT_HOME 아래에서 다음 사항을 확인할 수 있다.
  • $TOMCAT_HOME/lib/josso-* 파일 들
  • $TOMCAT_HOME/webapps/josso 폴더


  • 설치가 완료된 후 d:/josso 폴더를 삭제한다.


  • Ubnutu Server에서 JOSSO 설치
cd /usr/share/tomcat6
ln ln -s /etc/tomcat6 conf
cd ~/josso/josso-1.8.1/bin
./josso-gsh
    gateway install --target "/usr/share/tomcat6" --platform tc60
    exit

cd /var/lib/tomcat6/webapps
ln -s /usr/share/tomcat6/webapps/josso josso

JOSSO Gateway 환경 설정

  • MySQL용 JDBC Driver를 설정한다.
  • MySQL JDBC Driver 다운로드 사이트에 접속 한다.
  • "JDBC Driver for MySQL (Connector/J)" 아래에 있는 "Download" 링크를 선택한다.
  • Source and Binaries (zip) 옆에 있는 링크를 선택하여 mysql-connector-java-5.1.7.zip 파일을 다운로드 한다.
  • zip 파일의 압축을 풀어 안에 있는 mysql-connector-java-5.1.7-bin.jar 파일을 $TOMCAT_HOME/webapps/josso/WEB-INF/lib 아래에 복사하고 Tomcat을 재기동 한다.


  • $TOMCAT_HOME/lib/josso-gateway-config.xml 파일에 사용자 정보 저장소로 DB 설정 정보를 사용하도록 수정 한다.
<!-- Identity, Session and Assertion Stores configuration -->
<s:import resource="josso-gateway-db-stores.xml" />
<!--
<s:import resource="josso-gateway-memory-stores.xml" />
<s:import resource="josso-gateway-db-stores.xml" />
<s:import resource="josso-gateway-ldap-stores.xml" />
-->


  • $TOMCAT_HOME/lib/josso-gateway-db-stores.xml 파일에서 DB 정보를 설정 한다.
  • 기존에 있는 id="josso-identity-store" 에 해당하는 것을 삭제하고, 아래 사항을 추가 한다.
  • MySQL에서 password는 예약어이므로 password라는 항목명은 passwd로 변경 하여 테이블을 생성 하였으므로 SQL문도 그에 맞도록 수정 하였다.
<db-istore:jdbc-store
    id="josso-identity-store"
    driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost:3306/jossodb"
    connectionName="josso"
    connectionPassword="암호"
    userQueryString="SELECT LOGIN AS NAME FROM JOSSO_USER WHERE LOGIN = ?"
    rolesQueryString="SELECT NAME AS ROLE FROM JOSSO_USER_ROLE WHERE LOGIN = ?"
    credentialsQueryString="SELECT LOGIN AS USERNAME, PASSWD password FROM JOSSO_USER WHERE LOGIN = ?"
    userPropertiesQueryString="SELECT NAME, VALUE FROM JOSSO_USER_PROPERTY WHERE LOGIN = ?"
    resetCredentialDml="UPDATE JOSSO_USER SET PASSWD = ? WHERE LOGIN = ?"
    relayCredentialQueryString="SELECT LOGIN FROM JOSSO_USER WHERE #?# = ?"
    />


  • $TOMCAT_HOME/lib/josso-gateway-auth.xml 파일에서 기본 인증 정보를 수정한다.
  • hashAlgorithm, hashEncoding를 삭제하여 암호가 Plan Text로 저장되도록 한다.
   <basic-authscheme:basic-auth-scheme
           id="josso-basic-authentication"
           ignorePasswordCase="false"
           ignoreUserCase="false">

       <basic-authscheme:credentialStore>
           <s:ref bean="josso-identity-store"/>
       </basic-authscheme:credentialStore>

       <basic-authscheme:credentialStoreKeyAdapter>
           <s:ref bean="josso-simple-key-adapter"/>
       </basic-authscheme:credentialStoreKeyAdapter>

   </basic-authscheme:basic-auth-scheme>


설치 가이드 - PHP용 Agent

Windows 환경에서 PHP 5.2.5에 JOSSO Agent(SP)를 설치 한다.

설치전 사전 준비 사항


PHP용 JOSSO Agent 설치

  • 압축을 풀어 d:/josso 폴더에 복사한다.
  • d:/josso/dist/agents/src/josso-php-agent-1.8.0-.zip의 압축을 풀어 d:/josso_php 폴더에 복사한다.


  • Apache HTTP Server의 Document_root 아래에 d:/josso_php/josso-php-partnerapp 폴더를 통채로 복사한다.


  • PHP에 JOSSO Agent를 설정 한다.
mkdir c:/php/includes
c:/php/includes 아래에 d:/josso_php/josso-php-inc 폴더를 통채로 복사한다.
  • JOSSO Agent 설정 파일은 c:/php/includes/josso-php-inc/josso-cfg.inc 이다.
  • $PHP_HOME에 있는 php.ini 파일에서 다음과 같이 수정 한다.
include_path = ".;c:phpincludes"
auto_prepend_file = "josso-php-incjosso.php"


  • 테스트를 위해 d/:/josso/dist/samples/apps/josso-partner-php-1.8.0-.zip 파일의 압축을 풀어 index.php 파일을 Apache HTTP Server의 Document Root에 index_josso.php로 이름을 바꾸어 저장 한다.


  • 설치가 완료된 후 d:/josso 폴더와 d:/joss_php 폴더를 삭제하고 Apache HTTP Server를 재기동 한다.


PHP용 JOSSO Agent 환경 설정

  • JOSSO Agent 설정 파일(c:/php/includes/josso-php-inc/josso-cfg.inc)에서 다음을 수정 한다.
  • JOSSO Gateway의 IP 또는 URL(예, www.josso.com)을 사용하여 설정한다.
  • josso_endpoint는 JOSSO Gateway의 IP를 사용하여 설정한다.
// Josso agent configuration
$josso_gatewayLoginUrl = 'http://Gateway_서버_IP_or_URL:8080/josso/signon/login.do';
$josso_gatewayLogoutUrl = 'http://Gateway_서버_IP_or_URL:8080/josso/signon/logout.do';

// WS client configuration :
$josso_endpoint = 'http://Gateway_서버_IP:8080';


  • JOSSO 설정 확인


설치 가이드 - Tomcat용 Agent

Windows 환경에서 Apache Tomcat 6.0.16에 JOSSO Agent(SP)를 설치 한다. 여기서는 JOSSO Gateway가 설치된 장비에 JOSSO Agent를 설치 한다.

설치전 사전 준비 사항


Tomcat용 JOSSO Agent 설치

  • 압축을 풀어 d:/josso 폴더에 복사한다.


  • 도스창을 띄워 Apache Tomcat 6.x용 Agent를 설치 한다.
cd d:/josso/bin
josso-gsh.bat
    agent install --target "$TOMCAT_HOME" --platform tc60
    exit


  • 설치 후 Tomcat이 정상적으로 기동되지 않을 경우 다음과 같이 조치 한다.
  • 새로 생성된 $TOMCAT_HOME/bin/setenv.bat과 setenv.sh를 삭제 한다.
  • Java 환경 변수에 "Djava.security.auth.login.config"을 추가 한다.
  • 화면 우측 하단의 "Apache Tomcat" 아이콘을 오른쪽 마우스로 선택 한다.
  • "Configure..." 메뉴를 선택 한다.
  • "Java" 탭에서 "Java Options"에 "-Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.conf"을 추가 한다.


  • 기존 설치된 Web Application과 충돌이 발생할 경우 다음과 같이 조치 한다.
  • $TOMCAT_HOME/lib 에 새로 추가된 jar 파일을 기존 Web Application의 lib 파일과 버전을 비교하여 최신 버전을 사용한다.
  • Confluence의 경우, xbean-spring-3.4.3.jar 에서 충돌이 발생하여 Confluence의 Session ID를 가져오지 못한다. (java.lang.NullPointerException)



Tomcat용 JOSSO Agent 환경 설정

  • JOSSO Agent 설정 파일($TOMCAT_HOME/lib/josso-agent-config.xml)을 수정 한다.
  • JOSSO Gateway의 IP 또는 URL(예, www.josso.com)을 사용하여 설정한다.
  • josso_endpoint는 JOSSO Gateway의 IP를 사용하여 설정한다.
<gatewayLoginUrl>http://Gateway_서버_IP_or_URL:8080/josso/signon/login.do</gatewayLoginUrl>
<gatewayLogoutUrl>http://Gateway_서버_IP_or_URL:8080/josso/signon/logout.do</gatewayLogoutUrl>

<protocol:ws-service-locator endpoint="http://Gateway_서버_IP:8080" />

<agent:partner-app id="Confluence" context="/confluence"/>


Java Web Application용 Agent

위에서 정리한 Tomcat용 JOSSO Agent는 Tomcat에 설치된 모든 웹 애플리케이션에 적용(Agent는 전체에 적용이 되나 설정에 따라 필요한 프로그램만 SSO 처리가 가능)이 되므로 library 파일 등에서 충돌이 발생할 수 있다. 그러서 여기서는 하나의 Web Application에 Filter 기능을 사용하여 적용이 가능한 자체 개발한 JOSSO Web Application Agent를 소개 한다.

Tomcat용 JOSSO Agent을 참조하여 JOSSO Web Application Agent를 제작 하였으므로 관련 library는 Tomcat용 JOSSO Agent에 있는 것을 사용한다.

  • JOSSO와 Web Service를 위한 라이브러리 파일 설정
  • /WEB-INF/lib에 josso-ws-1.8.0.jar 파일 복사


  • Agent 적용을 위한 Filter 설정
  • /WEB-INF/web.xml 파일에 다음을 추가 한다.
<filter>
    <filter-name>jossoAgent</filter-name>
    <filter-class>pnus.josso.LoginFilter</filter-class> <! -- Filter class 명 -->
    <init-param>
        <param-name>jossoGatewayLoginUrl</param-name>
        <param-value>http://localhost/josso/signon/login.do</param-value> <! -- JOSSO 로그인 화면 -->
    </init-param>
    <init-param>
        <param-name>jossoGatewayLogoutUrl</param-name>
        <param-value>http://localhost/josso/signon/logout.do</param-value> <! -- JOSSO 로그아웃 화면 -->
    </init-param>
    <init-param>
        <param-name>jossoEndpoint</param-name>
        <param-value>http://localhost</param-value> <! -- JOSSO 웹 서비스 요청을 위한 시작 URL -->
    </init-param>
    <init-param>
        <param-name>flag_josso</param-name>
        <param-value>true</param-value>       <! -- true일 경우에만 JOSSO 적용 -->
    </init-param>
</filter>

<filter>
    <filter-name>login</filter-name>
    <filter-class>com.atlassian.seraph.filter.LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>jossoAgent</filter-name>
    <url-pattern>*.action</url-pattern>   <! -- JOSSO 적용을 위한 filter mapping -->
</filter-mapping>                         <! -- 여기서는 *.action과 *.jsp만 하였으나 필요할 경우 추가할 것 -->

<filter-mapping>
    <filter-name>jossoAgent</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>


  • 실제 JOSSO와 통신하여 SSO 처리를 하는 LoginFilter.java를 컴파일하여 /WEB-INF/classes/pnus/josso/LoginFilter.class 로 복사 한다.


  • Tomcat을 재기동하여 JOSSO Web Service Agent가 정상적으로 동작하는지 확인 한다.


사용자 가이드

JOSSO 지원 플랫폼

  • JOSSO 지원 플랫폼
  • Gateway : JOSSO에서 Agent의 요청을 받아 사용자 인증을 처리하는 서비스
  • Agent : 사용자 프로그램이 수행되는 곳에 설치되어 Gateway와 통신하여 인증 처리를 하는 서비스

0006.png

PHP에 JOSSO 적용


  • JOSSO Agent가 PHP에 제공하는 정보 명세
$josso_agent  : JOSSO Agent
$ssoSessionId : JOSSO Session ID

$user = $josso_agent.getUserInSession() : 세션에 있는 사용자 정보 반환
$roles = $josso_agent->findRolesBySSOSessionId($sessionId) : Roles을 반환
$josso_agent.isUserInRole($rolename) : 해당 Role에 속하는지 여부 반환

$user->getName() : 사용자 명(사용자 아이디)을 반환
$user->getProperties() : 사용자의 모든 Properties를 반환
$user->getProperty('user.name') : 사용자의 해당 Property를 반환


  • JOSSO Agent가 PHP에 제공하는 함수 명세
jossoRequestLogin() : 로그인 페이지로 가고 싶을 때 호출
jossoCreateLoginUrl() : 로그인 URL을 반환
jossoRequestLoginForUrl($currentUrl) : 로그인 페이지 호출
    로그인 후 인수로 전달된 페이지 호출

jossoRequestLogout() : 로그아웃을 하고 싶을 때 호출
jossoCreateLogoutUrl() : 로그아웃 URL을 반환
jossoRequestLogoutForUrl($currentUrl) : 로그아웃 페이지 호출
    로그아웃 후 인수로 전달된 페이지 호출


Java에 JOSSO 적용

Tomcat용 JOSSO Agent 동작 원리

  • josso-tomcat60-agent-1.8.0.jar에서 다음 함수가 요청을 받아 처리함
  • public void invoke(Request request, Response response)

관리자 가이드

JOSSO 로그

  • 로그 설정
  • $JOSSO_HOME/WEB-INF/web.xml
<servlet-name>action</servlet-name> 에서
<init-param>
    <param-name>debug</param-name>
    <param-value>5</param-value> 이 값을 변경하여 로그를 남김
</init-param>
  • 로그 파일
  • $TOMCAT_HOME/logs/catalina.2009-03-20.log

Single Sign On 적용 방안

  • JOSSO의 SSO 적용 방안

SSO(Single-Sign-On)을 하기 위해서는 자동적으로 세션 정보가 생성되고 관리 되어야 한다. 다음과 같은 규칙을 SSO가 필요한 프로그램에 적용한다.

  • 주의 사항 : 아래 규칙은 프로그램에서 세션 정보를 초기화 시키기 전에 추가 하여야 한다.
  • JOSSO의 SSO 정보가 없을 경우
if (접속 시스템의 세션 정보가 있으면) {
    접속 시스템의 세션 정보를 삭제 한다.
}
if (로그인 또는 로그아웃 요청일 경우) {
    분기 화면 정보로 디폴트 페이지를 설정 한다.
} else {
    분기 화면 정보로 접속하려던 페이지를 설정 한다.
}
JOSSO 로그인 화면을 보여 준다.
JOSSO에 로그인이 되었을 경우 분기 화면을 보여 준다.
  • JOSSO의 SSO 정보가 있을 경우
if (로그인 요청일 경우) {
    디폴트 페이지를 호출 한다.
    exit;
}

if (로그아웃 요청일 경우) [
    접속 시스템의 세션 정보를 삭제 한다.
        반드시 접속 시스템에서 사용하는 세션 정보만 삭제 한다.
        모든 세션 정보를 삭제하면 JOSSO도 비정상 동작 한다.
    분기 화면 정보로 디폴트 페이지를 설정 한다.
    JOSSO에서 로그아웃을 한다.
    JOSSO 로그인 화면을 보여 준다.
    exit
}

if (접속 시스템의 세션 정보와 JOSSO의 세션 정보가 틀릴 경우) {
    접속 시스템의 세션 정보를 삭제 한다.
}
if (접속 시스템의 세션 정보가 없을 경우) {
    접속 시스템의 세션 정보를 생성 한다.
}
원래 페이지 코드를 계속 처리 한다.
  • 사용자 정보 동기화 방안
  • 사용자 등록, 수정, 삭제, 암호 변경 시 SSO가 필요한 모든 시스템의 사용자 정보의 관리 방안을 수립하여야 한다.
  • 1안. 각 시스템에서 별도 관리 (권장 방안)
  • JOSSO에서 사용자 등록, 수정, 삭제, 암호 변경 화면을 제공
  • JOSSO에서 작업 수행 시 SSO가 필요한 모든 시스템의 사용자 정보를 동기화 한다.
  • 권한 설정 등의 부가 작업은 각 시스템에서 진행 한다.
  • 2안. JOSSO에서 통합 관리
  • 각 시스템의 세션에 사용자 정보를 제공하는 것은 JOSSO에서 제공하는 사용자 정보로 대체 한다.
  • 각 시스템에서 사용자 정보를 사용하는 부분을 JOSSO에서 사용자 정보를 읽는 것으로 대체 한다.
  • 역할 정보 동기화 방안
  • 역할 및 권한 정보는 각 시스템에서 별도로 관리 한다.
  • JOSSO에서 통합 관리할 경우에는, 각 시스템의 권한 설정을 제거하고 JOSSO에서 권한 설정을 하여야 하므로 아주 복잡하다. JOSSO는 권한 관리를 위한 상세한 기능을 제공하고 있지 않다.

세션 Timeout 시간 설정

  • $TOMCAT_HOME/webapps/josso/WEB-INF/web.xml에서 세션 Timeout 시간을 분단위로 설정 한다.
<session-config>
    <session-timeout>30</session-timeout>
</session-config>


로그인 화면 디자인 변경

  • 아래 두개의 파일의 디자인을 변경 한다.
  • $TOMCAT_HOME/webapps/josso/josso_layout.jsp : 화면 레이아웃
  • $TOMCAT_HOME/webapps/josso/signon/usernamePasswordLogin.jsp : 로그인 화면 내용

JOSSO Gateway의 LDAP 설정

참고 문헌








다운로드 사이트 2009년 8월 현재, 최신 버전 1.8.0 ZIP 파일 다운로드

 

임시 폴더에 압축을 풀어놓는다. c:toolsjosso-1,8.0 (설치 작업이 끝난 후에는 삭제할 예정임. 뭐, 공간 남으면 그대로 둬도 무해하다.)

 

 

JOSSO Gateway 설치

 

Gateway는 뭔가 ‘통로’가 되는 도구로서, 인증 서버의 모듈을 의미한다. 대비되는 개념으로는 Agent가 있다.

 

윈도 커맨드 창(cmd)을 열어, cd c:toolsjosso-1.8.0bin 으로 가서, josso-gsh 실행

 

잠깐, 설치하려는 target인 tomcat의 버전을 확인. xampp 1.7.2 패키지의 add-on인 tomcat 버전은, 6.0.20이다.

따라서, 위의 josso-gsh 쉘에서 실행해야 할 설치 명령은 아래와 같다.

 

gateway install --target "$TOMCAT_HOME" --platform tc60
exit

 

순진하게 그대로 하면, 다음과 같은 에러를 보게 된다.

 

당연히, $TOMCAT_HOME과 같은 환경변수는 설정되어 있지도 않고, 더구나 현재 설치하려는 시스템은 ‘윈도’이므로 위와 같은 게 먹히지도 않는다. 그냥, 직접 지정해주자.

 

애석하게도, “c:toolsxampptomcat” 과 같이 지정해주면, 위와 같은 에러가 난다. ‘경로’를 표시해주는 방식을 ‘유닉스 스타일’로 바꿔주자.

 

뭔가 꽤 많은 파일들이, 곳곳에 설치된다. 훗날을 위해, 잘 기억해두는 게 좋겠다.

Install JOSSO Gateway Configuration
  Generating    ['Remember Me' AES key]                                     [OK
  ] Created file:///Z:/Temp/josso-auth.properties
  Installing    [josso-auth.properties]                                     [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-auth.properties
  Using         ['memory' default configuration]                            [OK
  ] Installing josso-gateway-memory-stores.xml as josso-gateway-stores.xml
  Installing    [josso-credentials.xml]                                     [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-credentials.xml
  Installing    [josso-gateway-auth.xml]                                    [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-auth.xml
  Installing    [josso-gateway-config.xml]                                  [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-config.xml
  Installing    [josso-gateway-db-stores.xml]                               [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-db-stores.xml
  Installing    [josso-gateway-jmx.xml]                                     [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-jmx.xml
  Installing    [josso-gateway-ldap-stores.xml]                             [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-ldap-stores.xml
  Installing    [josso-gateway-memory-stores.xml]                           [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-stores.xml
  Installing    [josso-gateway-memory-stores.xml]                           [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-memory-stores.xml
  Installing    [josso-gateway-selfservices.xml]                            [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-selfservices.xml
  Installing    [josso-gateway-web.xml]                                     [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-gateway-web.xml
  Installing    [josso-users.xml]                                           [OK
  ] Created file:///c:/tools/xampp/tomcat/lib/josso-users.xml

Deploy JOSSO Gateway Application
  Installing    []                                                          [OK
  ] Created file:///c:/tools/xampp/tomcat/webapps/josso
  Unjar         [josso-gateway-web-1.8.0.war]                               [OK
  ] file:///c:/tools/xampp/tomcat/webapps

 

다소 쫌 특이하게도, josso-*-xml 설정파일들이 tomcat/lib 폴더에 깔린다.

그리고, 이건 내 컴퓨터만의 특이사항인데, 램디스크를 TEMP 폴더로 사용하고 있어서 인지,

josso-auth.properties 파일이 Z:/TEMP 폴더에 생겼다. 이거 나중에 모르고 지워질 수도 있는데, 어째, 쬐금, 불안하다. 아, 다시 자세히 보니, 똑같은 파일을  c:/tools/xampp/tomcat/lib/josso-auth.properties 로도 이미 가지고 있다. 걱정안해도 되겠다.

 

설정파일 이외에 주요 프로그램들은 모두 webapps/josso 라는 폴더에 모아져 있다.

 

자, tomcat을 재시동하고, 아래 URL을 방문해보자.

 

http://localhost/josso/signon/usernamePasswordLogin.do

http://localhost:8080/josso/signon/login.do

 

 

기본으로 설정되어 있는 사용자 아이디와 패스워드는 아래와 같다. 참고로, 이 값들은, josso-credentials.xml 에 들어있고, 상세정보는 josso-users.xml 에 들어있다.

 

user1user1pwd
user2user2pwd
tomcattomcatpwd

 

위 페이지에 입력하고 ‘Login’ 버튼을 누르면, 짜잔~

 

 

혹시나 해서, 현재 로그인되어 있는 페이지에서 브라우저 쿠키값을 아래와 같이 확인해봤다. JOSSO Session 값과는 다르다.

 

 

PHP JOSSO Agent 설치

 

설치방법은 다소 좀 복잡하다. 우선, 소스에 있는 압축파일을 열어본다. C:Toolsjosso-1.8.0distagentssrcjosso-php-agent-1.8.0-.zip . 폴더가 두 개 있다. 각각 다르게 설치해준다.

 

josso-php-incagent 프로그램 기본 클래스, 설정파일php.ini include_path가 설정된 폴더에 압축해제하거나, 아예 include_path에 넣어준다.
josso-php-partnerappagent 프로그램 기본 모듈, 실제 사용xampp/htdocs/josso-php-partnerapp 폴더로 압축해제

 

실제 배치된 파일들의 위치는 아래와 같다.

include_path = ".;C:ToolsxamppphpPEAR;C:ToolsphpLibs"
C:ToolsphpLibsjosso-php-inc

 

C:Toolsxampphtdocsjosso-php-partnerapp
josso-login.php
josso-logout.php
josso-security-check.php

 

약간의 편집작업이 필요하다. 위의 josso-php-partnerapp 폴더의 파일들을 모두 열어서 아래 행을 프로그램 첫 부분에 넣어준다.

include_once("josso-php-inc/josso.php");

 

자, 이제, 아래 URL을 열어본다. 심각한 에러 발생!

http://localhost/josso-php-partnerapp/josso-login.php

 

Fatal error: Cannot redeclare class soapclient

 

josso-php-inc에 포함된 nusoap이 문제다. soapclient 라는 클래스가 PHP 5.x 버전 내장 함수와 충돌한다. 해결책은?

 

다소, 욱하지만, nusoap 파일들을 모두 열어서, 이름을 바꾸기로 하자.

 

JOSSO 실험: 동일 도메인 localhost

 

다시, 페이지를 열어본다.

http://localhost/josso-php-partnerapp/josso-login.php

 

 

위의 주소창을 잘 살펴보면, 뭔가 길게 자동으로 바뀌었음을 알 수 있다. 일단, tomcat으로 이동했고, 로그인 입력 화면으로 바뀌었다.

 

사용자 아이디와 패스워드를 입력: user1 user1pwd user2 user2pwd 아무거나 하나. 다시, 원래의 사이트로 되돌아 왔다. 발급받은 SSO Session 아이디는 아래와 같다.

 

 

위 페이지에서 쿠키값을 조사해보면 아래와 같다.

 

 

JSESSIONID=108F74E8CEE37C7F7723B5ACC25BB516; PHPSESSID=e1p5ar37it63ouidebvvc557o2; JOSSO_SESSIONID=2A9C149F0644E76B97AB5DBC20ECD69B

 

현재, IDP(Identity Provider, 인증서버)와 SP(Service Provider, 서비스 서버, partnerapp 서버)가 모두 localhost라는 도메인을 가지고 있기 때문에, JSESSIONID, PHPSESSID, JOSSO_SESSIONID 모두 다 보인다.

 

쿠키 정보 추적을 위해, 좀더 편리한 firefox를 사용해보자.

http://localhost/josso-php-partnerapp/josso-login.php

 

 

 

로그인 완료후에 되돌아온 페이지, 새로 추가된 쿠키

 

아참, 여기서 궁금증. 어떻게 josso gateway는 php partnerapp에게 요청을 되돌려 줄 때, 원래 시작된 페이지 URL이 아닌 http://localhost/josso-php-partnerapp/josso-security-check.php 로 되돌려 준다는 걸 알고 있는 걸까? 그리고, josso_assertion_id=0B7ED2FE61F361EB 이건 뭘까?

 

우선, 소스 코드를 좀 보자.

josso-security-check.php

include_once("josso-php-inc/josso.php");

// Resolve the assertion :

$assertionId = $_REQUEST['josso_assertion_id'];
$backToUrl = $_SESSION['JOSSO_ORIGINAL_URL'];

$ssoSessionId = $josso_agent->resolveAuthenticationAssertion($assertionId);

// Set SSO Cookie ...
setcookie("JOSSO_SESSIONID", $ssoSessionId, 0, "/"); // session cookie ...
$_COOKIE['JOSSO_SESSIONID'] = $ssoSessionId;

if (isset($backToUrl)) {
    forceRedirect($backToUrl, true);
}

// No page is stored, just display this one ...
// Get current sso user information,
$user = $josso_agent->getUserInSession();

 

'josso_assertion_id'는 josso gateway에 인증이 확실한지를 다시 확인해보는 기능인 듯. 2번째 호출하면 금방 값의 유효성이 증발한다.

 

그리고, $_SESSION['JOSSO_ORIGINAL_URL']에 값이 설정되어 있으면, 원래의 페이지로 넘어갈 수 있다는 의미인 듯... 이건 어디서 설정해주는 걸까? 알았다.

 

JOSSO PHP 코드를 들여다 보니, 뭔가를 좀 알겠다.

 

josso.php

 

이를테면, josso-security-check.php 가 gateway로부터의 통로가 되는 셈이다. 이 모듈을 통해서 ssoSessionId를 받아서, 서비스 서버에 쿠키로 심어주는 역할이다. 이 때, ssoSessionId 를 그냥 url 변수로 받으면 외부에 그대로 노출되어 위험하기 때문에, 'josso_assertion_id’ 를 통해서 받아서 그걸 입력으로 해서 gateway 서버와 soap 통신을 해서 ssoSessionId 받는다. 일종의 Injection을 수행해주는 모듈이다. 아마도 이 기능 때문에, cross domain sso가 가능한 것인 듯 싶다.

 

예제로 주어진 파일들이 josso_current_url 이란 변수를 입력으로 받아서 처리해주기 때문에...

 

간단하게 값을 덤프해주는 페이지를 하나 만들자. [아랫 부분에 sample로 제공되는 예제가 더 쉽다. 굳이 이 부분은 만들지 않아도 된다.]

 

dump.php

<?php

include_once("WLib/Utils.php");

Utils::dump($_REQUEST, '$_REQUEST');
Utils::dump($_GET, '$_GET');
Utils::dump($_POST, '$_POST');
Utils::dump($_SESSION, '$_SESSION');
Utils::dump($_COOKIE, '$_COOKIE');

WLib/Utils.php

class Utils
{

    /**
     * mimic Zend_Debug::dump()
     * @param mixed variable anything like mixed, array, object
     * @param string variable name and the other comments
     * @return void
     */
    public static function dump($var, $title='')
    {
        ob_start();
        echo "n";
        if (!empty($title)) {
            $backTraces = debug_backtrace();
            $file = basename($backTraces[0]['file']);
            $line = $backTraces[0]['line'];
            if (isset($backTraces[1]['function'])) {
                $func = $backTraces[1]['function'];
            } else {
                $func = "";
            }
            echo "{$title} : {$func}() of {$file} : {$line} linen";
        }
        var_dump($var);
        $out = ob_get_contents();
        ob_end_clean();
        if (php_sapi_name() == 'cli' || extension_loaded('xdebug')) {
            // Console or xdebug
            echo $out;
        } else {
            // Web
            $out = str_ireplace('</textarea>', '< / textarea >', $out);
            $rows = 1 + substr_count($out, "n");
            echo "<textarea rows='" . $rows . "' style='width: 100%'>n";
            echo $out;
            echo "</textarea>n";
        }
    }

}

 

http://localhost/josso-php-partnerapp/josso-login.php?josso_current_url=http://localhost/josso-php-partnerapp/dump.php

http://localhost/josso-php-partnerapp/josso-login.php?josso_current_url=http://localhost/josso-php-partnerapp/dump.php

http://localhost/josso-php-partnerapp/josso-logout.php?josso_current_url=http://localhost/josso-php-partnerapp/dump.php

http://localhost/josso-php-partnerapp/josso-logout.php?josso_current_url=http://localhost/josso-php-partnerapp/dump.php

 

로그인을 하게 되면, 아래 페이지로 되돌아온다. 그런데, 특이한 게 있다.

 

 

$_GET과 $_POST에는 값이 없음에도 불구하고, $_REQUEST에는 값이 버젓이 들어있다. 이거 언제 누가 넣은걸까? 쿠키가 설정되면, 자동으로 설정되는 것인 듯...

 

josso-security-check.php 중간에 잠깐 흐름을 끊어서 출력해봄.

 

JOSSO 실험: 다른 도메인 cross domain

 

만약, 인증서버와 서비스서버의 도메인이 서로 다르면 어떻게 될까? 실제 도메인을 등록해서 실험해도 좋겠지만, 간단하게 로컬에서만 실험할 것이므로, hosts 파일을 열어서 설정한다.

  • windows > system32 > drivers > etc > hosts 
  • C:WINDOWSsystem32driversetchosts

 

 

그리고, 실험을 좀더 간단하게 하기 위해,,, sample.php 페이지를 만든다. 소스 코드 압축파일 풀어놓은 곳에서 찾아보면,,,

C:Toolsjosso-1.8.0distsamplesappsjosso-partner-php-1.8.0-.zip 이라고 있다. 이 파일들을 htdocs/josso-php/ 폴더에 풀어놓자. [josso 라고 짧게 이름을 주면 좋겠지만, apache와 tomcat을 연동시켜 놓은 상태라면, tomcat에 이미 그 이름의 폴더가 있다. tomcat이 이긴다. php 파일이 없다고 나온다.]

 

index.php

sample-ask-login.php

 

두 파일 모두 편집기에서 열어서, 첫줄에 아래와 같이 추가해준다. josso agent 모듈의 경로를 지정해주는 일이다.

 

http://aaa.com/josso-php/ 제공된 링크를 눌러서 로그인하면 로그아웃을 위한 링크가 나온다. 누르면, 다시 로그인 링크 나오고...

 

 

 

도메인을 바꿔서 접속해보면, aaa.com 에서 이미 로그인 된 상태였더라도, bbb.com에서는 새로 로그인하라는 화면이 뜬다.

 

 

이것은, 정확히 ‘쿠키’가 없기 때문이다. aaa.com 에서는 이미 로그인했었으므로 ‘쿠키’가 있지만, bbb.com에서는 아직 ‘쿠키’가 없다. 로그인 링크를 눌러보자. 엇, 로그인 입력 화면이 안 뜨고 바로 로그인이 된 것으로 나온다. 인증서버엘 갔더니 이미 ‘쿠키’가 있어서, 바로 로그인 상태로 만들어진 것이다. 이 과정을 좀더 눈에 안뜨이게 할 수 있으면, cross domain sso의 최종적 완성이라고 할텐데... 이 예제에서는 반드시 로그인 링크를 눌러야만 한다.

 

조금 다른 예제를 살펴보자. (브라우저 쿠키를 모두 지우던가, 브라우저를 껐다가 새로 켠다.)

http://aaa.com/josso-php/index.php 이 페이지를 연 다음, 로그인 입력을 하고 로그인한다. 그 다음 아래 URL을 주소창에 그대로 쳐본다.

http://bbb.com/josso-php/sample-ask-login.php

 

 

바로 로그인이 되어 있는 상태로 나왔다. 어떻게 이게 가능한 것일까? 비밀은 소스에 있었다.

 

 

눈깜짝할 새에 벌써 저쪽 인증서버에 한 번 갔다온 것이다.

 

http://bbb.com/josso-php/index.php 다시, 이 페이지를 연 다음, 로그아웃을 한다. 그 다음 아래 URL을 주소창에 그대로 쳐본다.

http://bbb.com/josso-php/sample-ask-login.php 아래와 같이 로그인 요청 화면이 뜨면, 맞다.

 

 

 

http://aaa.com/josso-php/index.php 이 주소로 로그인하고, 탭을 열어서 아래 주소를 입력했다가, 다시 로그아웃하고, 아래 주소를 확인해보자.

http://bbb.com/josso-php/sample-ask-login.php  마찬가지로, 로그인되어 있을 때는 화면이 보였다가, 로그아웃 후에는 로그인 요청 화면이 보인다.

List of Articles
번호 제목 글쓴이 날짜 조회 수

XE Login