From 0a692f8a07fee26ee1d5cf3bdea48bfe47095b13 Mon Sep 17 00:00:00 2001 From: curry772 Date: Tue, 30 Jun 2026 16:24:15 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=94=EB=B3=B5=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/service/DJBApiAdapterService.java | 5 +- .../DouzoneEncFieldOutCryptoFilter.java | 56 +++++++++++++++++++ .../impl/filter/EncFieldOutCryptoFilter.java | 8 +-- .../filter/DouzoneEncFieldInCryptoFilter.java | 30 +++++++--- .../filter/EncFieldInCryptoFilter.java | 28 +++++++++- 5 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/DouzoneEncFieldOutCryptoFilter.java diff --git a/src/main/java/com/eactive/eai/adapter/service/DJBApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/DJBApiAdapterService.java index 4621dd7..3f06499 100644 --- a/src/main/java/com/eactive/eai/adapter/service/DJBApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/DJBApiAdapterService.java @@ -75,7 +75,9 @@ public class DJBApiAdapterService extends HttpAdapterServiceSupport { public static final String PAYLOAD_PARAM_NAME_CLIENT_ID = "client_id"; // jwhong - public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, + private ObjectMapper mapper = new ObjectMapper(); + + public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, AdapterGroupVO adapterGroupVO, AdapterVO adapterVO, Properties transactionProp) throws Exception { int traceLevel = 0; @@ -361,7 +363,6 @@ public class DJBApiAdapterService extends HttpAdapterServiceSupport { String syncAsyncType = transactionProp.getProperty(INBOUND_SYNC_ASYNC_TYPE); if (!"ASYN".equals(syncAsyncType) && MessageType.JSON.equals(adptMsgType) && StringUtils.isNotBlank(headerGroupName)) { - ObjectMapper mapper = new ObjectMapper(); ObjectNode rootNode = (ObjectNode) mapper.readTree(result); JsonNode headerGroup = rootNode.get(headerGroupName); if(headerGroup != null) { diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/DouzoneEncFieldOutCryptoFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/DouzoneEncFieldOutCryptoFilter.java new file mode 100644 index 0000000..7a141ae --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/DouzoneEncFieldOutCryptoFilter.java @@ -0,0 +1,56 @@ +package com.eactive.eai.custom.adapter.http.client.impl.filter; + +import java.util.Properties; + +import com.eactive.eai.adapter.http.client.impl.HttpClient5AdapterServiceRest; +import com.eactive.eai.adapter.http.client.impl.filter.OutCryptoFilter; +import com.eactive.eai.adapter.http.dynamic.filter.InCryptoFilter; +import com.eactive.eai.util.JsonPathUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * 토스 암복호화에 맟추어 커스텀 + */ +public class DouzoneEncFieldOutCryptoFilter extends EncFieldOutCryptoFilter { + + private final OutCryptoFilter filter = new OutCryptoFilter(); + + protected Properties setProp(Properties tempProp) { + tempProp.setProperty(OutCryptoFilter.PROP_DEC_FROM_PATH, "/encryptedData"); + tempProp.setProperty(OutCryptoFilter.PROP_ENC_TO_PATH, "/encryptedData"); + return tempProp; + } + + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + String headerGroupName = prop.getProperty(HttpClient5AdapterServiceRest.HEADER_GROUP); + + JsonNode root = JsonPathUtil.toTree(message); + ObjectNode rootObjectNode = (ObjectNode) root; + JsonNode header = rootObjectNode.get(headerGroupName); + rootObjectNode.remove(headerGroupName); + + String xEmpNm = header.get("x-emp-nm").asText(); + tempProp.setProperty("x-emp-nm", xEmpNm); + tempProp.setProperty(InCryptoFilter.PROP_AAD_HEADER, xEmpNm); + String xChnlNm = header.get("x-chnl-nm").asText(); + tempProp.setProperty("x-chnl-nm", xChnlNm); + + Object enc = filter.doPreFilter(adptGrpName, adptName, prop, rootObjectNode, setProp(tempProp)); + + ObjectNode encJson = (ObjectNode)JsonPathUtil.toTree(enc); + encJson.set(headerGroupName, header); + + return encJson; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return filter.doPostFilter(adptGrpName, adptName, setProp(prop), message, setProp(tempProp)); + } + +} diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/EncFieldOutCryptoFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/EncFieldOutCryptoFilter.java index 2ef1ede..cd2c833 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/EncFieldOutCryptoFilter.java +++ b/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/filter/EncFieldOutCryptoFilter.java @@ -15,10 +15,10 @@ public class EncFieldOutCryptoFilter implements HttpClientAdapterFilter { private final OutCryptoFilter filter = new OutCryptoFilter(); - protected Properties setProp(Properties p) { - p.setProperty(OutCryptoFilter.PROP_DEC_FROM_PATH, "/encryptedData"); - p.setProperty(OutCryptoFilter.PROP_ENC_TO_PATH, "/encryptedData"); - return p; + protected Properties setProp(Properties tempProp) { + tempProp.setProperty(OutCryptoFilter.PROP_DEC_FROM_PATH, "/encryptedData"); + tempProp.setProperty(OutCryptoFilter.PROP_ENC_TO_PATH, "/encryptedData"); + return tempProp; } @Override diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/DouzoneEncFieldInCryptoFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/DouzoneEncFieldInCryptoFilter.java index bbdecc1..787d7d8 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/DouzoneEncFieldInCryptoFilter.java +++ b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/DouzoneEncFieldInCryptoFilter.java @@ -9,10 +9,12 @@ import org.springframework.http.HttpStatus; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; import com.eactive.eai.adapter.http.dynamic.filter.FilterCryptoException; -import com.eactive.eai.adapter.http.dynamic.filter.FilterException; import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter; import com.eactive.eai.adapter.http.dynamic.filter.InCryptoFilter; -import com.eactive.eai.common.security.keyderiv.KeyDerivationStrategy; +import com.eactive.eai.adapter.service.DJBApiAdapterService; +import com.eactive.eai.util.JsonPathUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; /** * 더존 연동용 수신 암복호화 필터. @@ -31,8 +33,6 @@ import com.eactive.eai.common.security.keyderiv.KeyDerivationStrategy; */ public class DouzoneEncFieldInCryptoFilter implements HttpAdapterFilter { - public static final String ERROR_DEC_FAIL = "E.DECRYPT_FAIL"; - public static final String ERROR_ENC_FAIL = "E.ENCRYPT_FAIL"; private final InCryptoFilter filter = new InCryptoFilter(); protected Properties setProp(Properties p) { @@ -56,7 +56,7 @@ public class DouzoneEncFieldInCryptoFilter implements HttpAdapterFilter { setContext(prop); return filter.doPreFilter(adptGrpName, adptName, message, setProp(prop), request, response); } catch (Exception e) { - throw new FilterCryptoException("복호화 오류", ERROR_DEC_FAIL, HttpStatus.INTERNAL_SERVER_ERROR.value(), e); + throw new FilterCryptoException("복호화 오류", InCryptoFilter.ERROR_DEC_FAIL, HttpStatus.INTERNAL_SERVER_ERROR.value(), e); } } @@ -65,9 +65,25 @@ public class DouzoneEncFieldInCryptoFilter implements HttpAdapterFilter { HttpServletRequest request, HttpServletResponse response) throws Exception { try { setContext(prop); - return filter.doPostFilter(adptGrpName, adptName, resultMessage, setProp(prop), request, response); + + JsonNode root = JsonPathUtil.toTree(resultMessage); + ObjectNode rootObjectNode = (ObjectNode) root; + String headerGroupName = prop.getProperty(DJBApiAdapterService.HEADER_GROUP); + JsonNode header = null; + if(headerGroupName != null) { + header = rootObjectNode.get(headerGroupName); + rootObjectNode.remove(headerGroupName); + } + + Object enc = filter.doPostFilter(adptGrpName, adptName, rootObjectNode, setProp(prop), request, response); + ObjectNode encJson = (ObjectNode)JsonPathUtil.toTree(enc); + if(header != null) + encJson.set(headerGroupName, header); + + return encJson; + } catch (Exception e) { - throw new FilterCryptoException("암호화 오류", ERROR_ENC_FAIL, HttpStatus.INTERNAL_SERVER_ERROR.value(), e); + throw new FilterCryptoException("암호화 오류", InCryptoFilter.ERROR_ENC_FAIL, HttpStatus.INTERNAL_SERVER_ERROR.value(), e); } } diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/EncFieldInCryptoFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/EncFieldInCryptoFilter.java index ceb1e47..212db12 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/EncFieldInCryptoFilter.java +++ b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/EncFieldInCryptoFilter.java @@ -5,7 +5,14 @@ import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.http.HttpStatus; + import com.eactive.eai.adapter.http.dynamic.filter.InCryptoFilter; +import com.eactive.eai.adapter.service.DJBApiAdapterService; +import com.eactive.eai.util.JsonPathUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.eactive.eai.adapter.http.dynamic.filter.FilterCryptoException; import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter; /** @@ -27,7 +34,26 @@ public class EncFieldInCryptoFilter implements HttpAdapterFilter { @Override public Object doPostFilter(String adptGrpName, String adptName, Object resultMessage, Properties prop, HttpServletRequest request, HttpServletResponse response) throws Exception { - return filter.doPostFilter(adptGrpName, adptName, resultMessage, setProp(prop), request, response); + try { + JsonNode root = JsonPathUtil.toTree(resultMessage); + ObjectNode rootObjectNode = (ObjectNode) root; + String headerGroupName = prop.getProperty(DJBApiAdapterService.HEADER_GROUP); + JsonNode header = null; + if(headerGroupName != null) { + header = rootObjectNode.get(headerGroupName); + rootObjectNode.remove(headerGroupName); + } + + Object enc = filter.doPostFilter(adptGrpName, adptName, rootObjectNode, setProp(prop), request, response); + ObjectNode encJson = (ObjectNode)JsonPathUtil.toTree(enc); + if(header != null) + encJson.set(headerGroupName, header); + + return encJson; + + } catch (Exception e) { + throw new FilterCryptoException("암호화 오류", InCryptoFilter.ERROR_ENC_FAIL, HttpStatus.INTERNAL_SERVER_ERROR.value(), e); + } } protected Properties setProp(Properties p) {