Skip to main content

SHIELDEX Policy Integration API Specification

※ Last updated: 2026-03-24

Document Information

itemContent
Document Version6.2026.0324.01
WriteSOFTCAMP
Content-Typeapplication/json

Environment Setup (Required)

IP Allowance Prior Consultation Required

This API isIP-based Access Controlis applied.
To use the API, the customer company'sAccess Source IP AddressYou need to deliver it to SOFTCAMP in advance.

Customer Preparation Requirements

Please provide the following information about the server/system that will call the API.

Delivery Information

  • Access source IP address (e.g:192.168.1.50, 10.10.12.100)
  • Purpose (e.g., security portal server, batch job server)

How to Set Up SOFTCAMP Engineer

SHIELDEX server'sWebConsoleApi.propertiesRegister allowed IPs in the file.

Configuration File Location

{SHIELDEX 설치 경로}/config/WebConsoleApi.properties

IP Allow List Configuration

Setting KeyDescriptionexample
security.ip.allowedNo-token call allowed IP whitelist (comma-separated)10.10.12.43,10.10.12.44
Important

Allow list(security.ip.allowedif a request is made from an IP not in __PH_0__Blockand will respond as follows.

{
"timestamp": "2026-02-11T06:12:33.739+0000",
"status": 403,
"error": "Forbidden",
"message": "IP_ACCESS_DENIED",
"path": "/WebConsoleApi/policy/targets"
}
  • status: 403
  • error: Forbidden
  • message: IP_ACCESS_DENIED

After changing the settings, be sure toRestarting the SHIELDEX WebConsole serviceThis is needed.


Base URL

http://{serverIp}:{serverPort}/WebConsoleApi

All API paths are called by appending them to the above Base URL.

example— Server IP is10.10.12.100, port is9000in case:

http://10.10.12.100:9000/WebConsoleApi/policy/targets/merged/preview/user001

API Resource Map

This is the list of APIs provided in this document.

Base URL: http://{serverIp}:{serverPort}/WebConsoleApi

/policy/targets
├── GET /policy/targets/merged/preview/{targetId} # Policy Integration Preview
├── POST /policy/targets # Partial Policy Update
└── DELETE /policy/targets # Selective Policy Deletion
MethodURIDescription
GET/policy/targets/merged/preview/{targetId}Merged Overall View of Corporate + Individual Policies
POST/policy/targetsAdd/modify only the requested policy (keep existing)
DELETE/policy/targetsRelease only the requested policy (restore to the parent policy)

1. Common Rules

1.1 Response Structure

All API responses follow the format below.

{
"code": 0,
"codeMessage": "SUCCESS",
"data": { }
}
fieldtypeDescription
codeIntegerProcessing Result Code
codeMessageStringProcessing Result Message
dataObjectResponse Data (returned on GET requests, may be omitted on POST/DELETE)

1.2 Response Code Definition

codecodeMessageDescriptionHTTP Status
0SUCCESSNormal processing completed200
1FAILUnable to process200
4000INVALID_REQUESTInvalid request (missing required values, validation violations, body format/Content-Type errors, etc.)400
4404VALUE_NOT_FOUNDNon-existent target (targetId, policyId, etc.)404
5000INTERNAL_ERRORInternal Server Error500

1.3 Timestamp Rules

Unit Warning: epoch milliseconds (13 digits)

All timestamp fields areepoch millisecondsIt is in units of (1/1000 seconds).
Unix epoch seconds (10 digits) is**No.**Please make sure to check the number of digits.

epoch seconds     : 1761523200        (10 digits) ← This is not the unit
epoch milliseconds: 1761523200000 (13 digits) ← The unit used in this API
Timezone Notice: Always use KST (Asia/Seoul) standard

When converting date/time to epoch milliseconds, always**KST (UTC+9, Asia/Seoul)**It must be converted based on the criteria.

When converted to UTC, a difference of 9 hours occurs, resulting in an application that differs from the intended duration.

"2026-03-21 00:00:00" KST 기준 → 1774278000000  ← correct value  
"2026-03-21 00:00:00" UTC 기준 → 1774310400000 ← 9 hours delayed (applied as KST 09:00)
  • Java: sdf.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"))use
  • JavaScript: new Date('2026-03-21T00:00:00+09:00')use
  • TimeZone.getTimeZone("UTC")Prohibited

Fields related to Timestamp

fieldtypeDirectionDescription
startTimestampLong (int64)Input/OutputPolicy application start time (epoch ms,KST standard). Apply immediately if omitted
endTimestampLong (int64)Input/OutputPolicy application end time (epoch ms,KST standard). If omitted, indefinitely
startTimestampTextStringOutput onlyKST conversion date (e.g:2025-12-04 09:52:33)
endTimestampTextStringOutput onlyKST conversion date. If indefinite,null

Conversion code example

// JavaScript (KST 기준)
const start = Date.now(); // 현재 시각 (즉시 적용)
const end = new Date('2026-03-01T00:00:00+09:00').getTime(); // KST 2026-03-01 자정
// Java 1.7 (JDK 1.7) - SimpleDateFormat 사용
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class PolicyTimestamp {
public static void main(String[] args) throws Exception {
// KST 기준 날짜 문자열 파싱
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));

// 현재 시각 (즉시 적용)
long start = System.currentTimeMillis();

// KST 기준 특정 날짜를 epoch milliseconds 로 변환
// 예: KST 2026-03-21 00:00:00 ~ 2026-03-21 23:59:59 (하루)
long dayStart = sdf.parse("2026-03-21 00:00:00").getTime();
long dayEnd = sdf.parse("2026-03-21 23:59:59").getTime();

System.out.println("startTimestamp: " + dayStart); // 1774278000000
System.out.println("endTimestamp: " + dayEnd); // 1774364399000
}
}
// Java 1.8 이상 (JDK 1.8+) - LocalDateTime + ZoneId 사용
import java.time.LocalDateTime;
import java.time.ZoneId;

public class PolicyTimestamp {
public static void main(String[] args) {
ZoneId kst = ZoneId.of("Asia/Seoul");

// 현재 시각 (즉시 적용)
long start = System.currentTimeMillis();

// KST 기준 특정 날짜를 epoch milliseconds 로 변환
// 예: KST 2026-03-21 00:00:00 ~ 2026-03-21 23:59:59 (하루)
long dayStart = LocalDateTime.of(2026, 3, 21, 0, 0, 0)
.atZone(kst).toInstant().toEpochMilli();
long dayEnd = LocalDateTime.of(2026, 3, 21, 23, 59, 59)
.atZone(kst).toInstant().toEpochMilli();

System.out.println("startTimestamp: " + dayStart); // 1774278000000
System.out.println("endTimestamp: " + dayEnd); // 1774364399000
}
}
tip
API version independenceThe API is not dependent on a specific Java version.

The required value is **epoch milliseconds in KST (13-digit integer)**.

  • Java 1.7 (JDK 1.7): SimpleDateFormat, Date, CalendarGenerating epoch milliseconds with etc.
  • Java 1.8+ (JDK 1.8+): InstantEasy conversion with classes

The above example is for reference, and it also works in the Java 1.7 environment.System.currentTimeMillis()You can also generate and use the same 13-digit millisecond value in various ways.

Reference: startTimestampText, endTimestampTextis an output-only field, so it cannot be used for input.

Validity Rules

  • When both are specifiedendTimestampastartTimestampIt must be larger (in case of violation400 INVALID_REQUEST)
  • If both are omitted, it will be applied immediately and indefinitely.

1.4 Policy Priorities

The policy value is determined by the following priority. If a higher one exists, it overrides the lower one.

User Individual Policy  ← Highest Priority

Group Policy

Enterprise Default Policy ← Lowest Priority

1.5 Override Information

This is the field included in each policy item of the query response. You can find out where the policy is set.

fieldtypeDescription
overriddenBooleanWhen individual policies are appliedtrue, if it is the default value of the warriorfalse
overriddenByStringPolicy Source:"user" / "group" / "default"
overriddenByIdStringUser ID or Group ID that set the policy (defaultIf sonull)

1.6 Request Body Format (Content-Type) Rules

:::warning[ImportantPOST /policy/targets, DELETE /policy/targetsmust be **JSON body +Content-Type: application/json**must be called with.**] text/plainIf you call in a format other than JSON, the request will be denied. :::

  • Recommended Header:Content-Type: application/json
  • Not Recommended Example:Content-Type: text/plain;charset=UTF-8(Request Denied)

Failure Response Example (Body Format Error)

{
"code": 4000,
"codeMessage": "INVALID_REQUEST"
}

2. Policy Integration Inquiry

GET /policy/targets/merged/preview/{targetId}

Enterprise policy and target individual policyMergeTherefore, it returns the overall policy results that will be actually applied to the user.

Full URL Example

GET http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets/merged/preview/user001

Path Parameters

ParametertypeRequiredDescription
targetIdStringOTarget User ID

Response Field

fieldtypeDescription
data.targetIdStringTarget ID
data.templatesArrayPolicy List by Category
data.templates[].categoryIdIntegerCategory ID
data.templates[].categoryNameStringCategory name (e.g., Common, Exception, MS Office ...)
data.templates[].policyListArrayList of policy items for the corresponding category

Policy Item (policyList) Field

fieldtypeDescription
policyIdStringPolicy Unique Identifier (e.g:SD_DOC_OP_MODE)
policyNameStringPolicy Display Name
policyValueStringorIntegerCurrent applied policy value
policyDescStringPolicy Detailed Description
uiTypeCodeIntegerUI Type —1: Text input,2: Selectable
uiOptionsArraySelectable Option List (uiTypeCode=2only exists when)
overriddenBooleanApplication of Individual Policies
overriddenByStringPolicy Source (user / group / default)
overriddenByIdStringSubject ID that set the policy
startTimestampLongStart time of application (epoch ms)
endTimestampLongEnd time (epoch ms)

curl example

curl -X GET   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets/merged/preview/user001"   -H "Content-Type: application/json"

Response Example — 200 OK

{
"code": 0,
"codeMessage": "SUCCESS",
"data": {
"targetId": "user001",
"templates": [
{
"categoryId": 1,
"categoryName": "공통",
"policyList": [
{
"uiOrder": 1,
"uiTypeCode": 2,
"uiTypeDesc": "select",
"policyId": "SD_DOC_OP_MODE",
"policyName": "무해화 사용 설정",
"policyDesc": "문서 무해화 기능의 사용 여부를 설정합니다.\nON: 문서 무해화 기능을 사용합니다.\nOFF: 문서 무해화 기능을 사용하지 않습니다.\n'기록 모드' 설정 시 문서 무해화를 수행하지만, 반입 처리되며, 상세 로그가 기록됩니다.",
"uiOptions": [
{ "value": 0, "label": "사용 안함" },
{ "value": 1, "label": "사용 함" },
{ "value": 2, "label": "기록 모드" }
],
"policyValue": 2,
"overridden": true,
"overriddenBy": "user",
"overriddenById": "user001",
"startTimestamp": 1762300800000,
"endTimestamp": 1862300801000,
"startTimestampText": "2025-11-05 09:00:00",
"endTimestampText": "2029-01-15 09:00:01"
},
{
"uiOrder": 11,
"uiTypeCode": 2,
"uiTypeDesc": "select",
"policyId": "SD_NOSUP_EXT_MODE",
"policyName": "미지원 확장자 차단 설정",
"policyDesc": "서비스에서 지원하지 않는 확장자 및 '무해화 허용 확장자 필터'에 포함되지 않은 확장자에 대한 처리 방식을 설정합니다.\n'기록 모드' 설정 시 미지원 확장자로 탐지되더라도 반입 처리되며, 상세 로그가 기록됩니다.",
"uiOptions": [
{ "value": 0, "label": "차단" },
{ "value": 1, "label": "원본 반입" },
{ "value": 2, "label": "기록 모드" }
],
"policyValue": 2,
"overridden": true,
"overriddenBy": "user",
"overriddenById": "user001"
},
{
"uiOrder": 12,
"uiTypeCode": 2,
"uiTypeDesc": "select",
"policyId": "SD_EXT_MODE",
"policyName": "확장자 위변조 차단 설정",
"policyDesc": "파일 확장자와 실제 파일 형식이 일치하지 않는 경우, 위·변조로 간주하여 처리 방식을 설정합니다.\n'기록 모드' 설정 시 위·변조로 탐지되더라도 반입 처리되며, 상세 로그가 기록됩니다.",
"uiOptions": [
{ "value": 0, "label": "차단" },
{ "value": 1, "label": "원본 반입" },
{ "value": 2, "label": "기록 모드" }
],
"policyValue": 2,
"overridden": true,
"overriddenBy": "user",
"overriddenById": "user001"
}
]
},
{
"categoryId": 2,
"categoryName": "예외",
"policyList": [
{
"uiOrder": 6,
"uiTypeCode": 2,
"uiTypeDesc": "select",
"policyId": "SD_EXCEPTION_BYPASS",
"policyName": "무해화 오류 발생 시 원본 반입 설정",
"policyDesc": "무해화 엔진 오류, 처리 불가, 시스템 예외 등으로 인해 무해화가 정상적으로 완료되지 못한 경우의 처리 방식을 설정합니다.\n'기록 모드' 설정 시 무해화 오류가 발생하더라도 반입 처리되며, 상세 로그가 기록됩니다.",
"uiOptions": [
{ "value": 1, "label": "원본 반입" },
{ "value": 0, "label": "차단" },
{ "value": 2, "label": "기록 모드" }
],
"policyValue": 2,
"overridden": true,
"overriddenBy": "user",
"overriddenById": "user001"
},
{
"uiOrder": 2,
"uiTypeCode": 1,
"uiTypeDesc": "text",
"policyId": "CQMS_NOSUP_EXCEPT_EXT",
"policyName": "미지원 확장자 차단 예외 설정",
"policyDesc": "미지원 확장자는 '공통' 탭의 '미지원 확장자 차단 설정' 값에 의해 처리되지만,\n이 항목에서 예외로 지정된 확장자는 원본 반입을 허용합니다.\n입력 예시) log;tmp;",
"placeholder": "미지원 확장자 차단에서 예외될 확장자를 설정합니다.",
"policyValue": "log;tmp;dat;",
"overridden": true,
"overriddenBy": "user",
"overriddenById": "user001"
},
{
"uiOrder": 3,
"uiTypeCode": 1,
"uiTypeDesc": "text",
"policyId": "SD_EXCEPT_EXT",
"policyName": "확장자 위변조 차단 예외 설정",
"policyDesc": "확장자 위변조 파일은 '공통' 탭의 '확장자 위변조 차단 설정' 값에 의해 처리됩니다.\n이 항목에서 예외로 지정된 파일 확장자는 원본 반입을 허용합니다.\n입력 예시) docx;png;pptx;",
"placeholder": "확장자 차단이 된 경우 예외 처리하여 반입할 수 있습니다.",
"policyValue": "docx;xlsx;png;",
"overridden": true,
"overriddenBy": "user",
"overriddenById": "user001"
}
]
}
]
}
}

3. Policy Registration/Modification (Partial Update)

POST /policy/targets

Policy for specific userspartiallyRegister or modify.

Full URL Example

POST http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets
Key Operation — Partial Update
  • requestIncluded Policies Onlywill be added or updated.
  • Registered previously**Maintain other policies as they are without touching them.**It is possible.
  • already existspolicyIdIf you send it, the value/period of the corresponding policy will beOverwrite with new valueIt works.

Action Example

Current state: Policies A, B, C are registered

POST request: Pass C (new value), D to policyList

Result: Maintain A, B + Update C + Add new D

Request Body

fieldtypeRequiredDescription
targetIdStringOPolicy Target User ID
manager_idStringXPolicy Change Requester ID (for history identification, optional)
updateReasonStringXChange Reason (For History Management)
policyListArrayOList of Policies to Update
policyList[].policyIdStringOPolicy Identifier (e.g:SD_DOC_OP_MODE)
policyList[].policyValueStringorIntegerOPolicy value to set
policyList[].startTimestampLong (int64)XStart time of application (epoch ms). If omitted, applied immediately.
policyList[].endTimestampLong (int64)XEnd of application time (epoch ms). If omitted, it is indefinite.

Content-Type Required Condition

POST /policy/targetsmust be requested under the header below.

Content-Type: application/json

text/plainError response when called with:

{
"code": 4000,
"codeMessage": "INVALID_REQUEST"
}

curl example

Switching to Decontamination Mode OFF (Set Duration):

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "무해화 모드 OFF 전환 (기간 설정)",
"policyList": [
{
"policyId": "SD_DOC_OP_MODE",
"policyValue": 0,
"startTimestamp": 1761523200000,
"endTimestamp": 1762128000000
}
]
}'

Switching to Decontamination Function Record Mode:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "무해화 기능 기록 모드 전환 (모니터링)",
"policyList": [
{
"policyId": "SD_DOC_OP_MODE",
"policyValue": 2
}
]
}'

Unsupported extension record mode switch:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "미지원 확장자 기록 모드 전환 (모니터링)",
"policyList": [
{
"policyId": "SD_NOSUP_EXT_MODE",
"policyValue": 2
}
]
}'

Extension Tampering Record Mode Switch:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "확장자 위변조 기록 모드 전환 (모니터링)",
"policyList": [
{
"policyId": "SD_EXT_MODE",
"policyValue": 2
}
]
}'

Switching to Decontamination Error Log Mode:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "무해화 오류 기록 모드 전환 (모니터링)",
"policyList": [
{
"policyId": "SD_EXCEPTION_BYPASS",
"policyValue": 2
}
]
}'

Update for Blocking Exceptions for Unsupported File Extensions:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "미지원 확장자 예외 목록 갱신",
"policyList": [
{
"policyId": "CQMS_NOSUP_EXCEPT_EXT",
"policyValue": "log;tmp;"
}
]
}'

Extension Spoofing Block Exception Setting Update:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "확장자 위변조 예외 목록 갱신",
"policyList": [
{
"policyId": "SD_EXCEPT_EXT",
"policyValue": "docx;png;pptx;"
}
]
}'

Simultaneous application of multiple recording modes:

curl -X POST   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"manager_id": "portal-admin-01",
"updateReason": "전체 기록 모드 전환 (모니터링)",
"policyList": [
{ "policyId": "SD_DOC_OP_MODE", "policyValue": 2 },
{ "policyId": "SD_NOSUP_EXT_MODE", "policyValue": 2 },
{ "policyId": "SD_EXT_MODE", "policyValue": 2 },
{ "policyId": "SD_EXCEPTION_BYPASS", "policyValue": 2 },
{ "policyId": "CQMS_NOSUP_EXCEPT_EXT","policyValue": "log;tmp;" },
{ "policyId": "SD_EXCEPT_EXT", "policyValue": "docx;png;pptx;" }
]
}'

Response — 200 OK

{
"code": 0,
"codeMessage": "SUCCESS"
}

Error Responses

situationcodecodeMessage
targetIddoes not exist4404VALUE_NOT_FOUND
policyIddoes not exist4404VALUE_NOT_FOUND
endTimestampastartTimestampbelow4000INVALID_REQUEST
Content-TypeThis is not JSON (text/plainetc.)4000INVALID_REQUEST

4. Policy Deletion

DELETE /policy/targets

Individual policies applied to specific usersDeselect optionallydoes.
The released policy is automatically applied according to the policy priority chain as **higher policies (affiliated group policies or enterprise defaults)**.

Full URL Example

DELETE http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets

Request Body

fieldtypeRequiredDescription
targetIdStringOPolicy Target User ID
policyListArrayOList of Policies to be Released
policyList[].policyIdStringOPolicy Identifier

Content-Type Required Condition

DELETE /policy/targetsPlease be sure to use the header below as there is a request body.

Content-Type: application/json

curl example

curl -X DELETE   "http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets"   -H "Content-Type: application/json"   -d '{
"targetId": "user001",
"policyList": [
{ "policyId": "SD_DOC_OP_MODE" },
{ "policyId": "SD_DOC_LIMIT_SIZE" }
]
}'

Response — 200 OK

{
"code": 0,
"codeMessage": "SUCCESS"
}

5. Integration Flow Summary

You can integrate in the following order.

stepMethodURIDescription
1GET/policy/targets/merged/preview/{userId}Check the list of all currently applied policies
2POST/policy/targetsRequest only the policies to be changed (the rest will be automatically maintained)
3DELETE/policy/targetsRequest only the policy to be lifted (restore to the parent policy)
4GET/policy/targets/merged/preview/{userId}Reconfirm Status After Change
Reference when linking
  • Step 1of the response retrieved frompolicyIdUse the values as they are to modify/delete in steps 2-3.
  • Step 2 POSTSince this is a partial update, you only need to send the policies that need to be changed. There is no need to send the entire thing.
  • All changes are automatically logged, allowing you to restore to a previous state if needed.
  • When making POST/DELETE calls, it is essential toContent-Type: application/jsonSpecify.