인증 및 세션 처리

이 장에서는 Nex-UP을 통해 개발 된 애플리케이션의 인증 및 세션 처리에 대해 설명합니다.

Nex-UP은 인증 및 세션 관리를 위한 기본적인 서비스를 제공하고 있으나, 반드시 Nex-UP 서버에서는 적절한 설정을 해야 하고, 넥사크로 애플리케이션에서 로그인 및 로그아웃에 대한 적절한 처리가 필요하다.

Nex-UP에서의 인증처리

Nex-UP에서 제공하는 인증 처리는 넥사크로 애플리케이션에서 세션에 들어갈 데이터를 조회하는 서비스를 하나 생성하여 호출하고config.properties파일에 정의된 bean.sessionHandler.login, bean.sessionHandler.logout의 속성값으로 세션을 생성하고 파기할 수 있다.

해당 정보는 Nex-UP 서버 설정을 통해 반드시 변경하도록 합니다.

Nex-UP 서버에서의 설정 항목

Nex-UP 서버에서의 설정 항목은 다음과 같습니다.

session (authentication)

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>를 통해 반드시 설정하도록 한다.