メインコンテンツまでスキップ

SHIELDEXポリシー連携API仕様書

※ 最終更新 : 2026-03-24

ドキュメント情報

項目内容
ドキュメントバージョン6.2026.0324.01
作成ソフトキャンプ
Content-Typeapplication/json

環境設定 (必須)

IP許可事前協議が必要

本APIはIPベースのアクセス制御が適用されます。
APIを使用するには、顧客の会社のアクセス出発地IPアドレスを事前にSOFTCAMPに伝達する必要があります。

顧客側の準備事項

APIを呼び出すサーバー/システムの以下の情報を提供してください。

伝達情報

  • アクセス元IPアドレス (例: __PH_0__)192.168.1.50, 10.10.12.100)
  • 用途 (例: セキュリティポータルサーバー、バッチジョブサーバー)

SOFTCAMPエンジニア設定方法

SHIELDEXサーバーのWebConsoleApi.propertiesファイルに許可されたIPを登録します。

設定ファイルの場所

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

IP許可設定

設定キー説明例示
security.ip.allowed無トークン呼び出し許可IPホワイトリスト(カンマ区切り)10.10.12.43,10.10.12.44
重要

許可リスト(security.ip.allowedにないIPからリクエストするとブロックなり、以下のように応答されます。

{
"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

設定変更後は必ずSHIELDEX WebConsole サービスの再起動これが必要です。


Base URL

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

すべてのAPIパスは、上記のBase URLの後に付けて呼び出します。

例示— サーバー IP が10.10.12.100, ポートが9000の場合:

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

APIリソースマップ

この文書で提供されるAPIの一覧です。

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

/policy/targets
├── GET /policy/targets/merged/preview/{targetId} # 정책 통합 조회
├── POST /policy/targets # 정책 부분 업데이트
└── DELETE /policy/targets # 정책 선택 삭제
MethodURI説明
GET/policy/targets/merged/preview/{targetId}全社+個別ポリシーを統合した全体照会
POST/policy/targets要求されたポリシーのみ追加/修正(既存維持)
DELETE/policy/targets要求されたポリシーのみ解除(上位ポリシーに復元)

1. 共通ルール

1.1 レスポンス構造

すべてのAPIレスポンスは以下の形式に従います。

{
"code": 0,
"codeMessage": "SUCCESS",
"data": { }
}
フィールドタイプ説明
codeInteger処理結果コード
codeMessageString処理結果メッセージ
dataObject応答データ (GET取得時に返され、POST/DELETE時には省略可能)

1.2 レスポンスコードの定義

codecodeMessage説明HTTP Status
0SUCCESS正常処理完了200
1FAIL処理できません200
4000INVALID_REQUEST不正なリクエスト(必須値の欠落、有効性違反、本文形式/Content-Typeエラーなど)400
4404VALUE_NOT_FOUND存在しない対象 (targetId, policyId など)404
5000INTERNAL_ERRORサーバ内部エラー500

1.3 タイムスタンプの規則

単位に注意: epoch milliseconds (13桁)

すべての timestamp フィールドはepoch milliseconds(1/1000秒) 単位です。
Unixエポック秒(10桁)が**いいえ。**桁数を必ず確認してください。

epoch seconds     : 1761523200        (10자리) ← 이 단위가 아닙니다
epoch milliseconds: 1761523200000 (13자리) ← 이 API에서 사용하는 단위
タイムゾーン注意: 必ずKST (Asia/Seoul)基準

日付/時間をepochミリ秒に変換する際は必ず**KST (UTC+9, Asia/Seoul)**基準に基づいて変換する必要があります。

UTCに変換すると9時間の差が生じ、意図した期間とは異なる適用になります。

"2026-03-21 00:00:00" KST 기준 → 1774278000000  ← 올바른 값
"2026-03-21 00:00:00" UTC 기준 → 1774310400000 ← 9시간 밀림 (KST 09:00으로 적용됨)
  • Java: sdf.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"))使用
  • JavaScript: new Date('2026-03-21T00:00:00+09:00')使用
  • TimeZone.getTimeZone("UTC")使用禁止

タイムスタンプ関連フィールド

フィールドタイプ方向説明
startTimestampLong (int64)入力/出力ポリシー適用開始時刻 (epoch ms,KST基準). 省略した場合は即時適用
endTimestampLong (int64)入力/出力ポリシー適用終了時刻 (epoch ms,KST基準). 省略した場合は無期限
startTimestampTextString出力専用KST変換日付 (例: __PH_0__)2025-12-04 09:52:33)
endTimestampTextString出力専用KST 変換日。無期限の場合はnull

変換コードの例

// 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
}
}
ヒント
API バージョンの独立性APIは特定のJavaバージョンに依存しません。

必要な値は **KST基準のエポックミリ秒(13桁の整数値)** です。

  • Java 1.7 (JDK 1.7): SimpleDateFormat, Date, Calendarエポックミリ秒の生成
  • Java 1.8+ (JDK 1.8+): Instantクラスで簡単に変換

この例は参考用であり、Java 1.7 環境でもSystem.currentTimeMillis()または、さまざまな方法で同じ13桁のミリ秒値を生成して使用することができます。

参考: startTimestampText, endTimestampTextは出力専用フィールドのため、入力時には使用できません。

有効性ルール

  • 両方を指定した場合endTimestampstartTimestampより大きくする必要があります (違反した場合400 INVALID_REQUEST)
  • 両方を省略すると即時適用、無期限

1.4 政策の優先順位

ポリシーの値は以下の優先順位で決定されます。上位が存在する場合は下位をオーバーライドします。

사용자 개별 정책 (User)  ← 최우선

소속 그룹 정책 (Group)

전사 기본 정책 (Default) ← 최하위

1.5 オーバーライド情報

照会応答の各ポリシー項目に含まれるフィールドです。該当のポリシーがどこで設定されたかを知ることができます。

フィールドタイプ説明
overriddenBoolean個別のポリシーが適用された場合true, 戦士の基本値の場合はfalse
overriddenByStringポリシーの出所:"user" / "group" / "default"
overriddenByIdStringポリシーを設定したユーザーIDまたはグループID (defaultならばnull)

1.6 リクエストボディ形式(Content-Type) ルール

:::warning[重要POST /policy/targets, DELETE /policy/targetsは**必ずJSON本文+Content-Type: application/json**で呼び出す必要があります。] text/plainJSON以外の形式で呼び出すと、リクエストが拒否されます。

  • 推奨ヘッダー:Content-Type: application/json
  • 非推奨の例:Content-Type: text/plain;charset=UTF-8(リクエスト拒否)

失敗応答例 (本文形式エラー)

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

2. 政策統合照会

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

全社ポリシーとターゲット個別ポリシーをマージしたがって、該当ユーザーに実際に適用される全体のポリシー結果を返します。

全体のURL例

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

Path Parameters

パラメータータイプ必須説明
targetIdStringO照会対象ユーザーID

Responseフィールド

フィールドタイプ説明
data.targetIdString対象 ID
data.templatesArrayカテゴリ別ポリシー一覧
data.templates[].categoryIdIntegerカテゴリ ID
data.templates[].categoryNameStringカテゴリ名 (例: 共通、例外、MS Office ...)
data.templates[].policyListArray該当カテゴリのポリシー項目一覧

ポリシー項目 (policyList) フィールド

フィールドタイプ説明
policyIdStringポリシー固有識別子 (例: __PH_0__)SD_DOC_OP_MODE)
policyNameStringポリシー表示名
policyValueStringまたはInteger現在適用中のポリシー値
policyDescStringポリシーの詳細説明
uiTypeCodeIntegerUIタイプ —1: テキスト入力、2: 選択型
uiOptionsArray選択型オプションリスト (uiTypeCode=2存在するのはその時だけです)
overriddenBoolean個別ポリシーの適用可否
overriddenByStringポリシーの出所 (user / group / default)
overriddenByIdStringポリシーを設定した主体 ID
startTimestampLong適用開始時刻 (epoch ms)
endTimestampLong適用終了時刻 (epoch ms)

curlの例

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. 政策の登録/修正(部分更新)

POST /policy/targets

特定のユーザーにポリシーを部分的に登録または修正します。

全体のURL例

POST http://{serverIp}:{serverPort}/WebConsoleApi/policy/targets
重要な操作 — 部分更新 (Partial Update)
  • リクエストに含まれているポリシーのみ追加または更新されます。
  • 既に登録された他の政策には触れず、そのまま維持なります。
  • 既に存在するpolicyIdを送信すると、そのポリシーの値/期間が新しい値で上書きするなります。

動作例

기존 상태: A, B, C 정책이 등록되어 있음

POST 요청: policyList에 C(새 값), D를 전달

결과: A, B 유지 + C 업데이트 + D 신규 추가

Request Body

フィールドタイプ必須説明
targetIdStringOポリシー対象ユーザーID
manager_idStringXポリシー変更リクエスターID(履歴識別用、省略可能)
updateReasonStringX変更理由 (履歴管理用)
policyListArrayO更新するポリシーのリスト
policyList[].policyIdStringOポリシー識別子 (例: __PH_0__)SD_DOC_OP_MODE)
policyList[].policyValueStringまたはIntegerO設定するポリシー値
policyList[].startTimestampLong (int64)X適用開始時刻 (epoch ms)。省略した場合は即時適用
policyList[].endTimestampLong (int64)X適用終了時刻 (epoch ms)。省略した場合は無期限。

Content-Type 必須条件

POST /policy/targetsは必ず以下のヘッダーでリクエストする必要があります。

Content-Type: application/json

text/plain呼び出し時のエラー応答:

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

curlの例

無害化モード OFF への切り替え (期間設定):

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
}
]
}'

無害化機能記録モード切替:

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
}
]
}'

未対応拡張子記録モード切替:

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
}
]
}'

拡張子偽造記録モード切替:

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
}
]
}'

無害化エラー記録モード切替:

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
}
]
}'

未対応拡張子ブロック例外設定の更新:

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;"
}
]
}'

拡張子偽造防止例外設定の更新:

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;"
}
]
}'

複数の記録モードを同時に適用:

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

状況codecodeMessage
targetId存在しません4404VALUE_NOT_FOUND
policyIdが存在しません4404VALUE_NOT_FOUND
endTimestampstartTimestamp以下4000INVALID_REQUEST
Content-TypeこれはJSONではありません (text/plain等)4000INVALID_REQUEST

4. ポリシーの削除

DELETE /policy/targets

特定のユーザーに適用された個別のポリシーを選択的に解除します。
解除されたポリシーは、ポリシー優先順位チェーンに従って **上位ポリシー(所属グループポリシーまたは全社デフォルト)** が自動的に適用されます。

全体のURL例

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

Request Body

フィールドタイプ必須説明
targetIdStringOポリシー対象ユーザーID
policyListArrayO解除するポリシーの一覧
policyList[].policyIdStringOポリシー識別子

Content-Type 必須条件

DELETE /policy/targetsリクエスト本文があるため、必ず以下のヘッダーを使用してください。

Content-Type: application/json

curlの例

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. 連携フローの概要

以下の順序で連携してください。

ステップMethodURI説明
1GET/policy/targets/merged/preview/{userId}現在適用されている全ポリシーの一覧確認
2POST/policy/targets変更するポリシーのみ要求 (残りは自動的に維持)
3DELETE/policy/targets解除するポリシーのみを要求する(上位ポリシーに復元)
4GET/policy/targets/merged/preview/{userId}変更後の状態再確認
連携時の参考
  • ステップ1で取得した応答のpolicyId値をそのまま使用して2〜3段階で変更/削除します。
  • 2段階 POSTは部分更新ですので、変更が必要なポリシーのみ送信すれば大丈夫です。全体を送る必要はありません。
  • すべての変更は自動的に履歴が記録され、必要に応じて以前の状態に復元できます。
  • POST/DELETE 呼び出し時には必ずContent-Type: application/jsonを指定してください。