기타(framework)
2017.08.19 / 11:30

SSO(Single Sign On)

디팟
추천 수 31

SSO(Single Sign On)

URL : http://flyingwolf.co.kr/110185218574 ( SSO의 기본 개념 )

URL : http://blog.naver.com/joycestudy?Redirect=Log&logNo=100086631671 ( SSO의 구현 )​

1. SSO(Single Sign On)의 기본 개념

* 통합 인증 체계(SSO)의 정의

 - 한 번의 시스템 인증을 통해 접근하고자 하는 다양한 정보시스템에 재인증 절차 없이 접근할 수 있도록 하는 통합 로그인 솔루션.

 

SSO 적용 이전

 - 각 시스템별로 개별적인 ID와 패스워드 사용

 - 패스워드를 잊어버리기 쉬움

 - 패스워드 관리가 어려워 보안사고의 가능성이 높음

 - 패스워드 관리 감독이 복잡

 

SSO 적용 이후

 - 로그인시 한 번만 ID와 PW를 입력해서 다른 시스템에 편리하게 접속이 가능

 - 패스워드를 잊어버릴 가능성이 줄어듦

 - 패스워드 관리가 편해지고 보안수준도 올라감

* SSO 구성요소

 - 사용자

  . 개별 ID/Password 로그인 시도

 

 - 인증 서버

  . ACL을 통한 통합 인증서버

 

 - LDAP

  . 네트워크상의 자원들을 식별하고,

  . 사용자와 Application들이 자원에 접근할 수 있도록 하는 네트워크 디렉터리 서비스

 

 - SSO Agent

  . 각 정보시스템에 자동인증 정보(Token) 송수신 수행

 

* SSO 장단점 비교

 - 장점

  . 운영비용 감소

  . 보안성 강화

  . 사용자 편의성 증가(패스워드 분실 위험 감소)

  . 중앙집중 관리를 통한 효율적인 관리 가능

 

 - 단점

  . SSO 서버가 단일 실패 지점

  . SSO 서버 침해 시 모든 서버의 보안 침해

  . SSO 개발 및 운영비용 발생

 

엑스트라넷 접근 관리(Extranet Access Management, EAM)

 - 한 번 로그인으로 여러 서버에 접근할 수 있는 싱글사인온 기능과 

  권한에 따라 차등적으로 자원에 접근하게 해주는 보안성을 제공하는 솔루션. 

 - 일반 기업과 금융권, 포탈 등 기업 내 사용자와 일반 사용자에게 적용이 가능하며 인터넷 뱅킹, 

  쇼핑 등 서비스 편의성과 운영비 절감 및 기업 내 보안 효과가 있다.

 

2. 구현

URL : http://blog.naver.com/joycestudy?Redirect=Log&logNo=100086631671

아주 오래전에 SSO 관련 솔루션을 찾아보다가, JOSSO를 들여다 본 적이 있었다. 2006년 9월. 그때의 JOSSO 버전이 1.4. 그로부터 시간이, 아니 세월이 많이 흘렀다. 그동안 JOSSO 역시 꽤 많은 변화를 겪었다. 무엇보다도 예전에는 전혀 지원하지 않던 Cross Domain SSO를 이젠 지원한다고 한다. 도메인이 서로 달라도, SSO가 된단다. 그 원리가 문득 궁금해졌다.

 

 

  • http://www.josso.org/ JOSSO 공식 사이트. 혹시 약자가 궁금하신 분을 위해. Java Open  Single Sign-On = JOSSO. 
    2009년 8월 현재, 최신 버전은 1.8. 크로스 도메인 기능을 지원함. PHP, ASP, 클라이언트(에이전트) 모듈 제공

 

 

 

http://www.josso.org/confluence/display/JOSSO1/Architecture+Overview 아키텍춰 개요

 

문서가 생각보다 복잡하다. 너무 멋있게 포장하려고 한 것 같다.

 

 

하지만, 생각보다 간단하다. PHP에서 사용하는 샘플을 보자.

 

 

Sample page

index.php

 <!doctype html public "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Sample Partner Application - JOSSO</title> <meta name="description" content="Java Open Single Signon"> </head> <body> <h1>This is a very simple PHP JOSSO partner application</h1> <?php // jossoagent is automatically instantiated by josso.php, // declared in auto_prepend_file property of php.ini. // If you do not use auto_prepend feature, include josso.php in all your pages // Get current SSO User and SSO Session information, $user = $josso_agent->getUserInSession(); $sessionId = $josso_agent->getSessionId(); // Check if user is authenticated if (isset($user)) { // Display USER INFORMATION // Username associated to authenticated user echo 'Username : ' . $user->getName() . '<br><br>'; // Get a specific user property echo 'user.name=' . $user->getProperty('user.name') . '<br><br>'; // Get all user properties $properties = $user->getProperties(); if (is_array($properties)) { foreach ($properties as $property) { echo $property['name'] . '=' . $property['value'] . '<br>'; } } // Get all user roles $roles = $josso_agent->findRolesBySSOSessionId($sessionId); echo '<h2>Roles</h2>'; foreach ($roles as $role) { echo $role->getName() . '<br>'; } // Check if user belongs to a specific role if ($josso_agent->isUserInRole('role1')) { echo '<h3>user is in role1</h3>'; } echo 'Click <a href="'.jossoCreateLogoutUrl().'">here</a> to logout ...<br>'; echo '<p>SSO Session ID : ' . $sessionId . '</p>'; } else { // User is unknown.. echo '<h2>you are an annonymous user ...</h2>'; echo 'Click <a href="'.jossoCreateLoginUrl().'">here</a> to login ...'; } ?> </body> </html>

 

중간에 괜히 복잡하게 보이는 부분은, user의 role(역할)과 property(속성)을 가져와서 보여주려 하기 때문이고, 실제로는 아주 간단하다.

 

$user = $josso_agent->getUserInSession(); $sessionId = $josso_agent->getSessionId(); // Check if user is authenticated if (isset($user)) { echo 'Click <a href="'.jossoCreateLogoutUrl().'">here</a> to logout ...<br>'; echo '<p>SSO Session ID : ' . $sessionId . '</p>'; } else { // User is unknown.. echo '<h2>you are an annonymous user ...</h2>'; echo 'Click <a href="'.jossoCreateLoginUrl().'">here</a> to login ...'; }

 사용자(user)의 세션(session)이 세션 서버에 있는지를 검사하면, 끝이다.그런데, 사이트의 문서를 아무리 들여다 봐도, cross domain의 원리에 대해서는 나와 있는 게 없다. 결국, 소스를 설치해서 뜯어봐야 알 수 있을 듯... 3. 생각별꺼 없네요.로그인 아이디와 패스워드로 인증을 하고 난 다음에 세션을 만들어서 세션정보를 페이지 호출할때마다 확인하는듯.그러면 HTTPS에서의 public키를 나눠주게 되면, domain이 다른 곳에서는 어떻게 그 키로 인증을 하느냐인데??domain이 다른 곳에 public키를 같이 쓸 수 있게 되었나보네요. ( 인증서 서비스에서 멀티도메인용 인증서를 팔아먹을듯? )역시나 찾아보니 멀티도메인 인증서라는 것을 팔아먹고 있네요.