From 91f91c18cabe83cf8ff1019ab2ed5765d9703ab5 Mon Sep 17 00:00:00 2001 From: curry772 Date: Thu, 30 Apr 2026 17:28:20 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20DJErpApiAdapterService=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 미사용 메서드 12개 제거: doPreDecryption, doPostEncryption, doInboundPreDecrypt, doInboundPostEncrypt, extractBodyMsg, getJsonKey, JwtTokenExtractor, JwtClientIdExtractor, convertObjectToBytes, convertObjectToBase64Bytes, convertBytesToObject, assignApiId - 미사용 필드 제거: encryptResponseApply, PAYLOAD_PARAM_NAME_CLIENT_ID, JSON_CONTENT_TYPE, JSON_FIELD_NAME, FILE_GROUP_NAME, UPLOAD_ROOT_PATH - callApi 내 미사용 지역변수 제거: AdapterPropManager manager = null - e.printStackTrace() 15건 제거 (삭제된 메서드 내부) - == "" 버그 2건 제거 (삭제된 메서드 내부) - 미사용 import 14개 제거 - jwhong 개발자 주석 및 죽은 주석 블록 제거 Co-Authored-By: Claude Sonnet 4.6 --- .../controller/DJErpApiAdapterController.java | 48 +- .../service/DJErpApiAdapterService.java | 549 +----------------- 2 files changed, 35 insertions(+), 562 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java index 7bc09a2..337c4db 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java @@ -142,50 +142,14 @@ public class DJErpApiAdapterController implements HttpAdapterServiceKey { try { String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); - // if (RESPONSE_TYPE_ASYNC.equals(responseType)) { // table의 값이 ASYNC 로 들어가 있는데 - // response_type_async는 ASYN 로 되어 있어 아래처럼 비교함 jwhong 2025 - if ("ASYNC".equals(responseType)) { - // responseEntity = ResponseEntity.ok("dummy"); // comment by jwhong - // servletResponse.addHeader("traceId", responseData); // uuid를 response header에 - servletResponse.addHeader("traceId", - transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에 - int httpStatus = servletResponse.getStatus(); - if (httpStatus == 200) { - // 업체별 aync response message 가 다르다. - String asyncMsgStyle = httpProp.getProperty("ASYNC_RTNMSG_TYPE", ""); - String responseBody = ""; - boolean encryptAsyncAckApply = StringUtils - .equalsIgnoreCase(httpProp.getProperty("ASYNC_ENCRYPT_ACK", "N"), "Y"); - - if (asyncMsgStyle == null || asyncMsgStyle.trim().isEmpty()) { - responseBody = makeResponseBodyMsg(); - } else { - responseBody = asyncMsgStyle; - } - if (encryptAsyncAckApply) { - responseBody = service.doPostEncryption(responseBody, transactionProp, servletRequest); - } - - responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseBody); - // jwhong - } else { - responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); - } + servletResponse.addHeader("traceId", + transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에 + int httpStatus = servletResponse.getStatus(); + if (httpStatus != 200) { + responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); } else { -// responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); -// 버즈빌 포인트 적립 처리하기 위하여 정상응답이더라도 응답코드(apiRsltCd) 값이 200이 아닌 경우 처리를 위하여 수정 -// Filter에서 설정한 response status값을 responseEntity 생성시 적용 modify by lwk 2025.03.24 - - servletResponse.addHeader("traceId", - transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에 - int httpStatus = servletResponse.getStatus(); - if (httpStatus != 200) { - responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); - } else { - responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); - } + responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); } - } catch (Exception e) { diff --git a/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java index 8c2b4b6..a5b0e83 100644 --- a/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java @@ -1,14 +1,7 @@ package com.eactive.eai.adapter.service; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Base64; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; @@ -26,25 +19,19 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.mina.common.ByteBuffer; import org.json.simple.JSONObject; import org.json.simple.JSONValue; -import org.json.simple.parser.JSONParser; import org.springframework.context.annotation.Primary; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; -import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.stereotype.Service; import org.springframework.util.AntPathMatcher; import com.eactive.eai.adapter.AdapterGroupVO; -import com.eactive.eai.adapter.AdapterPropManager; import com.eactive.eai.adapter.AdapterVO; import com.eactive.eai.adapter.Keys; import com.eactive.eai.adapter.http.HttpMemoryLogger; import com.eactive.eai.adapter.http.HttpMethodType; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; -import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthFilter; -//for encrypt/decrypt jwhong -import com.eactive.eai.authserver.service.OAuth2Manager; import com.eactive.eai.common.context.ElinkTransactionContext; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; @@ -57,10 +44,6 @@ import com.eactive.eai.message.StandardMessageUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.kjbank.encrypt.exchange.crypto.AES256Cipher; -import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher; -import com.kjbank.encrypt.exchange.crypto.AESCipher; -import com.nimbusds.jwt.SignedJWT; @Primary @Service @@ -68,22 +51,13 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); public static final String HEADER_GROUP = "HEADER_GROUP"; - public static final String HTTP_STATUS = "HTTP_STATUS"; // jwhong - // HEADER_GROUP JSON에 추가할 항목 정의, 없으면 전체 header 추가 + public static final String HTTP_STATUS = "HTTP_STATUS"; public static final String HEADER_KEYS = "HEADER_KEYS"; public static final String PROPERTIES_NAME_HTTP_REQUEST_METHOD = "httpRequestMethod"; - private static final String JSON_CONTENT_TYPE = "application/json"; - private static final String JSON_FIELD_NAME = "json-body"; - private static final String FILE_GROUP_NAME = "image-file"; - private static final String UPLOAD_ROOT_PATH = "UPLOAD_ROOT_PATH"; - public static final String PAYLOAD_PARAM_NAME_CLIENT_ID = "client_id"; // jwhong - private boolean encryptResponseApply; // inbound에 대한 응답 암호화 여부 flag - public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, AdapterGroupVO adapterGroupVO, AdapterVO adapterVO, Properties transactionProp) throws Exception { int traceLevel = 0; - AdapterPropManager manager = null; String adptGrpName = adapterGroupVO.getName(); String adptName = adapterVO.getName(); @@ -99,61 +73,56 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { String paramValue = null; String adptMsgType = null; - + transactionProp.put(INBOUND_METHOD, request.getMethod()); transactionProp.put(INBOUND_URI, request.getRequestURI()); transactionProp.put(INBOUND_QUERY_STRING, StringUtils.defaultString(request.getQueryString())); transactionProp.put(INBOUND_HEADER, getHeaders(request)); - transactionProp.put(INBOUND_EXTPARAMS, StringUtils.defaultString(request.getQueryString())); + transactionProp.put(INBOUND_EXTPARAMS, StringUtils.defaultString(request.getQueryString())); if (StringUtils.equals(adapterVO.getAdapterGroupVO().getType(), Keys.TYPE_REST) || StringUtils.equals(adapterVO.getAdapterGroupVO().getType(), Keys.TYPE_HTTP_CUSTOM)) { // /api/v1/public/getUserInfo.svc String extUrl = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); transactionProp.put(INBOUND_EXTURI, extUrl); } else { - transactionProp.put(INBOUND_EXTURI, getExtUri(request)); + transactionProp.put(INBOUND_EXTURI, getExtUri(request)); } - transactionProp.put(INBOUND_CLIENT_IP, getClientIp(request)); // Client IP 추가 + transactionProp.put(INBOUND_CLIENT_IP, getClientIp(request)); transactionProp.put(Processor.REQUEST_ACTION, adapterVO.getAdapterGroupVO().getRefClass()); transactionProp.put(API_PATH, httpProp.getProperty(API_PATH, "")); - - //djerp bypass + transactionProp.put(INBOUND_REWRITE_PATH, getRewritePath(transactionProp.getProperty(INBOUND_EXTURI), transactionProp.getProperty(API_PATH))); transactionProp.put(INBOUND_REMOTE_ADDR, request.getRemoteAddr()); transactionProp.put(INBOUND_SCHEME, request.getScheme()); - + transactionProp.put(PRE_FILTERS, httpProp.getProperty(PRE_FILTERS, "")); transactionProp.put(POST_FILTERS, httpProp.getProperty(POST_FILTERS, "")); transactionProp.put(PROPERTIES_NAME_HTTP_REQUEST_METHOD, request.getMethod()); transactionProp.put(ALLOW_IP, httpProp.getProperty(ALLOW_IP, "")); transactionProp.put("BLOCK_IP", httpProp.getProperty("BLOCK_IP", "")); - - //djerp bypass + Map pathVariables = assignPathVariables(request, adptGrpName, adptName, null, transactionProp); if (pathVariables != null) { transactionProp.put(INBOUND_PATH_VARIABLES, pathVariables); } - + transactionProp.put(ENC_PATHS, httpProp.getProperty(ENC_PATHS, "")); - - transactionProp.put(ENCRYPT_ALGORITHM, httpProp.getProperty(ENCRYPT_ALGORITHM, "")); //jwhong - if (getHeaders(request).get(HEADER_NAME_CLIENT_ID) != null) { // jwhong - transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); + + transactionProp.put(ENCRYPT_ALGORITHM, httpProp.getProperty(ENCRYPT_ALGORITHM, "")); + if (getHeaders(request).get(HEADER_NAME_CLIENT_ID) != null) { + transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); } - transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); //jwhong -// //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong -// transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put + transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); String inboundToken = getHeaders(request).getOrDefault(INBOUND_TOKEN, "").toString(); if (StringUtils.isNotBlank(inboundToken) && StringUtils.startsWith(inboundToken, "Bearer ")) { inboundToken = inboundToken.substring(7); } transactionProp.put(INBOUND_TOKEN, inboundToken); - transactionProp.put(ENCRYPT_AES256_IV, httpProp.getProperty(ENCRYPT_AES256_IV, "")); //jwhong - transactionProp.put(ENCRYPT_AES256_KEY, httpProp.getProperty(ENCRYPT_AES256_KEY, "")); //jwhong - - - // SEED 컬럼암호하 시 Key로 사용함 + transactionProp.put(ENCRYPT_AES256_IV, httpProp.getProperty(ENCRYPT_AES256_IV, "")); + transactionProp.put(ENCRYPT_AES256_KEY, httpProp.getProperty(ENCRYPT_AES256_KEY, "")); + + // SEED 컬럼암호화 시 Key로 사용함 String seedkey = getHeaders(request).getOrDefault("x-obp-partnercode", "").toString(); ElinkTransactionContext.setSeedKey(seedkey); @@ -177,7 +146,7 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { case PUT: if (StringUtils.contains(request.getContentType(), "application/x-www-form-urlencoded")) { isParameterType = true; - } else if ( StringUtils.isNoneBlank(request.getQueryString()) ) { // jwhong + } else if (StringUtils.isNoneBlank(request.getQueryString())) { isParameterType = true; } else { isParameterType = false; @@ -189,7 +158,7 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { if (isParameterType) { paramValue = request.getQueryString(); - transactionProp.put(INBOUND_QUERY_STRING, StringUtils.defaultString(paramValue)); // Filter에서 QueryString 검증을 위해 저장 + transactionProp.put(INBOUND_QUERY_STRING, StringUtils.defaultString(paramValue)); if (paramValue == null) paramValue = ""; if (traceLevel >= 3) { @@ -228,7 +197,7 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { sb.append("}"); paramValue = sb.toString(); - + if (logger.isDebug()) { logger.debug("HttpAdapterServiceRest] RECV (" + adptGrpName + ") = [" + paramValue + "]\n" + CommonLib.getDumpMessage(paramValue.getBytes(encode))); @@ -275,17 +244,11 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { } } - if (paramValue == null) { // parameter가 없는 경우때문에 처리 + if (paramValue == null) { paramValue = ""; } - // 순수한 Body값을 저장을 위해 위치 변경. transactionProp.put(INBOUND_REQUEST_MESSAGE, paramValue); - // paramValue가 null이 아닌 빈문자열(""," ")인 경우에 대비하여 조건 수정. -// if (StringUtils.isNotBlank(paramValue)) { // jwhong decrypt -// paramValue = doPreDecryption(paramValue, transactionProp, request); -// } - if ("Y".equals(urlDecodeYn) && isParameterType) { message = URLDecoder.decode(paramValue); } else { @@ -300,11 +263,7 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { logger.debug(resMsg); } - adptMsgType = adapterVO.getAdapterGroupVO().getMessageType(); -// HttpHeaders responseHeaders = new HttpHeaders(); -// responseHeaders.setContentType(MediaType.valueOf("application/json;charset=" + encode)); - // HEADER_GROUP 셋팅 if (MessageType.JSON.equals(adptMsgType) && StringUtils.isNotBlank(headerGroupName) @@ -327,7 +286,7 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { } } } - + if (headerJson.size() > 0) { jsonMessage.put(headerGroupName, headerJson); message = jsonMessage.toJSONString(); @@ -338,9 +297,6 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { message = ""; } - // 위치변경 : 가공되지 않은 Body값을 저장하기 위하여 위쪽으로 이동. -// transactionProp.put(INBOUND_REQUEST_MESSAGE, message); - // 로컬 서비스 호출 ,encoding 처리 추가 String result = (String) service(adptGrpName, adptName, message, transactionProp, request, response); applyOutboundResponseHeaders(transactionProp, response); @@ -367,17 +323,11 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { result = mapper.writeValueAsString(rootNode); } } - - // KJBank는 요청에 대한 응답 (Sync응답, Aync 에 대한 Ack응답) 에 대하여 암호화 하지 않는다. 무조건 안한다. 따라서 아래부분은 구현은 했지만 사용하지 않는다. - // 위 2가지 경우 암호화 하는걸로 요청 변경되어 아래 암호화 수행하도록 수정함 -// encryptResponseApply = StringUtils.equalsIgnoreCase(httpProp.getProperty("ENCRYPT_RESPONSE_APPLY", "N"), "Y"); -// if ( encryptResponseApply) { -// result = doPostEncryption(result, transactionProp, request); // jwhong Encrypt -// } + return result; } - - + + /** * HttpClientAdapterServiceBypass.assignRelayDataToInbound() 에서 * transactionProp에 저장한 OUTBOUND_RESPONSE_HEADERS를 response에 적용한다. @@ -420,411 +370,6 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { } } - // jwhong decrypt - - private String doPreDecryption(String eaiBody, Properties transactionProp, HttpServletRequest request) throws Exception { - String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); - String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong - String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); - //String inboundToken2 = transactionProp.getProperty(INBOUND_TOKEN, ""); // 이건 token 값이 아니고 authorization 값이다 - String inboundToken = ""; - - String secretAES256Iv = transactionProp.getProperty("ENCRYPT_AES256_IV"); - String secretAES256Key = transactionProp.getProperty("ENCRYPT_AES256_KEY"); - - if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 - return eaiBody; - } - - inboundToken = JwtTokenExtractor(request); - xElinkClientId = JwtClientIdExtractor(inboundToken); // token에서 client id를 추출함 - - // 암호화 key를 token 내용으로 할지 client secret 내용으로 할지 결정함. adapter property에 정의함 - // ENCRYPT_ALGORITHM 을 설정했는데 ENCRYPT_BASE_TYPE을 설정안하면 Decrypt 수행시 Exception 발생함 - String clientSecret = ""; - if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) { - clientSecret = inboundToken; - } else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) { - OAuth2Manager manager = OAuth2Manager.getInstance(); - ClientDetails clientDetail = manager.getClientDeatilsStore().get(xElinkClientId); - - if ( clientDetail != null ) { // 여기서 not null 이라는 것은 apim oauth server에서 발급된 token 임. - // 즉 KJBank 에서 요청이 들어온 것이다. - clientSecret = clientDetail.getClientSecret(); - } // 그럼 업체에서 요청이 들어오면?? 업체도 apim oauth server에서 발급된 token을 사용하는것이다. - } - - byte[] decryptedMessage = null; - decryptedMessage = doInboundPreDecrypt(eaiBody, decryptAlgorithm,clientSecret,secretAES256Iv, secretAES256Key ); - - if (decryptedMessage == null) { - throw new Exception("[ApiAdapterService] Decrypt Error : Invalid encrypted message"); - } - - - String resultMessage = new String(decryptedMessage, StandardCharsets.UTF_8 ); - return resultMessage; - //return new String(decryptedMessage, StandardCharsets.UTF_8 ); - } - - - // jwhong encrypt - public String doPostEncryption(String eaiBody, Properties transactionProp, HttpServletRequest request) throws Exception { - - String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); - String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong - String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); - String inboundToken = ""; - - String secretAES256Iv = transactionProp.getProperty("ENCRYPT_AES256_IV"); - String secretAES256Key = transactionProp.getProperty("ENCRYPT_AES256_KEY"); - - if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 - return eaiBody; - } - - inboundToken = JwtTokenExtractor(request); - xElinkClientId = JwtClientIdExtractor(inboundToken); // token에서 client id를 추출함 - - // 암호화 key를 token 내용으로 할지 client secret 내용으로 할지 결정함. adapter property에 정의함 - // ENCRYPT_ALGORITHM 을 설정했는데 ENCRYPT_BASE_TYPE을 설정안하면 Decrypt 수행시 Exception 발생함 - String clientSecret = ""; - if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) { - clientSecret = inboundToken; - } else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) { - OAuth2Manager manager = OAuth2Manager.getInstance(); - ClientDetails clientDetail = manager.getClientDeatilsStore().get(xElinkClientId); - - if ( clientDetail != null ) { - clientSecret = clientDetail.getClientSecret(); - } - } - - String encryptedMessage = null; - encryptedMessage = doInboundPostEncrypt(eaiBody, decryptAlgorithm,clientSecret,secretAES256Iv, secretAES256Key ); - - if (encryptedMessage == null) { - throw new Exception("[ApiAdapterService] Encrypt Error : Invalid PlainText message"); - } - - return encryptedMessage; - //String resultMessage = new String(encryptedMessage, StandardCharsets.UTF_8 ); - //return resultMessage; - } - - - private byte[] convertObjectToBytes(Object obj) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - oos.flush(); - return bos.toByteArray(); - } - - private byte[] convertObjectToBase64Bytes(Object obj) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - oos.flush(); - oos.close(); - - // 직렬화된 byte[] → Base64 문자열 → 다시 byte[]로 변환 - String base64String = Base64.getEncoder().encodeToString(bos.toByteArray()); - return base64String.getBytes(StandardCharsets.UTF_8); - } - - public static Object convertBytesToObject(byte[] bytes) throws IOException, ClassNotFoundException { - try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - ObjectInputStream ois = new ObjectInputStream(bis)) { - return ois.readObject(); - } - } - - - private byte[] doInboundPreDecrypt(String eaiStringBody, String decryptAlgorithm, String clientSecretKey, String secretAES256Iv, String secretAES256Key) throws Exception { - - byte[] decryptedMessage = null; - //String eaiStringBody = new String(eaiBody, StandardCharsets.UTF_8); - - eaiStringBody = extractBodyMsg(decryptAlgorithm, eaiStringBody); - - if (eaiStringBody == null) { - throw new Exception("[ApiAdapterService] Cannot decrypt Error : input is plain text"); - } - - //test source - logger.debug("Base64 문자열: " + eaiStringBody); - logger.debug("Base64 문자열 길이: " + eaiStringBody.length()); - logger.debug("Base64 문자열 끝: " + eaiStringBody.substring(eaiStringBody.length() - 10)); - - // Base64 디코딩 테스트 - try { - byte[] decoded = Base64.getDecoder().decode(eaiStringBody); - logger.debug("디코딩 성공, 길이: " + decoded.length); - } catch (IllegalArgumentException e) { - logger.debug("Base64 디코딩 실패: " + e.getMessage()); - } - // end test source - - switch (decryptAlgorithm) { - case "AES128": - case "AES128-TOSS": - try { - String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? - //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); - String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); - } - break; - case "AES128-TOGETHER": - try { - String key128 = clientSecretKey.substring(44,60); //togetherEncoder 경우는 substring(44,60) 이네?? - //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); - String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); - } - break; - case "AES256": - try { - String key = clientSecretKey.substring(10,42); - String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, key); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); - } - break; - case "AES256-KAKAO": - try { - String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, secretAES256Iv, secretAES256Key); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); - } - break; - case "AES256-TOSS": - try { - String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, secretAES256Iv, secretAES256Key); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); - } - break; - - case "AES256GCM": - try { - byte[] key = AES256GCMCipher.generateKey(); - AES256GCMCipher cipher = new AES256GCMCipher(key); - byte[] aad = "metadata".getBytes(); - - String decryptedStrMessage = cipher.decrypt(eaiStringBody , aad); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256GCM Encryption error=" + e.getMessage()); - } - break; - default: - try { - decryptedMessage = eaiStringBody.getBytes(); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] doOutboundPostFilter Array copy error=" + e.getMessage()); - } - break; - } - - return decryptedMessage; - } - - private String extractBodyMsg(String decryptAlgorithm, String eaiStringBody) { - - String decryptedJsonKey = ""; - String decryptedBodyMessage = ""; - - decryptedJsonKey = getJsonKey(decryptAlgorithm); - - try { - JSONParser parser = new JSONParser(); - JSONObject jsonObject = (JSONObject) parser.parse(eaiStringBody); - decryptedBodyMessage = (String) jsonObject.get(decryptedJsonKey); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClient5AdapterServiceRest] extractBodyMsg error : " + e.getMessage()); - } - - return decryptedBodyMessage; - - } - - private String getJsonKey(String Algorithm) { - - String jsonKey = ""; - - switch (Algorithm) { - case "AES128": - case "AES128-TOSS": - jsonKey = "preScreeningRequest"; - break; - case "AES128-TOGETHER": - jsonKey = "obpTxData"; - break; - case "AES256": - jsonKey = "preScreeningRequest"; - break; - case "AES256-KAKAO": - jsonKey = "encrypted_data"; - break; - case "AES256-TOSS": - jsonKey = "encryptedData"; - break; - case "AES256-NICEON": - jsonKey = "enc_data"; - break; - case "AES256GCM": - break; - default: - break; - } - return jsonKey; - } - - private String doInboundPostEncrypt(String eaiStringBody, String encryptAlgorithm, String clientSecretKey, String secretAES256Iv, String secretAES256Key) { - - //byte[] encryptedMessage = null; - String encryptedStrMessage = null; - String encryptedJsonKey = ""; - - encryptedJsonKey = getJsonKey(encryptAlgorithm); - - switch (encryptAlgorithm) { - case "AES128": - case "AES128-TOSS": - try { - String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? - encryptedStrMessage = AESCipher.encrypt(eaiStringBody, key128); - //encryptedMessage = encryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES128 Encryption error=" + e.getMessage()); - } - break; - case "AES128-TOGETHER": - try { - String key128 = clientSecretKey.substring(44,60); //togetherEncoder 경우는 substring(44,60) 이네?? - encryptedStrMessage = AESCipher.encrypt(eaiStringBody, key128); - //encryptedMessage = encryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES128 Encryption error=" + e.getMessage()); - } - break; - case "AES256": - try { - String key = clientSecretKey.substring(10,42); - encryptedStrMessage = AES256Cipher.encrypt(eaiStringBody, key); - //encryptedMessage = encryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Encryption error=" + e.getMessage()); - } - break; - case "AES256-KAKAO": - try { - encryptedStrMessage = AES256Cipher.encrypt(eaiStringBody, secretAES256Iv, secretAES256Key); - //encryptedMessage = encryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Encryption error=" + e.getMessage()); - } - break; - case "AES256-TOSS": - try { - encryptedStrMessage = AES256Cipher.encrypt(eaiStringBody, secretAES256Iv, secretAES256Key); - //encryptedMessage = encryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Encryption error=" + e.getMessage()); - } - break; - - case "AES256GCM": - try { - byte[] key = AES256GCMCipher.generateKey(); - AES256GCMCipher cipher = new AES256GCMCipher(key); - byte[] aad = "metadata".getBytes(); - - encryptedStrMessage = cipher.encrypt(eaiStringBody , aad); - //encryptedMessage = encryptedStrMessage.getBytes(StandardCharsets.UTF_8); - - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256GCM Encryption error=" + e.getMessage()); - } - break; - default: - try { - encryptedStrMessage = eaiStringBody; - //encryptedMessage = eaiStringBody.getBytes(); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] doOutboundPostFilter Array copy error=" + e.getMessage()); - } - break; - } - - Map map = new HashMap<>(); - map.put(encryptedJsonKey, encryptedStrMessage); - JSONObject json = new JSONObject(); - json.putAll(map); - return json.toJSONString(); - //return encryptedMessage; - } - - - - private String JwtTokenExtractor(HttpServletRequest request) { - - String Token = ""; - try { - Token = JwtAuthFilter.extractJWTToken(request); - } catch (Exception e) { - logger.error(e.getMessage()); - } - - logger.debug("Token is: " + Token); - return Token; - - } - - private String JwtClientIdExtractor(String inboundToken) { - - String tokenClientId =""; - try { - SignedJWT signedJWT = SignedJWT.parse(inboundToken); - tokenClientId = (String) signedJWT.getJWTClaimsSet().getClaim(PAYLOAD_PARAM_NAME_CLIENT_ID); - } catch (Exception e) { - logger.error(e.getMessage()); - tokenClientId = ""; - } - - logger.debug("Token Client ID: " + tokenClientId); - return tokenClientId; - - } - - // jwhong until here - - private Map assignParameterMap(HttpServletRequest request, String adptGrpName, String adptName, Object requestBytes, Properties prop) { // PathVariable 체크 @@ -861,11 +406,11 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { return request.getParameterMap(); } - + private String getRewritePath(String extUri, String basePath) { return StringUtils.removeStart(extUri, StringUtils.removeEnd(basePath, "/")); } - + private Map assignPathVariables(HttpServletRequest request, String adptGrpName, String adptName, Object requestBytes, Properties prop) { Map variablesMap = null; @@ -890,7 +435,7 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { return variablesMap; } - + private Properties getHeaders(HttpServletRequest request) { Properties prop = new Properties(); @@ -933,11 +478,6 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { } - /** - * HTTP 요청에서 클라이언트 IP를 추출합니다. - * X-Forwarded-For 헤더가 있는 경우 이를 우선적으로 사용하고, - * 없는 경우 remoteAddr을 사용합니다. - */ private String getClientIp(HttpServletRequest request) { String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { @@ -957,35 +497,4 @@ public class DJErpApiAdapterService extends HttpAdapterServiceSupport { } return ipAddress; } - - private String assignApiId(String adptGrpName, String adptName, Object message, Properties prop, - HttpServletRequest request) { - String apiId = null; - try { - String actionName = prop.getProperty(Processor.REQUEST_ACTION); - RequestAction action = ActionFactory.createAction(actionName); - action.setAdapterInfo(adptGrpName, adptName, prop); - String[] keys = action.perform(message); - apiId = keys[0]; - - // PathVariable 지원 추가 - apiId = StandardMessageUtil.getMatchedKey(apiId, actionName); - } catch (Exception e) { - logger.error(e.getMessage()); - } - -// // header 에서 확보 -// String apiId = request.getHeader(HEADER_NAME_API_CODE); -// if (StringUtils.isBlank(apiId)) { -// // url에서 확보 -// // /ONLWeb/api/v1/public/getUserInfo.svc/ -// apiId = request.getRequestURI(); -// // /ONLWeb/api/v1/public/getUserInfo.svc -// apiId = StringUtils.removeEnd(apiId, "/"); -// // getUserInfo.svc -// apiId = StringUtils.substringAfterLast(apiId, "/"); -// } - - return apiId; - } }