shjung 1 tahun lalu
induk
melakukan
546d437b49

+ 67 - 73
src/main/java/com/aip/gateway/api/aip/AuthDelegateImpl.java

@@ -2,6 +2,7 @@ package com.aip.gateway.api.aip;
 
 import com.aip.gateway.api.aip.model.AipConfig;
 import com.aip.gateway.api.aip.utils.MemoryTokenCacheWithEviction;
+import com.aip.gateway.api.utils.TimeUtils;
 import com.microsoft.aad.msal4j.*;
 import com.microsoft.informationprotection.IAuthDelegate;
 import com.microsoft.informationprotection.Identity;
@@ -33,15 +34,7 @@ public class AuthDelegateImpl implements IAuthDelegate {
     private Date expiredDate = new Date();
     private String accessToken = "x";
 
-    private final String instance = "https://login.microsoftonline.com/";
-    private final String authority = "https://login.windows.net/";
-    private final String scope = "https://graph.microsoft.com/.default";
-
-    private static int LOGIN_TYPE = 0;
-    private static String CLIENT_ID = "";
-    private static String TENANT_ID = "";
-    private static String AUTHORITY = "";
-    private static Set<String> SCOPE = Collections.singleton("");
+    private final String AUTHORITY = "https://login.microsoftonline.com/";  // https://login.microsoftonline.com/{tenant}
 
     public AuthDelegateImpl(AipConfig aipConfig) throws Exception {
         this.aipConfig = aipConfig;
@@ -49,89 +42,88 @@ public class AuthDelegateImpl implements IAuthDelegate {
 
         String cacheKey = aipConfig.getClientId() + "_" + aipConfig.getTenantId() + "_AppTokenCache";
         MemoryTokenCacheWithEviction memoryTokenCacheWithEviction = new MemoryTokenCacheWithEviction(cacheKey);
-        //TokenCacheAspect tokenCacheAspect = new TokenCacheAspect("token_cache.json");
 
-        CLIENT_ID = aipConfig.getClientId();
-        TENANT_ID = aipConfig.getTenantId();
         if (aipConfig.getLoginType() == AipConfig.authLoginPassword) {
-            LOGIN_TYPE = 0;
-            confidentialApp = ConfidentialClientApplication.builder(
-                            aipConfig.getClientId(),
-                            ClientCredentialFactory.createFromSecret(aipConfig.getSecretValue()))
-                    .authority(instance + aipConfig.getTenantId())
+            IClientCredential credential = ClientCredentialFactory.createFromSecret(aipConfig.getSecretValue());
+            confidentialApp = ConfidentialClientApplication
+                    .builder(aipConfig.getClientId(), credential)
+                    .authority(AUTHORITY + aipConfig.getTenantId())
                     .setTokenCacheAccessAspect(memoryTokenCacheWithEviction)
                     .build();
         }
         else if (aipConfig.getLoginType() == AipConfig.authLoginCert) {
-            LOGIN_TYPE = 1;
             InputStream certStream = new ByteArrayInputStream(Files.readAllBytes(Paths.get(aipConfig.getCertThumbPrint())));
-
             String password = "hanteinfo1234!";
-            confidentialApp = ConfidentialClientApplication.builder(
-                            aipConfig.getClientId(),
+            confidentialApp = ConfidentialClientApplication
+                    .builder(aipConfig.getClientId(),
                             ClientCredentialFactory.createFromCertificate(certStream, password))
-                    .authority(authority+aipConfig.getTenantId())
+                    .authority(AUTHORITY +aipConfig.getTenantId())
                     .setTokenCacheAccessAspect(memoryTokenCacheWithEviction)
                     .build();
         }
-        else {
-            throw new Exception("지원하지 않는 AIP 인증 방법 입니다.");
-        }
-        if (confidentialApp != null) {
-            log.info("AuthDelegateImpl: Refresh token provider setting.");
-            //confidentialApp.appTokenProvider();
-        }
+        else throw new Exception("지원하지 않는 AIP 인증 방법 입니다.");
     }
     @Override
     public String acquireToken(Identity identity, String authority, String resource, String claim) {
-        if (authenticationResult != null) {
-            if (authenticationResult.expiresOnDate().before(new Date())) {
-                log.error("Access token expired #################################################################################################");
-            }
+        Set<String> scope;
+        if (resource.endsWith("/")){
+            scope = Collections.singleton(resource + ".default");
         }
-        return AcquireTokenByCertificate(identity, authority, resource, claim);
-    }
-    private static IAuthenticationResult acquireTokenInteractive() throws Exception {
-
-        // Load token cache from file and initialize token cache aspect. The token cache will have
-        // dummy data, so the acquireTokenSilently call will fail.
-        //TokenCacheAspect tokenCacheAspect = new TokenCacheAspect("sample_cache.json");
-        String cacheKey = CLIENT_ID + "_" + TENANT_ID + "_AppTokenCache";
-        MemoryTokenCacheWithEviction memoryTokenCacheWithEviction = new MemoryTokenCacheWithEviction(cacheKey);
-
-        ConfidentialClientApplication pca = ConfidentialClientApplication.builder(
-                        CLIENT_ID,
-                            ClientCredentialFactory.createFromSecret("CvW8Q~0iANtLN1Y2EXR_nVyYb_tQTDwjW-Z7Ndg3"))
-                    .authority("https://login.microsoftonline.com/" + TENANT_ID)
-                    .setTokenCacheAccessAspect(memoryTokenCacheWithEviction)
-                    .build();
-
-        Set<IAccount> accountsInCache = pca.getAccounts().join();
-        // Take first account in the cache. In a production application, you would filter
-        // accountsInCache to get the right account for the user authenticating.
-        IAccount account = accountsInCache.iterator().next();
+        else {
+            scope = Collections.singleton(resource + "/.default");
+        }
+        // authority                            scope
+        // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
+        // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
+        // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
+        // https://login.windows.net/common     https://aadrm.com/.default
+        // https://login.windows.net/common     https://aadrm.com/.default
+        // https://login.windows.net/common     https://aadrm.com/.default
+        // Wed Jun 05 10:41:59 KST 2024
+        // https://login.windows.net/2e58414a-c6ae-43ff-aaf5-45ab8b78a404     https://aadrm.com/.default
 
-        IAuthenticationResult result;
+        //log.info("{}, acquireToken: identity = {}, authority = {}, scope = {}", Thread.currentThread(), identity.getEmail(), authority, scope);
         try {
-            SilentParameters silentParameters =
-                    SilentParameters
-                            .builder(SCOPE, account)
-                            .build();
-
-            // try to acquire token silently. This call will fail since the token cache
-            // does not have any data for the user you are trying to acquire a token for
-            result = pca.acquireTokenSilently(silentParameters).join();
-        } catch (Exception ex) {
+            SilentParameters silentParameters = SilentParameters.builder(scope).build();
+            authenticationResult = confidentialApp.acquireTokenSilently(silentParameters).join();
+        }
+        catch (Exception ex) {
             if (ex.getCause() instanceof MsalException) {
+                try {
+                    log.info("********************************************* Refresh Access Token Required.");
+                    ClientCredentialParameters parameters = ClientCredentialParameters.builder(scope).build();
+                    authenticationResult = confidentialApp.acquireToken(parameters).join();
+                }
+                catch (Exception ex2) {
+                    setError(1, "AuthDelegateImpl:acquireToken Failed.", ex2.getMessage());
+                    return "";
+                }
+            }
+            else {
+                setError(2, "AuthDelegateImpl:acquireTokenSilently Failed.", ex.getMessage());
+                return "";
+            }
+        }
 
-                ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(SCOPE).build();
-                result = pca.acquireToken(clientCredentialParam).get();
-            } else {
-                // Handle other exceptions accordingly
-                throw ex;
+        if (!expiredDate.equals(authenticationResult.expiresOnDate())) {
+            log.error("acquireToken:   expiredDate: {}", TimeUtils.dateToString2(expiredDate));
+            log.error("acquireToken: expiresOnDate: {}", TimeUtils.dateToString2(authenticationResult.expiresOnDate()));
+            expiredDate = authenticationResult.expiresOnDate();
+        }
+        if (!accessToken.equals(authenticationResult.accessToken())) {
+            log.error("acquireToken:accessTokenOLD: = {}", accessToken);
+            log.error("acquireToken:accessTokenNEW: = {}", authenticationResult.accessToken());
+            accessToken = authenticationResult.accessToken();
+        }
+        return authenticationResult.accessToken();
+    }
+    public String acquireToken2(Identity identity, String authority, String resource, String claim) {
+        if (authenticationResult != null) {
+            if (authenticationResult.expiresOnDate().before(new Date())) {
+                log.error("Access token expired #################################################################################################");
             }
         }
-        return result;
+        return AcquireTokenByCertificate(identity, authority, resource, claim);
     }
 
     private String AcquireTokenByCertificate(Identity identity, String authority, String resource, String claims)
@@ -159,12 +151,13 @@ public class AuthDelegateImpl implements IAuthDelegate {
             CompletableFuture<IAuthenticationResult> future = confidentialApp.acquireToken(clientCredentialParam);
             authenticationResult = future.get();
             if (!expiredDate.equals(authenticationResult.expiresOnDate())) {
-                log.info("acquireToken: expiredDate = {}, expiresOnDate = {}", expiredDate, authenticationResult.expiresOnDate());
+                log.error("AcquireTokenByCertificate:   expiredDate: {}", TimeUtils.dateToString2(expiredDate));
+                log.error("AcquireTokenByCertificate: expiresOnDate: {}", TimeUtils.dateToString2(authenticationResult.expiresOnDate()));
                 expiredDate = authenticationResult.expiresOnDate();
             }
             if (!accessToken.equals(authenticationResult.accessToken())) {
-                log.info("acquireToken: accessToken: OLD = {}", accessToken);
-                log.info("acquireToken: accessToken: NEW = {}", authenticationResult.accessToken());
+                log.error("AcquireTokenByCertificate:accessTokenOLD: = {}", accessToken);
+                log.error("AcquireTokenByCertificate:accessTokenNEW: = {}", authenticationResult.accessToken());
                 accessToken = authenticationResult.accessToken();
             }
             return authenticationResult.accessToken();
@@ -173,6 +166,7 @@ public class AuthDelegateImpl implements IAuthDelegate {
             if (ex.getCause() instanceof MsalException) {
                 setError(1, "AuthDelegateImpl:acquireToken, Scope provided is not supported.", ex.getMessage());
             } else {
+                log.error(ex.getMessage());
                 setError(1, "AuthDelegateImpl:acquireToken Failed.", ex.getMessage());
             }
         }

+ 9 - 10
src/main/java/com/aip/gateway/api/aip/manager/FileManager.java

@@ -235,27 +235,27 @@ public class FileManager extends AbstractManager {
     private IFileHandler createFileHandler(String inputFile, String outputFile) {
         try {
             if (!AipFileUtils.isExists(inputFile)) {
-                setError(91, "FileManager::createFileHandler(File) Failed.", "요청한 파일이 존재하지 않습니다. " + inputFile);
+                setError(91, "FileManager::createFileHandler(File) Failed.", inputFile + ": 요청한 파일이 존재하지 않습니다. output: " + outputFile);
                 return null;
             }
             FileHandlerObserver observer = new FileHandlerObserver();
             Future<IFileHandler> handlerFuture = _engine.createFileHandlerAsync(inputFile, outputFile, true, observer, null);
             return handlerFuture.get();
         } catch (InterruptedException e) {
-            setError(93, "FileManager::CreateFileHandler(File) InterruptedException Exception.", e.getMessage());
+            setError(93, "FileManager::CreateFileHandler(File) InterruptedException Exception: " + inputFile, e.getMessage());
             Thread.currentThread().interrupt();
-        } catch (ExecutionException e) {
-            setError(94, "FileManager::CreateFileHandler(File) ExecutionException Exception.", e.getMessage());
+        } catch (ExecutionException ex) {
+            setError(94, "FileManager::CreateFileHandler(File) ExecutionException Exception: " + inputFile, ex.getMessage());
         }
         return null;
     }
     private IFileHandler createFileHandler(IStream inputStream, String outputFile) {
         if (inputStream == null) {
-            setError(91, "FileManager::CreateFileHandler(Stream) Failed.", "요청한 스트림의 정보가 없습니다.");
+            setError(91, "FileManager::CreateFileHandler(Stream) Failed.", outputFile + ": 요청한 스트림의 정보가 없습니다.");
             return null;
         }
         if (outputFile == null || outputFile.isEmpty()) {
-            setError(92, "FileManager::CreateFileHandler(Stream) Failed.", "요청한 출력 파일 이릅이 존재하지 않습니다.");
+            setError(92, "FileManager::CreateFileHandler(Stream) Failed.", outputFile + ": 요청한 출력 파일 이릅이 존재하지 않습니다.");
             return null;
         }
 
@@ -264,12 +264,11 @@ public class FileManager extends AbstractManager {
             Future<IFileHandler> handlerFuture = _engine.createFileHandlerAsync(inputStream, outputFile, true, observer, null);
             return handlerFuture.get();
         } catch (InterruptedException e) {
-            setError(93, "FileManager::CreateFileHandler(Stream) InterruptedException Exception.", e.getMessage());
+            setError(93, "FileManager::CreateFileHandler(Stream) InterruptedException Exception: " + outputFile, e.getMessage());
             Thread.currentThread().interrupt();
-        } catch (ExecutionException e) {
-            setError(94, "FileManager::CreateFileHandler(Stream) ExecutionException Exception.", e.getMessage());
+        } catch (ExecutionException ex) {
+            setError(94, "FileManager::CreateFileHandler(Stream) ExecutionException Exception: " + outputFile, ex.getMessage());
         }
-
         return null;
     }
     public SetFileInfo setLabel(String fileName, String actualFileName, String email, String labelId, String templateId, String comments) {

+ 2 - 2
src/main/java/com/aip/gateway/api/aop/LoggingAspect.java

@@ -16,7 +16,7 @@ public class LoggingAspect {
     public Object loadingElapsedTime(ProceedingJoinPoint joinPoint) throws Throwable {
 
         String proceedName = String.format("%s", joinPoint.getTarget().getClass().getSimpleName() + "." + joinPoint.getSignature().getName());
-        log.info("[API] {}: START.", proceedName);
+        log.info("[API] {}: START. {}", proceedName, Thread.currentThread().getName());
         StopWatch stopWatch = new StopWatch();
         stopWatch.start(proceedName);
 
@@ -24,7 +24,7 @@ public class LoggingAspect {
 
         stopWatch.stop();
         //if (stopWatch.getTotalTimeMillis() > 1000) {
-            log.warn("[API] {}: ..END. {} ms. Completed.", proceedName, stopWatch.getTotalTimeMillis());
+            log.info("[API] {}: ..END. {}, {} ms.", proceedName, Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
         //}
 
         return proceed;

+ 3 - 3
src/main/java/com/aip/gateway/api/controller/ApiAipController.java

@@ -60,7 +60,7 @@ public class ApiAipController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "AIP Label query success.")
     @ApiOperation(value = "AIP Label 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "labels", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getLabels(
+    public ResponseEntity<ApiResponseModel> getAipLabels(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {
@@ -88,7 +88,7 @@ public class ApiAipController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "AIP Policies query success.")
     @ApiOperation(value = "AIP Policies 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "policies", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getPolicies(
+    public ResponseEntity<ApiResponseModel> getAipPolicies(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {
@@ -116,7 +116,7 @@ public class ApiAipController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "AIP Protections query success.")
     @ApiOperation(value = "AIP Protections 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "protections", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getLinkedApiKeys(
+    public ResponseEntity<ApiResponseModel> getAipLinkedApiKeys(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {

+ 4 - 4
src/main/java/com/aip/gateway/api/controller/ApiDbController.java

@@ -62,7 +62,7 @@ public class ApiDbController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Linked System query success.")
     @ApiOperation(value = "02.연계 시스템 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "linked-systems", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getLinkedSystems(
+    public ResponseEntity<ApiResponseModel> getDbLinkedSystems(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {
@@ -90,7 +90,7 @@ public class ApiDbController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Linked Server query success.")
     @ApiOperation(value = "03.연계 서버 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "linked-servers", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getLinkedServers(
+    public ResponseEntity<ApiResponseModel> getDbLinkedServers(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {
@@ -118,7 +118,7 @@ public class ApiDbController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Linked Server API KEY query success.")
     @ApiOperation(value = "04.연계 서버 API KEY 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "linked-api-keys", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getLinkedApiKeys(
+    public ResponseEntity<ApiResponseModel> getDbLinkedApiKeys(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {
@@ -146,7 +146,7 @@ public class ApiDbController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Linked Server Decrypt KEY query success.")
     @ApiOperation(value = "05.연계 서버 Decrypt KEY 조회", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @GetMapping(value = "linked-decrypt-keys", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> getLinkedDecryptKeys(
+    public ResponseEntity<ApiResponseModel> getDbLinkedDecryptKeys(
             @Parameter(name = "apiKey", description = "API Key", example = "24826125-188B-4875-A841-F9146DD267F0", required = true) String apiKey,
             HttpServletRequest request)
     {

+ 6 - 6
src/main/java/com/aip/gateway/api/controller/ApiFileController.java

@@ -58,7 +58,7 @@ public class ApiFileController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "File AIP Label set success.")
     @ApiOperation(value = "File AIP Label 설정", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "set-label", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> setLabel(
+    public ResponseEntity<ApiResponseModel> setFileLabel(
             @Parameter(name = "req", description = "File AIP Label 설정 요청 데이터", required = true)
             @RequestBody @Valid final RequestFileSet req, HttpServletRequest request)
     {
@@ -80,7 +80,7 @@ public class ApiFileController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "File AIP Label delete success.")
     @ApiOperation(value = "File AIP Label 해제", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "delete-label", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> delLabel(
+    public ResponseEntity<ApiResponseModel> delFileLabel(
             @Parameter(name = "req", description = "File AIP Label 해제 요청 데이터", required = true)
             @RequestBody @Valid final RequestFileDel req, HttpServletRequest request)
     {
@@ -102,7 +102,7 @@ public class ApiFileController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "File AIP Protection set success.")
     @ApiOperation(value = "File AIP Protection 설정", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "set-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> setProtection(
+    public ResponseEntity<ApiResponseModel> setFileProtection(
             @Parameter(name = "req", description = "File AIP Protection 설정 요청 데이터", required = true)
             @RequestBody @Valid final RequestFileSet req, HttpServletRequest request)
     {
@@ -124,7 +124,7 @@ public class ApiFileController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "File AIP Protection delete success.")
     @ApiOperation(value = "File AIP Protection 해제", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "delete-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> delProtection(
+    public ResponseEntity<ApiResponseModel> delFileProtection(
             @Parameter(name = "req", description = "File AIP Protection 해제 요청 데이터", required = true)
             @RequestBody @Valid final RequestFileDel req, HttpServletRequest request)
     {
@@ -146,7 +146,7 @@ public class ApiFileController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "File AIP Label Or Protection set success.")
     @ApiOperation(value = "File AIP Label Or Protection 설정", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "set-label-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> setLabelProtection(
+    public ResponseEntity<ApiResponseModel> setFileLabelProtection(
             @Parameter(name = "req", description = "File AIP Label Or Protection 설정 요청 데이터", required = true)
             @RequestBody @Valid final RequestFileAllSet req, HttpServletRequest request)
     {
@@ -168,7 +168,7 @@ public class ApiFileController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "File AIP Label Or Protection delete success.")
     @ApiOperation(value = "File AIP Label Or Protection 해제", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "delete-label-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> delLabelProtection(
+    public ResponseEntity<ApiResponseModel> delFileLabelProtection(
             @Parameter(name = "req", description = "File AIP Label Or Protection 해제 요청 데이터", required = true)
             @RequestBody @Valid final RequestFileDel req, HttpServletRequest request)
     {

+ 8 - 8
src/main/java/com/aip/gateway/api/controller/ApiStreamController.java

@@ -58,7 +58,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Stream AIP Label set success.")
     @ApiOperation(value = "Stream AIP Label 설정", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "set-label", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> setLabel(
+    public ResponseEntity<ApiResponseModel> setStreamLabel(
             @Parameter(name = "req", description = "Stream AIP Label 설정 요청 데이터", required = true)
             @RequestBody @Valid final RequestStreamSet req, HttpServletRequest request)
     {
@@ -80,7 +80,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Stream AIP Label delete success.")
     @ApiOperation(value = "Stream AIP Label 해제", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "delete-label", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> delLabel(
+    public ResponseEntity<ApiResponseModel> delStreamLabel(
             @Parameter(name = "req", description = "Stream AIP Label 해제 요청 데이터", required = true)
             @RequestBody @Valid final RequestStreamDel req, HttpServletRequest request)
     {
@@ -102,7 +102,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Stream AIP Protection set success.")
     @ApiOperation(value = "Stream AIP Protection 설정", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "set-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> setProtection(
+    public ResponseEntity<ApiResponseModel> setStreamProtection(
             @Parameter(name = "req", description = "Stream AIP Protection 설정 요청 데이터", required = true)
             @RequestBody @Valid final RequestStreamSet req, HttpServletRequest request)
     {
@@ -124,7 +124,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Stream AIP Protection delete success.")
     @ApiOperation(value = "Stream AIP Protection 해제", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "delete-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> delProtection(
+    public ResponseEntity<ApiResponseModel> delStreamProtection(
             @Parameter(name = "req", description = "Stream AIP Protection 해제 요청 데이터", required = true)
             @RequestBody @Valid final RequestStreamDel req, HttpServletRequest request)
     {
@@ -146,7 +146,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Stream AIP Label Or Protection set success.")
     @ApiOperation(value = "Stream AIP Label Or Protection 설정", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "set-label-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> setLabelProtection(
+    public ResponseEntity<ApiResponseModel> setStreamLabelProtection(
             @Parameter(name = "req", description = "Stream AIP Label Or Protection 설정 요청 데이터", required = true)
             @RequestBody @Valid final RequestStreamAllSet req, HttpServletRequest request)
     {
@@ -168,7 +168,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Stream AIP Label Or Protection delete success.")
     @ApiOperation(value = "Stream AIP Label Or Protection 해제", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "delete-label-protection", produces = {"application/json; charset=utf8"})
-    public ResponseEntity<ApiResponseModel> delLabelProtection(
+    public ResponseEntity<ApiResponseModel> delStreamLabelProtection(
             @Parameter(name = "req", description = "Stream AIP Label Or Protection 해제 요청 데이터", required = true)
             @RequestBody @Valid final RequestStreamDel req, HttpServletRequest request)
     {
@@ -189,7 +189,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Encrypt Stream set success.")
     @ApiOperation(value = "Encrypt Stream", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "encrypt", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE})
-    public ResponseEntity<ApiResponseModel> encryptFile(
+    public ResponseEntity<ApiResponseModel> encryptStream(
             @Parameter(description = "multipart/form-data 형식의 파일을 input 으로 받습니다. 이때 key 값은 multipartFile 입니다.")
             @RequestParam("file") MultipartFile file,
             @RequestParam("apiKey") String apiKey,
@@ -219,7 +219,7 @@ public class ApiStreamController extends  BaseController {
     @ApiResponse(responseCode = "200", description = "Decrypt Stream set success.")
     @ApiOperation(value = "Decrypt Stream", response = ApiResponseModel.class, responseContainer = "ArrayList")
     @PostMapping(value = "decrypt", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE})
-    public ResponseEntity<ApiResponseModel> decryptFile(
+    public ResponseEntity<ApiResponseModel> decryptStream(
             @Parameter(description = "multipart/form-data 형식의 파일을 input 으로 받습니다. 이때 key 값은 multipartFile 입니다.")
             @RequestParam("file") MultipartFile file,
             @RequestParam("apiKey") String apiKey,

+ 1 - 1
src/main/java/com/aip/gateway/api/scheduler/SchedulerTask.java

@@ -35,7 +35,7 @@ public class SchedulerTask {
         Elapsed elapsed = new Elapsed();
         log.info("SchedulerTask.scheduleAipDownload: Start. {}", Thread.currentThread().getName());
         boolean result = runScheduleAipDownload();
-        log.info("SchedulerTask.scheduleAipDownload: ..End. {} ms. result: {}, {}", elapsed.milliSeconds(), result, Thread.currentThread().getName());
+        log.info("SchedulerTask.scheduleAipDownload: ..End. {}, {} ms. result: {}", Thread.currentThread().getName(), elapsed.milliSeconds(), result);
     }
 
     private boolean runScheduleAipDownload() {

+ 5 - 1
src/main/java/com/aip/gateway/api/utils/TimeUtils.java

@@ -51,7 +51,11 @@ public class TimeUtils {
 		cal.setTime(paramDt);
 		return new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
 	}
-
+	public static String dateToString2(Date paramDt) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(paramDt);
+		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
+	}
 	/* 현재 시각을 second 로 리턴 */
 	public static long getCurrentTimeSeconds() {
 		Calendar cal = Calendar.getInstance();

+ 6 - 0
src/main/resources/application.yml

@@ -3,6 +3,9 @@ application:
   aip-server-id: 0
 
 spring:
+  output:
+    ansi:
+      enabled: always
   application:
     name: AipGateway.API
   main:
@@ -49,6 +52,9 @@ logging:
 server:
   port: 5050
   shutdown: graceful
+  #tomcat:
+  #  threads:
+  #    max: 200
   error:
     whitelabel:
       enabled: true