정책 연동 API 가이드
※ 최종 업데이트 : 2026-03-24
문서 정보
| 항목 | 내용 |
|---|---|
| 문서 버전 | 6.2026.0324.01 |
| 작성 | 소프트캠프 |
| Content-Type | application/json |
환경 설정 (필수)
IP 허용 사전 협의 필요
본 API는 IP 기반 접근 제어가 적용됩니다.
API를 사용하시려면 고객사의 접근 출발지 IP 주소를 사전에 소프트캠프에 전달해야 합니다.
고객사 측 준비 사항
API를 호출할 서버/시스템의 아래 정보를 전달해 주세요.
전달 정보
- 접근 출발지 IP 주소 (예:
192.168.1.50,10.10.12.100) - 용도 (예: 보안 포탈 서버, 배치 작업 서버)
소프트캠프 엔지니어 설정 방법
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:403error:Forbiddenmessage: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 # 정책 선택 삭제
| Method | URI | 설명 |
|---|---|---|
| GET | /policy/targets/merged/preview/{targetId} | 전사+개별 정책을 병합한 전체 조회 |
| POST | /policy/targets | 요청한 정책만 추가/수정 (기존 유지) |
| DELETE | /policy/targets | 요청한 정책만 해제 (상위 정책으로 복원) |
1. 공통 규칙
1.1 응답 구조
모든 API 응답은 아래 형식을 따릅니다.
{
"code": 0,
"codeMessage": "SUCCESS",
"data": { }
}
| 필드 | 타입 | 설명 |
|---|---|---|
code | Integer | 처리 결과 코드 |
codeMessage | String | 처리 결과 메시지 |
data | Object | 응답 데이터 (GET 조회 시 반환, POST/DELETE 시 생략 가능) |
1.2 응답 코드 정의
| code | codeMessage | 설명 | HTTP Status |
|---|---|---|---|
0 | SUCCESS | 정상 처리 완료 | 200 |
1 | FAIL | 처리하지 못함 | 200 |
4000 | INVALID_REQUEST | 잘못된 요청 (필수값 누락, 유효성 위반, 본문 형식/Content-Type 오류 등) | 400 |
4404 | VALUE_NOT_FOUND | 존재하지 않는 대상 (targetId, policyId 등) | 404 |
5000 | INTERNAL_ERROR | 서버 내부 오류 | 500 |
1.3 Timestamp 규칙
단위 주의: epoch milliseconds (13자리)
모든 timestamp 필드는 epoch milliseconds (1/1000초) 단위입니다.
Unix epoch seconds(10자리)가 아닙니다. 자릿수를 반드시 확인하세요.
epoch seconds : 1761523200 (10자리) ← 이 단위가 아닙니다
epoch milliseconds: 1761523200000 (13자리) ← 이 API에서 사용하는 단위
타임존 주의: 반드시 KST (Asia/Seoul) 기준
날짜/시간을 epoch milliseconds로 변환할 때 반드시 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")사용 금지
Timestamp 관련 필드
| 필드 | 타입 | 방향 | 설명 |
|---|---|---|---|
startTimestamp | Long (int64) | 입력/출력 | 정책 적용 시작 시각 (epoch ms, KST 기준). 생략 시 즉시 적용 |
endTimestamp | Long (int64) | 입력/출력 | 정책 적용 종료 시각 (epoch ms, KST 기준). 생략 시 무기한 |
startTimestampText | String | 출력 전용 | KST 변환 날짜 (예: 2025-12-04 09:52:33) |
endTimestampText | String | 출력 전용 | 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 기준 epoch milliseconds (13자리 정수값)**입니다.
- Java 1.7 (JDK 1.7):
SimpleDateFormat,Date,Calendar등으로 epoch milliseconds 생성 - Java 1.8+ (JDK 1.8+):
Instant클래스로 간편하게 변환
위 예시는 참고용이며, Java 1.7 환경에서도 System.currentTimeMillis() 또는 다양한 방법으로 동일한 13자리 millisecond 값을 생성하여 사용할 수 있습니다.
참고: startTimestampText, endTimestampText는 출력 전용 필드이므로 입력 시 사용할 수 없습니다.
유효성 규칙
- 둘 다 지정 시
endTimestamp가startTimestamp보다 커야 합니다 (위반 시400 INVALID_REQUEST) - 둘 다 생략하면 즉시 적용, 무기한
1.4 정책 우선순위
정책 값은 아래 우선순위로 결정됩니다. 상위가 존재하면 하위를 override합니다.
사용자 개별 정책 (User) ← 최우선
↓
소속 그룹 정책 (Group)
↓
전사 기본 정책 (Default) ← 최하위
1.5 오버라이드 정보
조회 응답의 각 정책 항목에 포함되는 필드입니다. 해당 정책이 어디서 설정되었는지 알 수 있습니다.
| 필드 | 타입 | 설명 |
|---|---|---|
overridden | Boolean | 개별 정책이 적용된 경우 true, 전사 기본값이면 false |
overriddenBy | String | 정책 출처: "user" / "group" / "default" |
overriddenById | String | 정책을 설정한 사용자 ID 또는 그룹 ID (default이면 null) |
1.6 요청 본문 형식(Content-Type) 규칙
중요
POST /policy/targets, DELETE /policy/targets는 **반드시 JSON 본문 + Content-Type: application/json**으로 호출해야 합니다.
text/plain 등 JSON이 아닌 형식으로 호출하면 요청이 거부됩니다.
- 권장 헤더:
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