이 장에서는 Nex-UP을 통해 개발 된 애플리케이션의 인증 및 세션 처리에 대해 설명합니다.
Nex-UP은 인증 및 세션 관리를 위한 기본적인 서비스를 제공하고 있으나, 반드시 Nex-UP 서버에서는 적절한 설정을 해야 하고, 넥사크로 애플리케이션에서 로그인 및 로그아웃에 대한 적절한 처리가 필요하다.
Nex-UP에서의 인증처리
Nex-UP에서 제공하는 인증 처리는 넥사크로 애플리케이션에서 세션에 들어갈 데이터를 조회하는 서비스를 하나 생성하여 호출하고config.properties파일에 정의된 bean.sessionHandler.login, bean.sessionHandler.logout의 속성값으로 세션을 생성하고 파기할 수 있다.
해당 정보는 Nex-UP 서버 설정을 통해 반드시 변경하도록 합니다.
Nex-UP 서버에서의 설정 항목
Nex-UP 서버에서의 설정 항목은 다음과 같습니다.
Name | Type | Description |
---|---|---|
bean.sessionHandler.useSession | Boolean | 세션 처리를 수행 할지에 대한 설정입니다. 개발 편의상 사용하지 않을수는 있으나, 가능한 한 반드시 사용합니다. |
bean.sessionHandler.sessionName | String | 세션에 저장되는 객체의 이름입니다. |
bean.sessionHandler.login | String | 로그인을 수행할 가상의 서비스 이름입니다. 해당 이름은 넥사크로 플랫폼에서 addService(' ')에 사용되는 서비스 명칭입니다. 로그인이 성공적으로 수행되게 되면 세션 정보를 생성합니다. |
bean.sessionHandler.loginSuccessCondition | String | 인증 처리를 위한 조건을 설정합니다. mybatis에서의 dynamic query에서 사용하는 조건과 동일하게 설정할 수 있습니다. (예 : #{dsAuthenticated.id} != null) 해당 조건에서 사용되는 데이터는 addService('login') 이전에 addService 된 서비스들의 데이터를 사용하여 조건을 설정합니다. |
bean.sessionHandler.loginErrorCode | Integer | 로그인이 실패하였을 경우 응답으로 전송할 에러 코드를 설정합니다. |
bean.sessionHandler.loginErrorMsg | String | 로그인이 실패하였을 경우 응답으로 전송할 에러 메시지를 설정합니다. |
bean.sessionHandler.logout | String | 로그아웃을 수행할 가상의 서비스 이름입니다. 로그아웃을 하고난 뒤 세션 정보를 파기 합니다. |
bean.sessionHandler.includePatterns | String | 인증이 필요한 서비스의 패턴을 설정합니다. 복수개를 지정하는 경우 콤마(,)를 기준으로 설정합니다. (예 : account.*,sales.* 혹은 **.* 을 설정하여 모든 서비스를 대상으로 지정할 수 있습니다.) 가능한 **.*를 설정하여 모든 서비스가 인증이 필요하도록 합니다. |
bean.sessionHandler.excludePatterns | String | 인증이 필요하지 않은 서비스의 패턴을 설정합니다. 'includePatterns' 보다 우선시 하여 처리 됩니다. |
넥사크로 애플리케이션에서의 처리
넥사크로 애플리케이션에서는 적절하게 로그인 및 로그아웃 처리를 수행하여야 합니다.
아래는 사용자 아이디와 비밀번호를 입력받아 로그인을 수행하고, 로그아웃 처리를 하는 예제 입니다.
제공되는 예는 예제일 뿐이며, 사이트에서 적절하게 변경하여야 합니다.
먼저 Nex-UP 서버에서의 설정은 다음과 같다. 설정파일은 config/config.properties이다.
bean.sessionHandler.useSession=true bean.sessionHandler.sessionName=sessionData bean.sessionHandler.login=login bean.sessionHandler.loginSuccessCondition=#{dsUser.STATUS} == 'OK' bean.sessionHandler.loginErrorCode=-1 bean.sessionHandler.loginErrorMsg=Please check your login information again. bean.sessionHandler.logout=logout bean.sessionHandler.includePatterns=**.* bean.sessionHandler.excludePatterns=nonsession.**.*, StartKit.EX_LOGIN
위 설정은 가상의 'login' 서비스 요청이 있을 경우 사용자 정보(아이디, 비밀번호)를 통해 StartKit.EX_LOGIN 서비스를 실행하고 해당 서비스의 출력인 데이터셋 (dsUser)의 STATUS 컬럼 정보가 'OK' 인지 확인하고 있다.
사용자 정보를 통한 서비스 조회 쿼리는 다음과 같다.
SELECT USERID,
EMAIL,
FIRSTNAME,
LASTNAME,
STATUS,
ADDR1,
ADDR2,
CITY,
STATE,
ZIP,
COUNTRY,
PHONE
FROM SIGNON AS A JOIN ACCOUNT AS B ON A.USERNAME= B.USERID
WHERE A.USERNAME = #{USERID}
AND A.PASSWORD = #{PASSWD}
bean.sessionHandler.includePatterns의 속성값을 설정하여 서버에 생성된 session값의 존재여부를 체크하도록 할 수 있으며 bean.sessionHandler.excludePatterns의 속성값을 설정하여 session값체크를 하지 않도록 서비스를 지정할 수 있다. 예제에서는 로그인가능여부를 체크하기위한 서비스 StartKit.EX_LOGIN를 제외하도록 설정하였다.
로그인 처리
로그인을 처리하기 위해 아래와 같은 형태로 처리 할 수 있다.
로그인을 수행하기 전 인증을 하기 위해 사용자 정보(아이디, 비밀번호)를 통해 정보를 조회한다.
조회 된 데이터를 이용하여 실제 인증을 수행한다.
넥사크로 애플리케이션의 호출코드는 아래와 같다.
this.login_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { //Service Add(StartKit.EX_LOGIN) (config.properties파일의 bean.sessionHandler.excludePatterns에 StartKit.EX_LOGIN 추가) nexup.AddService(this, "StartKit.EX_LOGIN", "", "dsUser=dsUser", "USERID="+ this.divLoginBase.edt_id.value +" PASSWD="+ this.divLoginBase.edt_pwd.value); //로그인 세션을 생성하기 위한 서비스(config.properties파일의 bean.sessionHandler.login에 정의함) nexup.AddService(this, "login"); //Call Service nexup.CallService(this, "login", "fn_CallBack"); }
로그아웃 처리
로그아웃을 처리하기 위해 아래와 같은 형태로 처리 할 수 있다.
로그아웃을 수행한다.
정상적으로 로그아웃이 수행된 경우 로그인 사용자 정보를 삭제한다.
넥사크로 애플리케이션의 호출코드는 아래와 같다.
this.logout_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { nexup.AddService(this, "logout"); //Call Service nexup.CallService(this, "logout", "fn_CallBack"); }
세션 관리
세션 만료 시간 설정
적절한 세션만료 기능이 구현되어있지 않거나 혹은 로그아웃 기능은 있지만 세션을 만료하지 않거나, 아예 사용자들에게 로그아웃 기능 자체가 구현되어 있지 않을 경우 서버에서는 해당 세션이 종료되기 전까지 유지되어 공격자가 유지된 세션 id를 획득하여 애플리케이션을 계속해서 사용할 수 있게 되는 취약점이 존재한다. 그렇기 때문에 적절한 세션 만료 시간을 설정한다.
web.xml 파일에서 <session-config>를 통해 반드시 설정하도록 한다.