Single Sign-On의 약자로 여러 개의 사이트에서 한 번의 로그인으로 여러 가지 다른 사이트들을 자동적으로 접속하여 이용하는 방법
그룹웨어 등의 응용 프로그램을 사용하기 위해 어느 컴퓨터에 로그인한 후 또 다른 서버상의 응용 프로그램을 사용할 때 일반적으로 서로 다른 시스템 및 사이트에서 각각의 사용자 정보를 관리하게 되는데 필요에 따라서 사용자 정보를 연동하여 사용해야 하는 경우도 생기게 된다.
하지만 통합인증을 도입한 환경에서는 사용자는 하나의 아이디와 비밀번호로 모든 기능을 사용할 수 있게 된다.
즉 하나의 시스템에서 인증을 할 경우 타 시스템에서는 인증 정보가 있는지 확인하고 있으면 로그인 처리를 하도록 하고 없는 경우 다시 통합 인증을 할 수 있도록 만드는 것을 의미한다.
고객사 서비스 구조는 아래와 같았다.
고객사 그룹웨어 ▶ erp ▶ 회사 솔루션
그룹웨어에서 로그인을 하고 erp에 접근하여 회사 솔루션 서비스를 이용하는 것이다.
서비스 기반(사진)으로 하여
sso 전문 업체 연계 솔루션을 사용했는데 해당 업체에서는 세션 ID를 활용했던 것으로 기억한다.
세션 ID를 저장할 때 사용자의 id와 사원번호를 key 값으로 넘겨주고 그룹웨어에서 로그인할 때 세션 ID와 key 정보들을 저장 후 erp에서 앞에서 저장된 세션 ID를 통해 key 값을 가져온 후 사원 정보를 조회한다. 회사 솔루션에서도 해당 세션 ID를 통해 key를 전달받는다.
보안상의 이유로 sso와 관련된 코드만 간단히 정리해보면
✔index.jsp
//objLogin(로그인 정보 객체)가 null일경우
if (objLogin == null) {
//기본 로그인 페이지
sMovePage = "../../comlogin.xml";
//개발환경이 아닐경우 (=운영 서버일 경우)
if ((!devType.equals("dev"))){
//세션아웃일 경우
if (isSessionTimeout.equals("1")){
//sSSOUrl = 그룹웨어 url
response.sendRedirect(sSSOUrl);
} else {
//sso로그인
response.sendRedirect("../../SSOLogin.do");
}
}
//로그인 정보 있을 경우
} else {
//메인프레임 이동(서비스 화면 이동)
sMovePage = "../../commainframe.xml";
}
✔SSOLogin.do
try {
//개발, 운영에서만 SSO 체크 확인
if (!InbusCoreConfig.get("_envMode").equals("dev")) {
//sso연계 솔루션 업체 코드
//sso통신 확인 및 세션id체크
//sso오류시 예외처리
}
//아이디로 조회한 결과가 존재할 경우..
if (분기 조건문) {
//로그인 성공
//세션에 로그인 정보 저장
} else {
throw new AuthenticationException("예외처리");
}
//예외처리
} catch (AuthenticationException ae) {
//Potal에 로그인된 사용자가 아닙니다.
mav.setViewName("redirect:/index.jsp");
} catch (ProcessException pe) {
//SSO 서버에 오류가 발생하였습니다
mav.setViewName("redirect:/index.jsp");
} catch (AgentException SSOE) {
//SSO 서버와 제대로 통신이 안되거나 (설정파일 문제일수 있음)
mav.setViewName("redirect:/index.jsp");
} catch (Exception e) {
//로그인 중 오류가 발생하였습니다
mav.setViewName("redirect:/index.jsp");
}
return mav;
세션 타임아웃
이상하게 erp에서 타 서비스를 이용하다가 우리 쪽 서비스에 접근하면 세션이 날아가는 현상이 지속적으로 발생했다.
처음에는 sso 업체의 설정 id 값이 잘못되어 세션이 계속 끊기는 줄 알았는데 그렇게 되면 erp 위에 올라가있는 다른 서비스들도 일정 시간이 지나면 세션이 끊겨야 하지만 그렇지 않았기에 우리 쪽에 문제가 있음을 확인했다...🤦♂️
확인해 보니 그룹웨어 아래 서비스들은 모두 최상위 서비스인 그룹웨어의 세션 값으로 설정을 시켜야 하는데 우리 쪽 서비스에 세션 아웃을 제거하지 않은 것이다.
(기존에 일정 시간 동안 트랜잭션이 일어나지 않을 경우 세션을 끊게 설정해놨다.)
WEB-INF/web.xml 파일에 <session-config>
세션 설정하는 부분이 있는데 -1로 하여 무한대로 설정하여 최상위 서비스의 세션 아웃이 되지 않는 이상 우리 서비스도 계속 살아있게 해두었다.
<session-config>
<session-timeout>-1</session-timeout>
</session-config>
혹시 세션을 -1로 해두었음에도 불구하고 세션이 계속 끊긴다면 어딘가에서 강제로 세션을 끊는 부분이 있다는 것이다.
예를 들어 로그아웃이나 강제로 세션을 종료하는 트랜잭션 쪽을 보면
session.invalidate()
메서드를 사용하는 부분이 있을 텐데 이 부분을 수정하면 된다.