Java와 PHP를 위한 SSO 모듈인 JOSS(Java Open Single Sign-On)를 정리한다. JOSSO는 J2EE와 Spring 기반의 SSO 솔루션 이다.
Windows 환경에서 Apache Tomcat 6.0.16에 JOSSO Gateway(Idp)를 설치 한다. 사용자 인증을 위해서는 MySQL 5.0.51을 사용 한다.
{{MySQL DB 설정|JOSSO|jossodb|josso}}
MySQL Query Browser를 실행하여 jossodb에 josso 사용자로 로그인 한다.
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;
```
JOSSO가 정상 실행되는지 테스트를 원할 경우 다음 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-1.8.0.zip를 다운로드 한다.
DOS 창에서 JOSSO Agent를 다음과 같이 설치 한다.
cd d:/josso/bin
josso-gsh.bat
gateway install --target "$TOMCAT_HOME" --platform tc60
exit
"%JAVACMD%" %JAVA_OPTS% -jar "%BOOTJAR%" %ARGS% 를 삭제하고 아래 라인을 추가
java %JAVA_OPTS% -jar "%BOOTJAR%" %ARGS%
설치가 정상적으로 진행이 되면 $TOMCAT_HOME 아래에서 다음 사항을 확인할 수 있다.
설치가 완료된 후 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
MySQL용 JDBC Driver를 설정한다.
$TOMCAT_HOME/lib/josso-gateway-config.xml 파일에 사용자 정보 저장소로 DB 설정 정보를 사용하도록 수정 한다.
<!-- Identity, Session and Assertion Stores configuration -->
<!--
-->
$TOMCAT_HOME/lib/josso-gateway-db-stores.xml 파일에서 DB 정보를 설정 한다.
$TOMCAT_HOME/lib/josso-gateway-auth.xml 파일에서 기본 인증 정보를 수정한다.
hashAlgorithm, hashEncoding를 삭제하여 암호가 Plan Text로 저장되도록 한다.
Windows 환경에서 PHP 5.2.5에 JOSSO Agent(SP)를 설치 한다.
mkdir c:/php/includes
c:/php/includes 아래에 d:/josso_php/josso-php-inc 폴더를 통채로 복사한다.
include_path = ".;c:\php\includes"
auto_prepend_file = "josso-php-inc\josso.php"
JOSSO Agent 설정 파일(c:/php/includes/josso-php-inc/josso-cfg.inc)에서 다음을 수정 한다.
// 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 설정 확인
샘플 : Jossify Your PHP Application
Windows 환경에서 Apache Tomcat 6.0.16에 JOSSO Agent(SP)를 설치 한다.
여기서는 JOSSO Gateway가 설치된 장비에 JOSSO Agent를 설치 한다.
cd d:/josso/bin
josso-gsh.bat
agent install --target "$TOMCAT_HOME" --platform tc60
exit
JOSSO Agent 설정 파일($TOMCAT_HOME/lib/josso-agent-config.xml)을 수정 한다.
http://Gateway_서버_IP_or_URL:8080/josso/signon/login.do
http://Gateway_서버_IP_or_URL:8080/josso/signon/logout.do
<protocol:ws-service-locator endpoint="http://Gateway_서버_IP:8080" />
<agent:partner-app id="Confluence" context="/confluence"/>
위에서 정리한 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를 위한 라이브러리 파일 설정
Agent 적용을 위한 Filter 설정
jossoAgent
pnus.josso.LoginFilter
jossoGatewayLoginUrl
http://localhost/josso/signon/login.do
jossoGatewayLogoutUrl
http://localhost/josso/signon/logout.do
jossoEndpoint
http://localhost
flag_josso
true
실제 JOSSO와 통신하여 SSO 처리를 하는 LoginFilter.java를 컴파일하여 /WEB-INF/classes/pnus/josso/LoginFilter.class 로 복사 한다.
Tomcat을 재기동하여 JOSSO Web Service Agent가 정상적으로 동작하는지 확인 한다.
[Xpress Engine에 JOSSO 적용](Xpress Engine.md#JOSSO_적용.md)
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) : 로그아웃 페이지 호출
로그아웃 후 인수로 전달된 페이지 호출
action 에서
debug
5 이 값을 변경하여 로그를 남김
'''JOSSO의 SSO 적용 방안''' SSO(Single-Sign-On)을 하기 위해서는 자동적으로 세션 정보가 생성되고 관리 되어야 한다. 다음과 같은 규칙을 SSO가 필요한 프로그램에 적용한다.
if (접속 시스템의 세션 정보가 있으면) {
접속 시스템의 세션 정보를 삭제 한다.
}
if (로그인 또는 로그아웃 요청일 경우) {
분기 화면 정보로 디폴트 페이지를 설정 한다.
} else {
분기 화면 정보로 접속하려던 페이지를 설정 한다.
}
JOSSO 로그인 화면을 보여 준다.
JOSSO에 로그인이 되었을 경우 분기 화면을 보여 준다.
if (로그인 요청일 경우) {
디폴트 페이지를 호출 한다.
exit;
}
if (로그아웃 요청일 경우) [ 접속 시스템의 세션 정보를 삭제 한다.
반드시 접속 시스템에서 사용하는 세션 정보만 삭제 한다.
모든 세션 정보를 삭제하면 JOSSO도 비정상 동작 한다.
분기 화면 정보로 디폴트 페이지를 설정 한다. JOSSO에서 로그아웃을 한다. JOSSO 로그인 화면을 보여 준다. exit }
if (접속 시스템의 세션 정보와 JOSSO의 세션 정보가 틀릴 경우) { 접속 시스템의 세션 정보를 삭제 한다. } if (접속 시스템의 세션 정보가 없을 경우) { 접속 시스템의 세션 정보를 생성 한다. } 원래 페이지 코드를 계속 처리 한다. ```
사용자 정보 동기화 방안
역할 정보 동기화 방안
30