설정

X-PUSH 동작에 대한 설정은 $XPUSH_HOME/conf/xpush_config.xml 파일을 사용하여 설정합니다. 대부분 값은 배포 시의 값을 그대로 사용할 것을 권장드립니다.

설정을 변경한 후에는 X-PUSH 서버를 재시작해야 변경된 사항이 적용됩니다.

아래에서 설명하지 않은 기타 자세한 설정에 대한 설명은 XPUSH 상세 설정 을 통해 확인 할 수 있습니다.

Web Push 설정

WEB Client에 대한 Push 설정은 다음과 같습니다.

어트리뷰트

설명

ServerBindAddress

Webpush Address

default : 0.0.0.0

Port

Webpush port

default : 50000

IsHttps

HTTPS 사용 유무.

사용하기 위해서는 true로 세팅을 합니다.

HTTPS 를 사용하기 위해서는 SSL 인증서 설정이 되어있어야 합니다. (CertificateService)

<service name="WebPublisher" ...>
	...
	<attribute name="ServerBindAddress">0.0.0.0</attribute>
	<attribute name="Port">50000</attribute>
	<attribute name="IsHttps">true</attribute>
	...
</service>

Runtime Push 설정

Runtime Client에 대한 Push 설정은 다음과 같습니다.

어트리뷰트

설명

ServerBindAddress

RuntimePush Address

default : 0.0.0.0

Port

RuntimePush port

default : 50001

IsSSL

SSL 사용 유무.

사용하기 위해서는 true로 세팅을 합니다.

SSL을 사용하기 위해서는 SSL 인증서 설정이 되어 있어야 합니다.

<service name="RuntimePublisher" ...>
	...
	<attribute name="ServerBindAddress">0.0.0.0</attribute>
	<attribute name="Port">50001</attribute>
	<attribute name="IsSSL">true</attribute>
	...
</service>

메시지 공급 설정

Message Provider에 대한 세부 설정은 다음과 같습니다.

어트리뷰트

설명

ServerBindAddress

Message Provider Address

default : 0.0.0.0

Port

Message Provider port

default : 50002

<service name="Provider" ...>
	...
	<attribute name="ServerBindAddress">0.0.0.0</attribute>
	<attribute name="Port">50002</attribute>
	...
</service>

모니터링 설정

콘솔 모니터링

모니터에 대한 세부 설정은 다음과 같습니다.

어트리뷰트

설명

ServerBindAddress

Message Provider Address

default : 0.0.0.0

Port

Message Provider port

default : 50003

<service name="PushMonitor" ...>
	...
	<attribute name="ServerBindAddress">0.0.0.0</attribute>
	<attribute name="Port">50003</attribute>
	...
</service>

JMX

X-PUSH 서버에는 JMX 를 세팅하는 항목이 4개가 있습니다.

이 4개의 항목은 다음과 같습니다.

어트리뷰트

설명

IsJMX

JMX 사용 여부 (default : false)

IsJMXpassword

Password 사용 여부 (default : false)

JMXrmiRegistryPort

JMX registry Port (default : 50005)

JMXrmiServerPort

JMX server Port (default 50006)

JMXpassword 를 사용하기 위해서는 2개의 파일이 필요합니다. 이 두개의 파일은 XPUSH_HOME/conf/ 디렉터리에 위치해야 합니다.

이 2개의 파일은 jmxremote.password, jmxremote.access 이며 JAVA_HOME/jre/lib/management/ 폴더에 jmxremote.access, jmxremote.password와 같은 형식입니다.

X-PUSH의 JMX 는 JAVA의 JMX 규정을 따르고 있습니다.

http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html

다음은 JMX 설정 예입니다.

<service name="Publisher">
	...
	<attribute name="IsJMX">ture</attribute>
	<attribute name="IsJMXpassword">true</attribute>
	<attribute name="JMXrmiRegistryPort">50005</attribute>
	<attribute name="JMXrmiServerPort">50006</attribute>
	...
</service>

JMXrmiRegistryPort, JMXrmiServerPort 를 세팅해야 JMX 정보를 획득할 수 있습니다.

JMX 항목에서 CPU, Process, Memory, Swap, Network와 같은 System 정보를 확인할 수 있습니다.

어트리뷰트

설명

IsSystemMonitor

System Monitor 사용 여부 (default : false)

<service name="Publisher">
	...
	<attribute name="IsSystemMonitor">true</attribute>
	...
</service>

DB 연결 설정

DBCP Service를 통해 DB 연결을 제어할 수 있습니다.

DBCP Service: 데이터베이스의 connection Pool을 관리 하는 서비스

어트리뷰트

설명

username

Database 접속 할 사용자 ID

password

Database 접속할 사용자 비밀번호

connectUri

접속할 Database의 URI

jdbcClassName

접속할 JDBC의 Class Name

maxActive

서비스에 동시에 사용될 수 있는 최대 커넥션 개수

maxIdle

커넥션 풀에 유지될 수 있는 Idle 상태 커넥션의 최대 개수

minIdle

커넥션 풀에 유지될 수 있는 Idle 상태 커넥션의 최소 개수

maxWait

커넥션 풀에서 사용 중인 커넥션의 개수가 maxActive 개수인 경우 maxWait만큼 기다리게 된다. 만약 maxWait 후에도 사용할 수 있는 여분의 커넥션이 없을 경우 에러를 발생시키게 된다.

validationQuery

The SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row.

testOnBorrow

Pool 에서 커넥션을

얻어올 때 테스트 실행

testOnReturn

Pool 로 커넥션을 반환할 때 테스트 실행

testWhileIdle

Pool 안에 있는 유휴

상태의 커넥션 대상으로 테스트 실행 여부

timeBetweenEvictionRunsMillis

Evictor 스레드가 동작하는 간격


-1 이면 Evictor 스레드의 실행이 비활성

numTestsPerEvictionRun

pool 에 있는 커넥션을

검사할 갯수

minEvictableIdleTimeMillis

커넥션의 유휴 시간을 확인해 커넥션을 제거할 시간

UserInfoEncryptorClassName

DB 접속 계정 정보를 암/복호화하는 클래스명.

isEncrypted

DB 접속 계정이 암호화되었을 경우, true 그렇지않을 경우, false.

자세한 내용은 Apache Commons DBCP 사이트를 참고해주세요.

http://commons.apache.org/proper/commons-dbcp/configuration.html

<service name="DbcpService">    
    <attribute name="username">sa</attribute>
    <attribute name="password"></attribute>
    <attribute name="connectUri">jdbc:h2:tcp://localhost/~/test</attribute>
    <attribute name="jdbcClassName">org.h2.Driver</attribute>
    <attribute name="maxActive">10</attribute>
    <attribute name="maxIdle">0</attribute>
    <attribute name="minIdle">5</attribute>
    <attribute name="maxWait">-1</attribute>
    <attribute name="validationQuery">select 1 from dual</attribute>
    <attribute name="testOnBorrow">true</attribute>
    <attribute name="testOnReturn">false</attribute>
    <attribute name="testWhileIdle">false</attribute>
    <attribute name="timeBetweenEvictionRunsMillis">-1</attribute>
    <attribute name="numTestsPerEvictionRun">3</attribute>
    <attribute name="minEvictableIdleTimeMillis">1800000</attribute>
    <attribute name="UserInfoEncryptorClassName">com.nexacro.xpush.crypto.XPushPBEStringEncryptor</attribute>
    <attribute name="isEncrypted">false</attribute>
    <depends>Log</depends>
</service>

X-PUSH 서버의 DB Connection은 DBCP를 통해 이루어지며 DB에 맞는 jdbc.jar 파일이 필요합니다. 예를 들어 oracle인 경우, $XPUSH_HOME/lib 폴더에 ojdbc-version.jar 파일을 추가해야합니다.

ConnectUri 항목을 아래와 같은 형식(Oracle Net connection descriptor)으로 작성하여도 파싱 오류 없이 사용할 수 있습니다.


jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xx.xx.xxx)(PORT=xxxx))(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xx.xx.xxx)(PORT=xxxx)))(FAILOVER=ON)(LOAD_BALANCE=ON)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=PKICC)))

2개 이상의 DB 를 연결하는 방법은 아래와 같습니다.

자세한 사항은 각 DB 의 공식 문서를 참고하시기 바랍니다.


ex) Tibero

jdbc:tibero:thin:@(description= (failover=on)(load_balance=on) (address_list=(address=(host=127.0.0.1)(port=8629)) (address=(host=127.0.0.2)(port=8629)) )(DATABASE_NAME=t5))

암호화 알고리즘 방식의 변경이 필요하다면? AES 방식 DB 연결 설정

Log 설정

v2.8.9 에서 Log4j2 로 로그 설정 방식이 변경되었고 Log4j2 표준을 따릅니다.

자세한 로그 설정 방법은 Log4j2 공식 자료를 참고하시기 바랍니다.

https://logging.apache.org/log4j/2.x/

xpush_log4j2_plus_info3

하단의 설명은 v2.8.9 이전 방식의 로그 설정 방식 (cf. v2.8.9 에서 Log4j2 방식으로 변경)


cf) v2.8.9 이상: $XPUSH_HOME/conf/log4j2.xml 에서 로그를 관리 (Log4j2 설정은 표준 방식을 따름)

cf) 하단의 X-PUSH 서버 상태를 모니터링하는 MonitorLogWriter 서비스는 v2.8.9 이상에서도 유지

X-PUSH 서버는 파일에 로그를 남기고, 이와 별도로 콘솔에도 로그를 보여줍니다. 파일과 콘솔을 별개로 설정할 수 있습니다.

로그 레벨

4개의 레벨에 따라 로그를 남깁니다. 각 레벨은 우선순위 값(priority)을 가지며 그 의미는 다음과 같습니다.

레벨

우선순위

설명

DEBUG

40

서버 테스트나 기타 오동작을 파악하기 위한 정보

TRACE

30

동작의 세세한 것을 살펴보기 위한 정보

INFO

20

서버의 동작 정보

WARN

10

무시할 수 있는 상황이나 exception에 대한 정보

ERROR

0

운영에 영향을 끼치는 에러 사항

우선순위값은 로그레벨을 설정할 때 사용되는 값입니다.

콘솔 로그의 레벨을 변경하려면 "Log" 서비스 안의 "ConsoleLogger" 서비스 안의 "PriorityRange" 어트리뷰트의 값을, 파일 로그의 레벨을 변경하려면 "Log"서비스 안의 "FileLogger" 서비스 안의 "PriorityRange" 어트리뷰트의 값을 수정합니다.

배포 시의 기본 설정값은 둘 다 '0:20'으로 되어 있으며, 이것은 우선순위 값 0에서 20까지의 레벨을 출력한다는 의미입니다. 만약 INFO를 로그에서 제외하고 싶다면 '0:10'과 같이 수정합니다.

<service name="Log">
	...
	<depends>
		<service name="ConsoleLogger">
			...
			<attribute name="PriorityRange">0:10</attribute>
			...
		</service>
	</depends>
	...
	<depends>
		<service name="FileLogger">
			...
			<attribute name="PriorityRange">0:40</attribute>
			...
		</service>
	</depends>
</service>

출력될 범위에 TRACE나 DEBUG를 포함하면 로그의 양이 상당히 많아지고, 성능에 영향을 끼칠 수 있습니다. 실 운영환경에서는 설정을 INFO로 변경할 것을 권장합니다.

로그 파일 설정

"FileLogWriter" 서비스에서 로그 파일에 관련된 설정을 합니다.

<service name="FileLogWriter">
	<attribute name="LogPath">log</attribute>
	<attribute name="LogFile">xpush.log</attribute>
	<attribute name="Encoding">utf-8</attribute>
	<attribute name="Append">true</attribute>
	<attribute name="MaximumFileSize">100000000</attribute>
	<attribute name="MaxBackupIndex">100</attribute>
	<attribute name="BufferedIO">false</attribute>
</service>

각 어트리뷰트의 의미는 다음과 같습니다.

어트리뷰트

의미

가능값

LogPath

로그 파일이 생성될 위치입니다. 상대경로나 절대경로로 설정이 가능합니다. 상대경로일 경우 $XPUSH_HOME이 기준이고, 절대경로로 설정하기 위해서는 "/var"과 같이 "/"로 시작하거나, 윈도우에서는 "d:\"과 같이 드라이버 이름으로 시작하는 경로로 설정합니다.


LogFile

로그가 기록될 파일이름입니다. 파일이름의 %INDEX%는 log rotation 시에 사용될 번호를 의미합니다.


Encoding

파일에 출력 시 사용할 문자열의 encoding을 설정합니다.

"UTF-8"

Append

서버 시작 시에 기존 로그 파일에 추가하여 출력할지를 설정합니다. "false"일 경우 기존 파일을 삭제하고 출력합니다. 배포 시 기본값은 true입니다.

"true"

"false"

BufferedIO

파일에 출력할 때 버퍼를 사용할지를 설정합니다. 배포 시 기본값은 false입니다.

"true"

"false"

X-PUSH 상태 로그 파일 설정

MonitorLogWriter 서비스는 v2.8.9 이상에서도 유지

현재 X-PUSH의 상태를 모니터링할 수 있는 정보를 파일로 기록합니다.

<service name="MonitorLogWriter">
            <attribute name="IsRecord">false</attribute>
            <attribute name="LogPath">log\status</attribute>
            <attribute name="LogFile">xpush.status</attribute>
            <attribute name="DatePattern">'.'yyyy-MM-dd</attribute>
            <attribute name="Encoding">utf-8</attribute>
            <attribute name="Append">true</attribute>
            <attribute name="RecordingPeriod">5000</attribute>
            <attribute name="PushMonitorServiceName">#PushMonitor</attribute>
</service>

각 어트리뷰트의 의미는 다음과 같습니다.

어트리뷰트

의미

가능값

IsRecord

로그 파일에 기록 여부입니다. true일 때만 기록되며, default는 false입니다.


LogPath

로그 파일이 생성될 위치입니다. 상대경로나 절대경로로 설정이 가능합니다. 상대경로일 경우 $XPUSH_HOME이 기준이고, 절대경로로 설정하기 위해서는 "/var"과 같이 "/"로 시작하거나, 윈도우에서는 "d:\"과 같이 드라이버 이름으로 시작하는 경로로 설정합니다.


LogFile

로그가 기록될 파일이름입니다. 파일이름의 %INDEX%는 log rotation 시에 사용될 번호를 의미합니다.


DatePattern

매일 기록되는 로그파일의 확장자 형식입니다. 날짜가 바뀌면 자동으로 로그파일의 이름이 변하고 기존 파일 뒤에 해당 DatePattern으로 확장자가 설정됩니다.


Encoding

파일에 출력 시 사용할 문자열의 encoding을 설정합니다.

"UTF-8"

Append

서버 시작 시에 기존 로그 파일에 추가하여 출력할지를 설정합니다. "false"일 경우 기존 파일에 덮어씁니다. 배포 시 기본값은 true입니다.

"true"

RecordingPeriod

파일에 기록하는 시간입니다. 단위는 MilliSecond(ms)이며, 배포시 기본값은 5000입니다.

Number

클러스터링 설정

여러대의 X-PUSH 서버를 하나의 클러스터로 묶어 메시지를 공유할 수 있습니다. 특정 서버로 Provider 메시지를 공급하면, 클러스터로 묶여있는 모든 서버로 Provider 메시지가 공급이 됩니다.

클러스터링을 위해 xpush_config.xml 의 HazelcastService를 설정합니다.

Hazelcast Service에는 다음과 같은 4개의 설정 항목이 있습니다.

어트리뷰트

설명

portAutoIncrement

각각의 HazelcastService에 할당되는 포트 번호의 자동 증가 기능의 활성화 여부입니다.

default : false

port

HazelcastService에서 사용할 기본 포트 번호입니다.

default : 50007

joinTcpipEnable

TCP/IP로 다른 X-PUSH Node와의 연결 여부 설정

default : false

joinTcpipMember

연결될 X-PUSH Node들이 정보

ex) 127.0.0.1:50007

다음은 3대의 X-PUSH 서버를 Hazelcast Service로 설정한 예입니다. 포트 번호를 자동증가시키지 않고 50007 포트를 사용하며, TCP/IP를 이용하여 192.168.1.1 주소를 사용하는 다른 X-PUSH서버와 연결하도록 설정했습니다.

X-PUSH #1
ip : 192.168.1.1

<service name=" HazelcastService" ... >
	...
	<attribute name="portAutoIncrement">false</attribute>
	<attribute name="port">50007</attribute>
	<attribute name="joinTcpipEnable">true</attribute>
	<attribute name="joinTcpipMember" type = "java.lang.String[]">
		192.168.1.2:50007,
		192.168.1.3:50007
	</attribute>
</service>
X-PUSH #2
ip : 192.168.1.2

<service name=" HazelcastService" ... >
	...
	<attribute name="portAutoIncrement">false</attribute>
	<attribute name="port">50007</attribute>
	<attribute name="joinTcpipEnable">true</attribute>
	<attribute name="joinTcpipMember" type = "java.lang.String[]">
		192.168.1.1:50007,
		192.168.1.3:50007	</attribute>
</service>
X-PUSH #3
ip : 192.168.1.3

<service name=" HazelcastService" ... >
	...
	<attribute name="portAutoIncrement">false</attribute>
	<attribute name="port">50007</attribute>
	<attribute name="joinTcpipEnable">true</attribute>
	<attribute name="joinTcpipMember" type = "java.lang.String[]">
		192.168.1.1:50007,
		192.168.1.2:50007	</attribute>
</service>

클라우드 세팅 시 반드시 고정 IP 로 세팅을 해야 합니다.

사용자 인증 설정

X-PUSH 서버는 3개의 접속(Client, Provider, Monitor)에 대하여 각각의 인증을 외부의 인증자에게 요청합니다. Authenticator 인터페이스를 구현한 각 인증자를 구현한 후 그 클래스를 설정파일에 설정하여야 인증이 필요할 때 해당 클래스를 로드하여 인증을 요청합니다.

3가지 접속 방법이 있는 이유로 3개의 인증자가 필요합니다.

client 인증

<service name="MiPlatformProtocolReliabilityAuthenticator" ...>
	<attribute name="AuthenticatorClassName">
	com.nexacro.xpush.fw.service.auth.UserPropertiesReliabilityAuthenticator
	</attribute>
</service>

클라이언트 인증의 경우 UserPropertiesReliabilityAuthenticator 클래스로 설정되며 모든 유저의 접속이 허용됩니다.

provider 인증

<service name="SocketProviderProtocolAuthenticator" ..>
		<attribute name="AuthenticatorClassName">
			com.nexacro.xpush.fw.service.auth.UserProfileDummyAuthenticator
		</attribute>
</service>

Provider 인증의 경우 UserProfileDummyAuthenticator 클래스로 설정되며 모든 유저의 접속이 허용됩니다.

monitor 인증

Admin 혹은 Monitor 접속에 대한 인증자는 아래 어트리뷰트 값에서 확인 할 수 있습니다.

"MonitorProtocol" 서비스 > "depends" 엘리멘트 
> "MonitorProtocolAuthenticator" 서비스 > "AuthenticatorClassName" 어트리뷰트 값
<service name="MonitorProtocol">
	...
	<depends>
		<service name="MonitorProtocolAuthenticator">
			<attribute name="AuthenticatorClassName"> 
                com.nexacro.xpush.fw.service.auth.UserPropertiesEncryptAuthenticator
            </attribute>      		
		</service>
	</depends>
	...
</service>

Monitor 인증의 경우 UserPropertiesEncryptAuthenticator 클래스로 설정되며 $XPUSH_HOME/conf/user.properties 파일의 id와 pw를 참조합니다.

클래스명

설명

DummyAuthenticator

모든 사용자의 접속 허용

UserPropertiesAuthenticator

$XPUSH_HOME/conf/user.properties 파일에 등록된 사용자 허용

UserPropertiesEncryptAuthenticator

$XPUSH_HOME/conf/user.properties 파일에 등록된 암호화된 password 값을 가진 사용자 허용

UserPropertiesAuthenticator는 /conf/user.properties 파일을 이용하여 인증합니다. user.properties에 등록되지 않은 사용자는 AuthenticateException을 발생시킨 후 로그인이 실패합니다.

이용자 설정 방법은 "이용자ID"="이용자PASSWORD" 입니다.

UserPropertiesEncryptAuthenticator 클래스는 $XPUSH_HOME/conf/user.properties에 암호화된 password를 입력하여 사용자 인증을 수행할 수 있습니다.

password 암호화에 대한 자세한 내용은 The internal link is invalid. 항목을 참조해주세요.

기타 자세한 내용은 인증자(Authenticator) 개발 항목을 참조해주세요.

암호화 알고리즘 방식의 변경이 필요하다면? AES 방식 monitor 인증 (user.properties 관련)

모바일 알림 설정

X-PUSH 서버에서는 APNs, FCM 두 가지 플랫폼으로의 모바일 알림 서비스를 제공합니다. 각각의 서비스는 xpush_config.xml에서 설정항목을 수정하여 사용할 수 있습니다. 또한, NotificationFormatter를 사용하여 전달될 notification을 커스터마이징할 수 있습니다.

X-PUSH 서버가 Notification을 보낼 때 DB에 저장된 Offline User의 DeviceToken을 검색합니다. X-PUSH서버는 1명의 User가 n개 이상의 Device로 Notification을 요청할 수 있습니다. 하지만, 1개의 Device를 여러 명의 User가 사용하고자 할 떄, 마지막에 등록된 User만 활성화 되며 Notification이 전송됩니다.

NotificationBuilder Service

Notification Builder 서비스에서 T_Notification 테이블에 한 번에 저장 및 에러코드 업데이트할 개수를 지정할 수 있습니다.

어트리뷰트

설명

InsertBatchAtOnceCount

조회된 모바일 디바이스 N개를 DB에 한 번에 Insert Batch를 실행하는 수입니다.

UpdateHandlerBatchAtOnceCount

Update큐로 부터 가져온 데이터를 DB에 한번에 Update Batch를 실행하는 수입니다.

UpdateHandlerProcessingAtOnceCount

APNS, FCM으로 부터 응답받은 결과가 쌓여있는 큐에서 한 번에 가져오는 수입니다.

NotificationFormatterName

알림을 보내기 전 메시지 포맷을 지정하는 클래스 입니다.

다음은 Notification Builder Service 설정의 예입니다. 조회된 Device N개를 한번에 1000개씩 Insert 하며, Apns/FCM으로부터 받은 응답이 쌓여 있는 큐에서 1000개씩 가져와 해당하는 컬럼을 100개씩 Update합니다.

<service name="NotificationBuilderServcice" ... >

	<attribute name="insertBatchAtOnceCount">1000</attribute>
	<attribute name="UpdateHandlerBatchAtOnceCount">100</attribute>
	<attribute name="UpdateHandlerProcessingAtOnceCount">1000</attribute>
	<attribute name="NotificationFormatterName">
		com.nexacro.xpush.service.notification.NotificationFormatterPropertiesImpl
	</attribute>
	....

</service>

NotificationFormatterPropertiesImpl 클래스는 $XPUSH_HOME/conf/notification.properties 파일을 load하여 알림의 title과 body를 지정합니다. title과 body를 재 설정 할 경우 X-PUSH 서버를 재 구동해야 합니다.

NotificationFormatter 클래스는 메시지 알림을 보내기 전에 메시지를 지정합니다.

자세한 사항은 모바일 알림 메시지 변환(Notification Formatter) 개발 을 참조하세요.

NotificationAttributeCommon Service

FCM, APNS를 포함한 notification에 대한 공통 속성을 정의하는 서비스입니다.

어트리뷰트

설명

IsMultiAppWithProjectID

ProjectID와 함께 N개의 모바일 앱에 대한 Notification 사용 여부에 대한 속성입니다. (default = true)

badge

'badge'항목이 true로 설정될 경우, 클라이언트가 전송받아야 할 미수신 메시지 개수를 Notification에 설정하여 전송합니다.

IsBadgeOnlyStateZero

message_state가 0인 메세지에 대해서만 Badge에 표시됩니다.

retries

재전송 횟수입니다.

다음은 NotificationAttributeCommonService에 대한 설정입니다. IsMultiAppWithProjectID를 true로 설정하였으며, message_satete가 0인 메세지에 대해서만 badge를 표시하도록 설정하고 서버 내부 에러 일 때, 재 전송 시도 횟수를 3회로 설정하였습니다.

<service name="NotificationAttributeCommonService" ...>
	<attribute name="IsMultiAppWithProjectID">true</attribute>
	<attribute name="badge">true</attribute>
	<attribute name="IsBadgeOnlyStateZero">true</attribute>
	<attribute name="retries">3</attribute>
</service>

APNs (Apple Push Notification Service)

Apns MultiApp Service

IsMultiAppWithProjectID가 true로 설정되었다면, N개 이상의 모바일 앱에 대한 처리를 수행할 수 있습니다.

ApnsInfo Service 구성하기

ApnsInfo 서비스에서는 1개의 프로젝트에 N개의 앱을 설정할 수 있습니다. 서비스 이름은 사용자가 적절하게 구성할 수 있습니다. 예를 들어 TOBESOFT_1 프로젝트와 TOBESOFT_2 프로젝트에 각각에 포함된 모바일 앱에 대한 정보가 들어 갈 수 있습니다. 어트리뷰트에는 다음과 같은 2개의 설정 항목이 있습니다.

어트리뷰트

설명

ProjectID

프로젝트 명을 설정할 수 있습니다.

AppInfo

Apns 인증서를 통해 N개의 앱을 구성할 수 있습니다. 인증서의 Bundle ID는 키 값으로 path, password, type, production은 List 형태의 value로 설정됩니다.


[CFBundleURLName]=[KeystorePath],[KeystorePassword],[KeystoreType],[production]

ex) com.abc.def=C:\tmp\apns2.p12,123456,PKCS12,false,

APNs 인증서와 관련된 설명은 애플 개발자 지원 사이트를 참고합니다.

http://help.apple.com/xcode/mac/current/#/dev11b059073

APNs 인증서는 반드시 1년마다 갱신을 해주셔야 합니다.

다음은 ApnsInfo Service 설정 예입니다. 서비스는 각 각 APNS_INFO_TOBESOFT_1, APNS_INFO_TOBESOFT_2 이름으로 구성 하고 프로젝트 명과 APNS App 정보를 추가하였습니다.

<service name="APNS_INFO_TOBESOFT_1" code="com.nexacro.xpush.service.notification.InfoApnsWithProjectIDService" instance="singleton" management="false">
	<attribute name="ProjectID">TOBESOFT_1</attribute>
	<attribute name="AppInfo" type ="java.util.HashMap">
		com.nexacro.apns=C:\tmp\apns.p12,12345,PKCS12,false,
		com.nexacro.apns2=C:\tmp\apns2.p12,12345,PKCS12,false,

    </attribute>
</service>

<service name="APNS_INFO_TOBESOFT_2" code="com.nexacro.xpush.service.notification.InfoApnsWithProjectIDService" instance="singleton" management="false">
	<attribute name="ProjectID">TOBESOFT_2</attribute>
	<attribute name="AppInfo" type ="java.util.HashMap">
		com.nexacro.apns3=C:\tmp\apns3.p12,12345,PKCS12,false,
    </attribute>
</service>

서비스의 ProjectID가 중복되지 않도록 주의합니다.

Apns Notifier Service

APNs Notifier Service에는 다음과 같은 8개의 설정 항목이 있습니다.

어트리뷰트

설명

ApnsInfo

프로젝트에 매칭되는 Apns 앱 정보를 알 수 있는 서비스 리스트입니다.

#Service_Name 형식으로 지정될 수 있습니다.

ApnsConnectorName

Apns 서버와 연결을 위한 인터페이스 입니다.

com.nexacro.xpush.service.notification.connector.XPushApnsConnector로 설정되어야 합니다.

feedbackService

매번 메시지를 전송할 때, Feedback Service 활성화에 대한 여부입니다.

sound

알림의 수신음을 설정합니다.

retries

재전송 시도 횟수입니다.

ApnsProviderThreadPoolCount

Apns Provider 쓰레드풀의 쓰레드 개수

: Apns Server 에 Notification 을 전송하기 위한 Connection 및 Send 의 처리 능력을 고려하여 쓰레드풀의 쓰레드 개수를 설정합니다.

failOver

Notification 전송이 실패했을 때, 예외 처리 서비스에 대한 처리 여부입니다.

다음은 APNs Notifier Service 설정 예입니다. ApnsInfo 서비스는 2개 구성하였고, 기타 속성에 대한 설정을 지정하였습니다.

<service name="ApnsNotifierService" ... >
	...
	<attribute name="ApnsInfo">
		#APNS_INFO_TOBESOFT_1
		#APNS_INFO_TOBESOFT_2
	</attribute>

	<attribute name="ApnsConnectorName">com.nexacro.xpush.service.notification.connector.XPushApnsConnector</attribute>
	...
	<attribute name="sound">default</attribute>
    <attribute name="feedbackService">true</attribute>
	<attribute name="ApnsHandlerThreadPoolCount">1</attribute>
	<attribute name="failOver">true</attribute>
	...
</service>

JDK에 따라, APNs로 Notification이 전달할 때 오류가 발생하는 경우가 있습니다. 이런 경우 인증서 형식을 PKCS12에서 JKS형식으로 변환하여 해결할 수 있습니다. 변환 방법은 아래 링크를 참고하십시오.

PKCS12 파일을 JKS 형식으로 변환하기

방화벽을 사용할 경우, APNs 서버로의 연결이 허용되어 있어야 합니다.


URL :

Sandbox server: api.development.push.apple.com

Production server: api.push.apple.com

Port : 443


연결 확인 방법은 telnet 으로 확인

예) telnet api.push.apple.com 443


리눅스에서 방화벽, DNS서버까지 확인하는 방법

nc -v api.push.apple.com 443

연결을 허용할 경우, IP가 아닌 URL로 반드시 설정해야 합니다.

FCM (Firebase Colud Messageing)

FCM MultiApp Service

IsMultiAppWithProjectID가 true로 설정되었다면, N개 이상의 FCM 프로젝트에 대한 처리를 수행할 수 있습니다.

FCMInfo Service 구성하기

FCMInfo 서비스에서는 1개의 프로젝트에 N개의 FCM 프로젝트를 설정할 수 있습니다. 서비스 이름은 사용자가 적절하게 구성할 수 있습니다. 예를 들어 TOBESOFT_1 프로젝트와 TOBESOFT_2 프로젝트에 각각에 포함된 FCM 프로젝트 정보가 들어 갈 수 있습니다. 어트리뷰트에는 다음과 같은 2개의 설정 항목이 있습니다.

어트리뷰트

설명

ProjectID

프로젝트 명을 설정할 수 있습니다.

ApiKey

FCM 접속 시 인증에 사용할 API Key입니다.

SendID

FCM 서버의 발신자 ID입니다.

ApiKey 는 클라우드 메시지 탭에 있는 서버키( 서버키, 이전 서비키 둘 중 하나) 를 입력해야 합니다. (이전 서버 키가 아닌 서버 키로 사용할 것을 권장드립니다.)

방화벽을 사용할 경우, FCM 서버로의 연결이 허용되어 있어야 합니다.


URL : https://fcm.googleapis.com/fcm/send

Port : 443 5228 5229 5230


연결 확인 방법은 telnet 으로 확인

예) telnet fcm.googleapis.com 443


리눅스에서 방화벽, DNS서버까지 확인하는 방법

nc -v fcm.googleapis.com 443

연결을 허용할 경우, IP가 아닌 URL로 반드시 설정해야 합니다.

다음은FcmInfo Service 설정 예입니다. 서비스는 각각 FCM_INFO_TOBESOFT_1, FCM_INFO_TOBESOFT_2 라는 이름으로 구성 하였으며, 프로젝트 명과 FCM 서버 정보를 추가하였습니다.

<service name="FCM_INFO_TOBESOFT_1" code="com.nexacro.xpush.service.notification.InfoFcmWithProjectIDService" instance="singleton" management="false">
		<attribute name="ProjectID">TOBESOFT_1</attribute>
 		<attribute name="SendID">78965651</attribute>					
		<attribute name="ApiKey">ASDGKMXEGE73RSGXE</attribute>
</service>

<service name="FCM_INFO_TOBESOFT_2" code="com.nexacro.xpush.service.notification.InfoFcmWithProjectIDService" instance="singleton" management="false">
		<attribute name="ProjectID">TOBESOFT_2</attribute>
 		<attribute name="SendID">34215651</attribute>					
		<attribute name="ApiKey">GRSDLCDMSPRSC2TK</attribute>
</service>

서비스의 ProjectID와 FCM 서버 정보가 중복되지 않도록 주의합니다.

GCM Notifier Service

X-PUSH 서버에서 FCM으로 Notification 전송을 할 때, GCM Notifier Service를 사용합니다.

GCM Notifier Service에는 다음과 같은 6개의 설정 항목이 있습니다.

프로토콜 서비스 이름

설명

FcmInfo

프로젝트에 매칭되는 Fcm 서버 정보를 알 수 있는 서비스 리스트입니다.

#Service_Name 형태로 지정될 수 있습니다.

GcmConnectorName

FCM 서버와 연결을 위한 인터페이스 입니다.

com.nexacro.xpush.service.notification.connector.GcmHttpConnector로 반드시 설정되어야 합니다.

GcmProviderThreadPoolCount

FCM Provider 쓰레드풀의 쓰레드 개수

: FCM Server 에 Notification 을 전송하기 위한 Connection 및 Send 의 처리 능력을 고려하여 쓰레드풀의 쓰레드 개수를 설정합니다.

FailOver

Notification 전송이 실패했을 때, 예외 처리에 대한 여부입니다.

다음은 GCM Notifier Service 설정 예입니다. GcmInfo 서비스는 2개 구성하였고, 기타 속성에 대한 설정을 지정하였습니다.

<service name="GcmNotifierService" ... >
	...
	<attribute name="FcmInfo">
		#FCM_INFO_TOBESOFT_1
		#FCM_INFO_TOBESOFT_2
    </attribute>
	<attribute name="GcmConnectorName">com.nexacro.xpush.service.notification.connector.GcmHttpConnector</attribute>

	<attribute name="FailOver">true</attribute>
</service>

스케줄링 설정

어트리뷰트

설명

type="java.lang.String"

* * * * * 는 분, 시, 일, 월, 요일을 나타냅니다.

분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-6)

<service name=" CronTabScheduleService ">
	...
	<argument type="java.lang.String">
		0 0 1 * *
	</argument> <!-- 매월 1일 0시 0분 메시지 삭제 -->
	...
</service>

수신 완료된 메시지 삭제

<invoke name="add">
   <!-- 매월 1일 0시 0분 메시지 삭제  -->
   <argument type="java.lang.String">0 0 1 * *</argument> 
   <argument type="it.sauronsoftware.cron4j.Task">
      <object code="com.nexacro.xpush.service.schedule.DeleteMessageTask">
         <attribute name="dbcpService">
            <service-ref>#DbcpService</service-ref>
         </attribute>
      </object>             	 			
   </argument>
</invoke>

유효기간 메시지 삭제

<invoke name="add">
   <!-- 매월 매일 0시 0분 만료 메시지 삭제  -->
   <argument type="java.lang.String">0 0 * * *</argument> 
   <argument type="it.sauronsoftware.cron4j.Task">
      <object code="com.nexacro.xpush.service.schedule.DeleteExpiredMessageTask">
         <attribute name="dbcpService">
            <service-ref>#DbcpService</service-ref>
         </attribute>
      </object>             	 			
   </argument>
</invoke>

유효기간 알림 삭제

<invoke name="add">
 <!-- 일요일 0시 0분 만료 알림 삭제  -->
<argument type="java.lang.String">0 0 * * *</argument>
	<argument type="it.sauronsoftware.cron4j.Task">
<object code="com.nexacro.xpush.service.schedule.DeleteExpiredNotificationTask">
			<attribute name="dbcpService">
                   <service-ref>#DbcpService</service-ref>
            </attribute>
     </object>            
</argument>
</invoke>

Apns 피드백서비스 연결 및 응답 받은 디바이스 토큰 업데이트

<invoke name="add">
<!-- 매일 0시 0분 피드백서비스 활성화 및 디바이스토큰 업데이트  -->
<argument type="java.lang.String">0 0 * * *</argument> 
	<argument type="it.sauronsoftware.cron4j.Task">
<object code="com.nexacro.xpush.service.schedule.ApnsFeedbackServiceTask">
		<attribute name="dbcpService">
        	<service-ref>#DbcpService</service-ref>
        </attribute>
        <attribute name="apnsNotifierService">
            <service-ref>#ApnsNotifierService</service-ref>
         </attribute>
      </object>             	 			
</argument>
</invoke>

자세한 내용은 스케줄러(Crontab Scheduler) 개발 항목을 참조해주세요.

SSL 인증서 설정

X-PUSH 서버에서는 암호화 통신을 위해서 SSL을 사용합니다.

어트리뷰트

설명

Path

SSL 인증서 위치

Password

SSL 서버키

IsEncrypted

암호화 사용 유무

<service name="CertificateService">

	<attribute name="Path">C:/xpush-2.8.0/conf/cacao.tobesoft.co.kr.jks</attribute>
	<attribute name="Password">1234567890</attribute>
	<attribute name="IsEncrypted">false</attribute>			 

 <attribute name="CertificatesPasswordEncryptorClassName">com.nexacro.xpush.crypto.XPushPBEStringEncryptor</attribute>

</service>

CertificateService 는 SSL 인증서를 세팅하는 서비스입니다.


실질적인 적용을 위해서는

WRE 는 WebPublisher 서비스에 IsHttpstrue 로,

ex) <attribute name="IsHttps">true</attribute>


NRE는 RuntimePublisher 서비스에 IsSSLtrue 로 변경해야 합니다.

ex) <attribute name="IsSSL">true</attribute>

SSL 인증서를 사용하기 위해서는 jks 파일 형식이 필요합니다. 만일 정식 SSL 발급이 어려울 경우, OpenSSL로 자체 서명 인증서(Self Signed Certificate)를 발급받아 테스트 해볼 수 있습니다.


JKS 인증서 파일 생성하기

공식 기관에서 인증 받은 SSL 인증서인지, 브라우저에서 확인해 볼 수 있습니다.


브라우저 개발자 모드에서 SSL 인증서 확인하기

암호화 알고리즘 방식의 변경이 필요하다면? AES 방식 SSL 인증서 설정

암호화 설정

보안에 민감한 정보를 암호화할 수 있도록 기능을 제공합니다.

암호화 가능 3가지

  1. SSL 비밀번호 암호화

  2. user.properties 의 비밀번호 암호화

  3. DB 접속 계정 암호화

보안상의 이유로 X-PUSH 내부적으로 설정되어 있는 키를 암호화키로 사용하시기를 권장합니다.

(암호화키를 넣지 않고 암호화하면 X-PUSH 내부의 암호화키로 암호화됩니다.)


임의의 키를 암호화키로 사용하시려면,

SSL 비밀번호 암호화, user.properties 의 비밀번호 암호화, DB 접속 계정 암호화 3가지 모두 동일한 암호화키를 사용해야 합니다.

run_ssl_encrypt.sh password
run_property_encrypt.sh password
run_dbcp_userinfo_encrypt.sh

암호화 알고리즘 방식의 변경이 필요하다면? 암호화 알고리즘의 변경 설정 및 사용법 (AES)

SSL 인증서 정보 암호화

CertificateService에서는 아래와 같이 설정하고 있는 인증서 정보 중 보안에 민감할 수 있는 정보의 암호화 기능을 제공합니다.
암호화를 할 경우, 아래 항목에서 password 항목을 암호화해야 합니다.
계정 정보의 암복호화에는 위 항목 중 CertificatesPasswordEncryptorClassName에 설정된 클래스를 통해서 이루어집니다.
패키지에서 제공되는 스크립트를 사용하여 암호화된 비밀번호 정보를 얻을 수 있습니다. 이에 따라 isEncrypt 항목과 Password 항목을 수동으로 설정해야 합니다.
X-PUSH 구동 시 isEncrypted 항목이 true인 경우, 비밀번호 정보를 복호화하여 인증서에 설정됩니다.

CertificatesPasswordEncryptorClassName

인증서 비밀번호를 암/복호화하는 클래스명.

isEncrypted

인증서 비밀번호가 암호화되었을 경우, true 그렇지않을 경우, false.

암호화

SSL 인증서 정보의 암호화에는 X-PUSH 패키지에 포함된 run_ssl_encrypt 스크립트(.sh, .bat)를 사용합니다.
스크립트 파일은 bin/ 디렉토리에 위치합니다.
run_ssl_encrypt.sh password
위와 같이 스크립트를 실행시킬 경우, X-PUSH 서버내에 있는 암호화키로 사용하여 암호화를 하게 됩니다.

shell 스크립트 : run_ssl_encrypt.sh '사용할 암호'

사용할 암호에 ''(single quotes)을 붙여서 암호화된 텍스트를 출력합니다.


batch 스크립트 : run_ssl_encrypt.sh "사용할 암호"

사용할 암호에 ""(double quotes)을 붙여서 암호화된 텍스트를 출력합니다.

run_ssl_encrypt.sh password xpush
위와 같이 스크립트를 실행시킬 경우, xpush라는 문자열을 암호화키로 사용하여 암호화를 하게 됩니다.
스크립트를 실행하면 아래와 같은 암호화 된 값을 얻을 수 있습니다.

암호화된 password와 isEncrypted 속성을 true로 직접 설정해야 합니다.

conf/ 디렉토리에 위치한 xpush_config.xml 파일을 아래와 같이 수정합니다.

<service name="CertificateService">

	<attribute name="Path">C:/xpush-2.6.7/conf/cacao.tobesoft.co.kr.jks</attribute>
	<attribute name="Password">QhJoZx1QQ03Km+u2Sk63tsvu6o3cX9OeP/t3ZImwLtg=</attribute>
	<attribute name="IsEncrypted">true</attribute>			 

 <attribute name="CertificatesPasswordEncryptorClassName">com.nexacro.xpush.crypto.XPushPBEStringEncryptor</attribute>

</service>

run_ssl_encrypt 스크립트 실행 시 암호화키를 인자로 넘기지 않을 경우, X-PUSH에 내부적으로 설정된 기본 암호화키를 사용하게 되며, 이는 복호화시에도 마찬가지로 적용됩니다.

기본적으로 사용가능한 암호화키는 최대 7자입니다.

이는 JDK의 암호화 모듈 사용 제한에 의한 것이므로 암호화키를 7자 이상 사용하시려면 JDK에 JCE Unlimited Strength Jurisdiction Policy File 파일을 설정하셔야 합니다

복호화

X-PUSH 실행 후 SSL/HTTPS 방식의 클라이언트 연결을 위해, 암호화할 때 사용했던 암호화키를 X-PUSH 실행 시에 인자로 넘겨주어야 합니다. 
X-PUSH는 인자로 넘겨받은 암호화 키로 비밀번호를 복호화하여 인증서를 설정합니다.
startup.sh xpush
사용자 암호화키를 사용하지 않고, X-PUSH 내부적으로 설정된 키를 사용할 경우 인자가 없습니다.
startup.sh

실패시 에러 사항

암호화에 필요한 암호화키가 설정되지 않았을 경우, 비밀번호를 잘못 설정했을 경우 발생합니다.
설정된 키로 복호화 하지 않았거나 비밀번호를 잘못 암호화 하여 X-PUSH를 구동하고, SSL 인증된 클라이언트를 연결한다면 다음과 같은 오류가 발생합니다.

암호화 알고리즘 방식의 변경이 필요하다면? SSL 암호화, user.properties 암호화

user.properties password 암호화

암호화

user.properties 파일의 password 값을 암호화하려면 직접 값을 생성해서 파일에 입력해야 합니다.
run_property_encrypt.sh xpush

스크립트를 통해 생성된 password를 user.properties에 입력합니다.

복호화

xpush 서버 내부에 설정된 UserPropertiesEncryptAuthenticator 클래스에서는 사용자가 설정한 비밀번호를 키로 설정하여 user.properties에 암호화된 비밀번호 값을 복호화하여 일치여부를 확인하고 로그인 성공/여부를 판단합니다.

암호화 알고리즘 방식의 변경이 필요하다면? SSL 암호화, user.properties 암호화

DB 계정 정보 암호화

DbcpService에서는 아래와 같이 설정하고 있는 DB 접속 정보 중 보안에 민감할 수 있는 계정 정보의 암호화 기능을 제공합니다.
암호화를 할 경우, 아래 항목 중 username, password 항목이 암호화됩니다.
<service name="DbcpService">	
	<attribute name="username">xpush</attribute>
	<attribute name="password">xpush</attribute>
	<attribute name="connectUri">jdbc:h2:tcp://localhost/~/test</attribute>
	<attribute name="jdbcClassName">org.h2.Driver</attribute>

	...

	<attribute name="UserInfoEncryptorClassName">com.nexacro.xpush.crypto.XPushPBEStringEncryptor</attribute>
	<attribute name="isEncrypted">false</attribute>

	...

</service>
계정 정보의 암복호화에는 위 항목 중 UserInfoEncryptorClassName에 설정된 클래스를 통해서 이루어집니다.
패키지에서 제공되는 스크립트를 사용하여 암호화를 하면 isEncrypted 항목이 자동으로 true로 설정되며 만약 설정을 변경하거나 기타 이유로 암호화를 하였는데 isEncrypted 항목이 false인 경우, true로 변경해주셔야 합니다.
X-PUSH가 기동 시 isEncrypted 항목이 true인 경우, 계정 정보를 복호화하여 DB에 접속합니다.

UserInfoEncryptorClassName

DB 접속 계정 정보를 암/복호화하는 클래스명.

isEncrypted

DB 접속 계정이 암호화되었을 경우, true 그렇지않을 경우, false.

암호화

DB 계정정보의 암호화에는 X-PUSH 패키지에 포함된 run_dbcp_userinfo_encrypt 스크립트(.sh, .bat)를 사용합니다.
스크립트 파일은 bin/ 디렉토리에 위치합니다.
run_dbcp_userinfo_encrypt.sh xpush
위와 같이 스크립트를 실행시킬 경우, xpush라는 문자열을 암호화키로 사용하여 암호화를 하게 됩니다.
스크립트를 실행하면 아래와 같이 username, password 항목이 암호화되며, isEncrypted 항목이 true로 변경됩니다.
run_dbcp_userinfo_encrypt.sh
위와 같이 스크립트를 실행시킬 경우, X-PUSH 내부적으로 설정된 암호화키로 사용하여 암호화를 하게 됩니다.
스크립트를 실행하면 아래와 같이 username, password 항목이 암호화되며, isEncrypted 항목이 true로 변경됩니다.
<service name="DbcpService">	
	<attribute name="username">Va3n7cU3aaB/JSqhfQNBBo7UUejPmBjHY//8iLxo80Mv+w1TTDKUv8yPQfpdkRnORrYcBDRugEDi4jfcn6zpmQ==</attribute>
	<attribute name="password">VRibE8jCKPKDFpA+RZ7rLsfau3Uc5JSRfctCg5yZx9czByNzGFOWNOhxgKBcVDRuadP6NsMuJ7zRK0TLKwK1jQ==</attribute>
	<attribute name="connectUri">jdbc:h2:tcp://localhost/~/test</attribute>
	<attribute name="jdbcClassName">org.h2.Driver</attribute>

	...

	<attribute name="UserInfoEncryptorClassName">com.nexacro.xpush.crypto.XPushPBEStringEncryptor</attribute>
	<attribute name="isEncrypted">true</attribute>

	...

</service>

스크립트 실행 시 암호화키를 인자로 넘기지 않을 경우, X-PUSH에 내부적으로 설정된 기본 암호화키를 사용하게 되며, 이는 복호화시에도 마찬가지로 적용됩니다.

기본적으로 사용가능한 암호화키는 최대 7자입니다.

이는 JDK의 암호화 모듈 사용 제한에 의한 것이므로 암호화키를 7자 이상 사용하시려면 JDK에 JCE Unlimited Strength Jurisdiction Policy File 파일을 설정하셔야 합니다

암호화 알고리즘은 SHA256과 256BITAES 방식을 혼합하여 사용하고 있습니다.

복호화

X-PUSH 실행 시 암호화된 계정정보로 DB에 접속할 수 있도록 하려면 암호화할 때 사용했던 암호화키를 X-PUSH 실행 시에 인자로 넘겨주어야 합니다. 
X-PUSH는 인자로 넘겨받은 암호화키로 계정정보를 복호화하여 DB에 접속하게 됩니다.
startup.sh xpush
암호화키를 인자로 넘겨서 실행 시, 로그레벨이 DEBUG 일 경우에만, isEncrypted 항목값으로 암호화 적용여부를 확인할 수 있습니다.
그외에 복호화된 계정정보를 출력하지 않으며, 정상 케이스일 경우 DB 접속이 정상적으로 이루어졌다는 로그를 확인할 수 있습니다.
[DEBUG] DBCPService Attribute isEncrypted=true
[INFO] Check Database Connection : OK
[INFO] Check All Tables : OK

사용자 암호화키를 사용하지 않고, X-PUSH 내부적으로 설정된 키를 사용할 경우 인자가 없습니다.

startup.sh

실패시 오류 로그

암호화에 필요한 암호화키가 설정되지 않았을 경우, 발생합니다.
암호화키를 설정하지 않을 경우, 기본 암호화키로 실행됩니다.
[DEBUG] DBCPService Attribute isEncrypted=true
[ERROR] Password not set for Password Based Encryptor
[ERROR] Fail Get a Database Connection. Check Database.
JDK에 JCE Unlimited Strength Jurisdiction Policy File 파일을 설치하지 않은 상태에서 7자 이상의 암호화키를 사용할 경우 발생합니다.
[DEBUG] DBCPService Attribute isEncrypted=true
[ERROR] Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
[ERROR] Fail Get a Database Connection. Check Database.
주로 암호화키가 틀렸을 경우, 발생합니다. 상세한 로그 메시지는 보안을 위해서 생략되었습니다.
[DEBUG] DBCPService Attribute isEncrypted=true
[ERROR] Decryption operation failed, ommitting any further information about the cause for security reasons.
[ERROR] Fail Get a Database Connection. Check Database.

암호화 알고리즘 방식의 변경이 필요하다면? DB 암호화

메시지 유효기간 설정

신뢰성 메시지의 유효기간을 서버에서 설정합니다.

어트리뷰트

설명

availablePeriod

신뢰성메시지의 기본 유효기간 설정 (day)

maximumAvailablePeriod

신뢰성메시지의 최대 유효기간 설정 (day)

<service name=" RepositoryService ">	
	...
	<attribute name="availablePeriod">-1</attribute>				
	<attribute name="maximumAvailablePeriod">-1</attribute>	
	...
</service>

만약, Provider 에서 PushMessage 객체의 setAvailablePeriod()로 값 설정 시, 해당 값이 xpush_config.xml의 availablePeriod 값 보다 우선권을 가집니다.


(단, PushMessage 객체의 setAvailablePeriod()로 설정한 값은 xpush_config.xml의 maximumAvailablePeriod 값을 초과할 수 없습니다.)

-1 : 유효기간 설정 X


서버(xpush_config.xml의 availablePeriod, maximumAvailablePeriod)와 Provider 값 모두 설정하지 않으면, 유효기간은 설정되지 않습니다.

메시지 복구 설정

수신응답 메시지의 처리 과정에서 오류 시 파일로 저장된 메시지 복구서비스 입니다.

어트리뷰트

설명

RecoverPeriod

일정 시간 간격으로 서비스 구동

<service name=" RecoverService ">
	...
	<attribute name="RecoverPeriod">600000</attribute> <!--10분 간격으로 복구-->
	...
</service>

암호화 알고리즘의 변경 설정 및 사용법 (AES)

특정 환경에서 기존 암호화 알고리즘 (SHA256, 256BITAES 활용) 을 지원하지 않을 때, AES 암호화 알고리즘으로 변경해서 사용하는 방법입니다.

암호화 가능 3가지

  1. SSL 비밀번호 암호화

  2. user.properties 의 비밀번호 암호화

  3. DB 접속 계정 암호화

보안상의 이유로 X-PUSH 내부적으로 설정되어 있는 키를 암호화키로 사용하시기를 권장합니다.

(암호화키를 넣지 않고 암호화하면 X-PUSH 내부의 암호화키로 암호화됩니다.)


임의의 키를 암호화키로 사용하시려면,

SSL 비밀번호 암호화, user.properties 의 비밀번호 암호화, DB 접속 계정 암호화 3가지 모두 동일한 암호화키를 사용해야 합니다.

설정

$XPUSH_HOME/conf/xpush_config.xml 에서 변경할 부분 3가지 (AES 암호화 알고리즘 사용 시)

AES 방식 SSL 인증서 설정

기존 암호화 방식 설명 참고: SSL 인증서 설정

<service name="CertificateService">

	<attribute name="Path">C:/xpush-2.8.0/conf/cacao.tobesoft.co.kr.jks</attribute>
	<attribute name="Password">1234567890</attribute>
	<attribute name="IsEncrypted">false</attribute>			 

 <attribute name="CertificatesPasswordEncryptorClassName">com.nexacro.xpush.crypto.XPushAESStringEncryptor</attribute>

</service>

AES 방식 monitor 인증 (user.properties 관련)

기존 암호화 방식 설명 참고: monitor 인증

<service name="MonitorProtocol">
	...
	<depends>
		<service name="MonitorProtocolAuthenticator">
			<attribute name="AuthenticatorClassName"> 
                com.nexacro.xpush.fw.service.auth.UserPropertiesEncryptAuthenticator_AES
            </attribute>      		
		</service>
	</depends>
	...
</service>

클래스명

설명

UserPropertiesEncryptAuthenticator_AES

$XPUSH_HOME/conf/user.properties 파일에 등록된 AES 방식으로 암호화된 password 값을 가진 사용자 허용

AES 방식 DB 연결 설정

기존 암호화 방식 설명 참고: DB 연결 설정

<service name="DbcpService">    
    <attribute name="username">sa</attribute>
    <attribute name="password"></attribute>
    <attribute name="connectUri">jdbc:h2:tcp://localhost/~/test</attribute>
    <attribute name="jdbcClassName">org.h2.Driver</attribute>
    <attribute name="maxActive">10</attribute>
    <attribute name="maxIdle">0</attribute>
    <attribute name="minIdle">5</attribute>
    <attribute name="maxWait">-1</attribute>
    <attribute name="validationQuery">select 1 from dual</attribute>
    <attribute name="testOnBorrow">true</attribute>
    <attribute name="testOnReturn">false</attribute>
    <attribute name="testWhileIdle">false</attribute>
    <attribute name="timeBetweenEvictionRunsMillis">-1</attribute>
    <attribute name="numTestsPerEvictionRun">3</attribute>
    <attribute name="minEvictableIdleTimeMillis">1800000</attribute>
    <attribute name="UserInfoEncryptorClassName">com.nexacro.xpush.crypto.XPushAESStringEncryptor</attribute>
    <attribute name="isEncrypted">false</attribute>
</service>

사용법

$XPUSH_HOME/bin 에서 사용할 script 2가지 (AES 암호화 알고리즘 사용 시)

run_encrypt_AES.bat/sh
run_dbcp_userinfo_encrypt_AES.bat/sh

SSL 암호화, user.properties 암호화

보안상의 이유로 X-PUSH 에 내재된 암호화키를 사용하실 것을 권장합니다.

임의로 지정 가능한 암호화키는 최대 16자입니다.

이는 JDK의 암호화 모듈 사용 제한에 의한 것이므로 암호화키를 17자 이상 사용하시려면

JDK에 JCE Unlimited Strength Jurisdiction Policy File 파일을 설정하셔야 합니다.


참고: 암호화키 관련 에러 해결 방법

스크립트 실행 방법

SSL 암호화, user.properties 암호화 등 문자열 암호화에 사용

- X-PUSH 에 내재된 암호화키를 이용하여 암호화할 경우

Windows: run_encrypt_AES.bat word (암호화할 문자열)
Linux: ./run_encrypt_AES.sh word

- 사용자가 임의로 지정한 암호화키를 사용할 경우

Windows: run_encrypt_AES.bat word encryptKey (사용자가 임의로 지정한 암호화키)
Linux: ./run_encrypt_AES.sh word encryptKey

xpush_config.xml 설정 방법

- xpush_config.xml 에 수동 반영 필요

[SSL 암호화]

- 스크립트 실행으로 출력된 암호화된 문자열을 CertificateService 의 Password 에 기입, isEncryptedtrue 로 설정


[user.properties 암호화]

- 스크립트 실행으로 출력된 암호화된 문자열을 $XPUSH_HOME/conf/user.properties 의 'id=pw' 형태로 기입되어있는 pw 부분에 기입합니다.

(기본값: tobesoft=암호화된 xpush)

기존 암호화 방식 설명 참고: SSL 인증서 정보 암호화, user.properties password 암호화

DB 암호화

보안상의 이유로 X-PUSH 에 내재된 암호화키를 사용하실 것을 권장합니다.

임의로 지정 가능한 암호화키는 최대 16자입니다.

이는 JDK의 암호화 모듈 사용 제한에 의한 것이므로 암호화키를 17자 이상 사용하시려면

JDK에 JCE Unlimited Strength Jurisdiction Policy File 파일을 설정하셔야 합니다.


참고: 암호화키 관련 에러 해결 방법

스크립트 실행 방법

DB 암호화에 사용

- X-PUSH 에 내재된 암호화키를 이용하여 암호화할 경우

Windows: run_dbcp_userinfo_encrypt_AES.bat word (암호화할 문자열)
Linux: ./run_dbcp_userinfo_encrypt_AES.sh word

- 사용자가 임의로 지정한 암호화키를 사용할 경우

Windows: run_dbcp_userinfo_encrypt_AES.bat word encryptKey (사용자가 임의로 지정한 암호화키)
Linux: ./run_dbcp_userinfo_encrypt_AES.sh word encryptKey

xpush_config.xml 설정 방법

- xpush_config.xml 에 자동 반영됨

- 스크립트 실행으로 DbcpService 의 username, password암호화된 문자열로 변경됨, isEncryptedtrue 로 변경됨.

기존 암호화 방식 설명 참고: DB 계정 정보 암호화

SSL 복호화, user.properties 복호화, DB 복호화

- X-PUSH 에 내재된 암호화키를 이용하여 복호화할 경우

Windows: startup.bat 
Linux: ./startup.sh

- 사용자가 임의로 지정한 암호화키를 이용하여 복호화할 경우

Windows: startup.bat encryptKey (사용자가 임의로 지정한 암호화키)
Linux: ./starup.sh encryptKey

암호화키 관련 에러 해결 방법

사용자가 임의로 지정한 암호화키가 16자를 초과하며, JDK8 사용자가 Unlimited JCE Policy 가 설정되어있지 않을 경우, 하단의 에러가 발생할 수 있습니다.

암호화 키 값이 일치하지 않습니다.
java.security.InvalidKeyException: Illegal key size

[java 1.8 중 java 1.8.151 이전 버전]

(Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download 다운로드 후)

$JAVA_HOME/jre/lib/security 폴더 안에 local_policy.jar, US_export_policy.jar 덮어씌우기.


다운로드 경로: https://www.oracle.com/java/technologies/javase-jce8-downloads.html

(오라클 계정 로그인 필요)

[java 1.8 중 1.8.151 이상 버전]

$JAVA_HOME/lib/security/policy 폴더 안에 limited 와 unlimited 폴더가 있으며 local_policy.jar, US_export_policy.jar 파일이 이미 존재함.

$JAVA_HOME/lib/security/java.security 파일 내의 crypto.policy=unlimited 주석 해지하기.