세션 관리 프로그램
세션 관리 프로그램은 세션을 생성, 검증 및 해제하는 과정에서 MCI에서 호출하는 사용자 커스터마이징 프로그램을 말한다. 각 사이트에서 다양한 방식으로 사용하는 세션 방식을 위해 사이트에서는 BXI에서 제공하는 API에 따라 세션 관리 프로그램을 개발해야 한다. MCI는 세션 관리 프로그램을 사용하여 세션 정보를 생성 및 검증하거나 세션 데이터를 추출한다.
세션 관리 프로그램은 UserSessionProcess
인터페이스에 정의된 API를 구현해야하며,
반드시 프로그램 등록 시 userSessionProcessor
로 등록해야 한다.

API에 대한 설명은 다음과 같다.
세션 생성 API
로그인 거래시 SystemUserLoginRouter
에서 호출하는 API로 헤더와 바디 전문을 이용해 사용자 세션 정보를 생성하여 리턴한다.
public UserSessionInfo createSessionInfo(Map<String, Object> header, Map<String, Object> body, String remoteIp);
입력
- header : 코어 시스템에서 로그인 서비스 응답으로 받은 표준 전문 헤더 데이터
- body : 코어 시스템에서 로그인 서비스 응답으로 받은 개별부 데이터
- remoteIp : 단말 IP Address
출력
- UserSessionInfo : 세션 정보
예제는 다음과 같다.
@Override
public UserSessionInfo createSessionInfo(Map<String, Object> header, Map<String, Object> body, String remoteIp) {
if (ObjectUtil.isEmpty(header) || ObjectUtil.isEmpty(body)) {
return null;
}
UserSessionInfo sessionInfo = new UserSessionInfo();
// 헤더 또는 개별부에서 필요 데이터를 추출하여 세션 정보를 생성한다.
sessionInfo.setTerminalNo((String) body.get("terminalNo"));
sessionInfo.setStaffId((String) header.get("usrId"));
sessionInfo.setTerminalIp((String) header.get("ipAddr"));
sessionInfo.setExpiredTime(getSessionExpireTime());
sessionInfo.setSessionId(makeSessionId(sessionInfo));
if (sessionInfo.getTerminalIp() == null) {
sessionInfo.setTerminalIp(remoteIp);
}
// 책임자 승인 정보 조회시 처리를 위해 로그인한 단말이 책임자 단말인지를 구분한다.
sessionInfo.setAuditTerminal(false);
String auditYn = (String) body.get("auditYn");
if (auditYn != null && "Y".equalsIgnoreCase(auditYn)) {
sessionInfo.setAuditTerminal(true);
}
// 로그인한 단말이 BID 메시지를 받을 수 있는 단말인지를 구분한다.
sessionInfo.setBidSend(true);
String bidYn = (String) body.get("bidYn");
if (bidYn != null && "N".equalsIgnoreCase(bidYn)) {
sessionInfo.setBidSend(false);
}
// 전문에 session id 저장
body.put("sessionId", sessionInfo.getSessionId());
return sessionInfo;
}
/**
* 세션 ID를 생성한다.
*
*
* @param sessionlnfo
* @return
*/
private String makeSessionId(UserSessionInfo sessionlnfo) {
StringBuilder sb = new StringBuilder(64);
sb.append(sessionlnfo.getStaffId());
if (sessionlnfo.getMacAddr() != null) {
sb.append(sessionlnfo.getMacAddr());
}
sb.append(DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE));
int value = ThreadLocalRandom.current().nextInt(1000000);
sb.append(String.format("%06d", value));
LOG.debug("sessionId: {}", sb.toString());
return sb.toString().trim();
}
사용자 ID 조회 API
MCI는 사용자 ID를 이용하여 기 로그인 여부 및 검증에 사용한다. 사이트별로 사용자 ID에 대한 필드가 다르므로 헤더와 바디 전문을 이용하여 사용자 ID를 리턴하도록 API를 구현해야한다.
public String getStaffId(Map<String, Object> header, Map<String, Object> body);
입력
- header : 코어 시스템에서 로그인 서비스 응답으로 받은 표준 전문 헤더 데이터
- body : 코어 시스템에서 로그인 서비스 응답으로 받은 개별부 데이터
출력
- String : 사용자 ID
예제는 다음과 같다.
@Override
public String getStaffId(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(header)) {
return null;
}
return (String) header.get("usrId");
}
세션 ID 조회 API
MCI는 세션 ID를 식별자로하여 IMDG에 세션을 관리한다. 이후 세션 검증에서 IMDG에서 조회하기 위해 세션 ID를 사용한다. 사이트별로 세션 ID에 대한 필드가 다르므로 헤더와 바디 전문을 이용하여 세션 ID를 리턴하도록 API를 구현해야한다.
public String getSessionId(Map<String, Object> header, Map<String, Object> body);
입력
- header : 코어 시스템에서 로그인 서비스 응답으로 받은 표준 전문 헤더 데이터
- body : 코어 시스템에서 로그인 서비스 응답으로 받은 개별부 데이터
출력
- String : 세션 ID
예제는 다음과 같다.
@Override
public String getSessionId(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
return (String) body.get("sessionId");
}
리모트 IP 조회 API
MCI는 세션 검증에서 세션 정보의 리모트 IP와 현재 요청한 거래의 리모트 IP를 검증한다. 사이트별로 리모트 IP에 대한 필드가 다르므로 헤더와 바디 전문을 이용하여 리모트 IP를 리턴하도록 API를 구현해야한다.
public String getRemoteIp(Map<String, Object> header, Map<String, Object> body);
입력
- header : 코어 시스템에서 로그인 서비스 응답으로 받은 표준 전문 헤더 데이터
- body : 코어 시스템에서 로그인 서비스 응답으로 받은 개별부 데이터
출력
- String : 리모트 IP
예제는 다음과 같다.
@Override
public String getRemoteIp(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(header)) {
return null;
}
return (String) header.get("ipAddr");
}
BID 거래 API
BID 거래란 코어 시스템에서 특정 단말이나 사용자 또는 부서에 속한 사용자에게 메세지를 전송할 때 사용하는 역방향 거래를 의미한다.
BID 거래는 SystemBidSendRouter
에서 수행하며 사용자가 구현한 API를 이용하여 메시지를 전송할 사용자, URL 및 메시지를 얻어 웹소켓으로 전송한다.
이를 위해 사용자는 다음과 같은 API를 구현해야한다.
/**
* BID를 전송 할 IP 리스트를 리턴한다.
*/
public List<String> getBidIpList(Map<String, Object> header, Map<String, Object> body);
/**
* BID를 전송 할 웹소켓 URL을 리턴한다.
*/
public String getBidUrl(Map<String, Object> header, Map<String, Object> body);
/**
* BID 메시지를 리턴한다.
*/
public String getBidMessage(Map<String, Object> header, Map<String, Object> body);
- 입력
- header : 코어 시스템에서 로그인 서비스 응답으로 받은 표준 전문 헤더 데이터
- body : 코어 시스템에서 로그인 서비스 응답으로 받은 개별부 데이터
예제는 다음과 같다.
@Override
public List<String> getBidIpList(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
// BID 종류와 코드 조회
String bidType = (String) body.get("bidType");
String bidValue = (String) body.get("bidValue");
LOG.debug("bidType: {}, bidValue: {}", bidType, bidValue);
// BID 종류에 따라서 세션정보에서 단말 IP를 조회한다.
if ("1".equals(bidType)) {
// 특정 사용자에 bid 전송
return UserSessionHelper.searchSessionByStaffId(bidValue);
} else if ("2".equals(bidType)) {
// 특정 단말에게 bid 전송
return UserSessionHelper.searchSessionByTerminalId(bidValue);
} else if ("3".equals(bidType)) {
// 특정 부서에 속하는 사용자에게 bid 전송
return UserSessionHelper.searchSessionByDeptId(bidValue);
} else {
return new ArrayList<>();
}
}
@Override
public String getBidUrl(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
// BID URL
return "/bid";
}
@Override
public String getBidMessage(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
// BID 메시지
return (String) body.get("bidMessage");
}
BXI MCI는 BID 메시지를 전송하기 위해 웹소켓을 사용한다.
하지만 사이트별로 전송 방식은 다양하며 웹소켓을 사용하지 않는다면 SystemBidSendRouter
의 처리 프로그램을 커스터마이징하여 처리한다.
타임아웃 시간 조회 API
MCI는 세션 타임아웃 시간을 2시간을 기본으로 한다. 세션 타임아웃 시간을 변경하고자 한다면 아래 API를 오버라이딩하여 재정의한다.
public default long getSessionExpireTime() {
return 7_200_000L;
}
- 출력
- long : 타임아웃 시간