contexa-common contexa-core autonomous

보안 판단 프롬프트 파이프라인

Contexa의 프롬프트는 단순 문자열 조립이 아니라, 고객 시스템의 인증/인가/위임 증거를 수집하고, CanonicalSecurityContext로 표준화한 뒤, 신뢰도와 누락 지식을 함께 포함하여 LLM이 보안 판단을 내릴 수 있도록 구성됩니다. 요청 하나가 프롬프트가 되기까지는 수집 → 가공 → 정제 → 표준화 → 조립 → 보정 여섯 단계를 거칩니다. 이 문서는 그 흐름을 처음부터 끝까지 한 줄로 이어 보여 드립니다.

여섯 단계 파이프라인

프롬프트는 즉석에서 만들어지지 않습니다. 여섯 단계를 거치며 요청 주변의 모든 사실을 수집·정리·검증한 뒤에야 LLM 에 전달됩니다. 각 단계는 독립된 패키지로 구현되어 있고, 이전 단계의 출력이 다음 단계의 입력이 됩니다.

1
수집
common/security
증거 도장 세 가지 추출
2
가공
autonomous/context
세션·업무·역할 프로필 확장
3
정제
context/hardener
주입 방어 · 형식 강제
4
표준화
CanonicalSecurityContext
22 필드 + 7 프로필 단일 레코드
5
조립
tiered/prompt
18 섹션 계획 조립
6
보정
guardrail · calibration
자율성 제약과 학습 보정
설계 원칙. 각 단계는 실패해도 뒤 단계를 막지 않습니다(Graceful Degradation). 증거가 부족하면 해당 섹션을 프롬프트에 포함하지 않고, 대신 LLM 에게 그 영역에 대한 강한 결론을 내리지 말라는 경고 문구를 자동 삽입합니다.

Stage 1 · 수집

요청이 Spring Security 필터 체인(Filter Chain)에 들어오면 AuthBridge 구현체가 헤더·세션·속성 등 다양한 출처에서 주체를 추출합니다. 추출된 정보는 세 종류의 증거 도장(Stamp) 으로 포장됩니다. 이 세 도장이 이후 모든 단계의 원천 입력입니다.

AU
인증 도장
AuthenticationStamp
  • principalType · 주체 유형
  • authenticationType
  • authenticationAssurance
  • mfaCompleted
  • authenticationSource
  • sessionId · authenticationTime
AZ
인가 도장
AuthorizationStamp
  • effect (ALLOW · DENY · UNKNOWN)
  • privileged · 특권 동작
  • policyId · policyVersion
  • decisionSource
  • effectiveRoles · effectiveAuthorities
DG
위임 도장
DelegationStamp
  • subjectId · 위임자 (사람)
  • agentId · 대리 주체
  • objectiveId · objectiveFamily
  • allowedOperations
  • allowedResources
  • containmentOnly · expiresAt

증거 품질 여섯 등급

모든 증거가 같은 신뢰도를 가지지는 않습니다. 고객이 명시적으로 보낸 신호가 가장 강하고, 플랫폼이 구조적으로 관찰한 신호가 그 다음, 런타임 연속성으로 추정한 신호는 약합니다. BridgeSemanticBoundaryPolicy 는 모든 수집 시점에 다음 여섯 등급 중 하나를 붙입니다.

1
EXPLICIT_CUSTOMER_SIGNAL
고객이 헤더·파라미터에 명시적으로 보낸 신호
최상
2
STRUCTURAL_DISCOVERY_ONLY
플랫폼이 구조적 패턴을 관찰해서 자동 감지한 신호
높음
3
DERIVED_RUNTIME_FALLBACK
런타임 연속성으로 대체 추정한 신호
보통
4
HEURISTIC_HINT_ONLY
힌트 수준. 의미론적 결론은 금지
낮음
5
BRIDGE_COMPLETENESS_ONLY
브릿지 커버리지 분석 및 전체 보고 완성도 수준 식별을 위한 특수 품질 신호
완성도 전용
6
UNAVAILABLE
해당 영역에 대한 증거 없음
없음

Stage 2 · 가공

수집된 증거만으로는 LLM 이 이 사람이 평소와 다르게 행동하는지 판단할 수 없습니다. 2 단계는 세 종류의 구성요소가 원시 증거를 관찰 가능한 패턴으로 확장합니다.

수집기 (Collector)
  • SessionNarrativeCollector — 세션 내 행동 시퀀스
  • ProtectableWorkProfileCollector — @Protectable 어노테이션 리소스의 평소 업무 프로필
  • RoleScopeCollector — 역할 범위 스냅샷
보강기 (Enricher)
  • AuthenticationContextProvider — 인증 강도
  • DelegationContextProvider — 위임 범위 확장
  • PeerCohortContextProvider — 동료 그룹 이상치
  • FrictionContextProvider — 마찰·승인 이력
  • OrganizationContextProvider — 조직 계층
  • ReasoningMemoryContextProvider — 과거 강화 사례
추론기 (Inference)
  • ObjectiveDriftEvaluator — Agent 목표 이탈
  • ObservedScopeInferenceService — 관찰 범위
  • ContextCoverageEvaluator — 완성도 평가
Agent 전용 추론. 사람과 달리 Agent 는 허용된 목표 안에서만 움직여야 합니다. ObjectiveDriftEvaluator 는 현재 요청의 리소스·액션이 DelegationStampallowedOperations·allowedResources 범위를 벗어나는지 실시간으로 판정합니다.

Stage 3 · 정제

프롬프트 주입(Prompt Injection) · 필드 스푸핑 · 신호 위조는 LLM 기반 보안 시스템이 가장 경계해야 할 위협입니다. CanonicalSecurityContextHardener 는 모든 필드를 LLM 에 넘기기 전에 필드별 정규화 절차를 거칩니다.

입력 검증
  1. Null 필드 기본값 치환
  2. 문자열 트림 · 길이 제한
  3. 열거형 값 정규화
  4. 시간 · 좌표 범위 검증
  5. 언어 · 국가 코드 ISO 정규화
  6. 페이로드 디코딩 후 출력 가능 문자 80% 이상 필터
프로필 강화
  1. 세션 이야기 버스트 플래그 유지
  2. 업무 프로필 음수 값 제거
  3. 역할 범위 중복 제거 · 순서 보존
  4. 마찰 프로필 승인 이력 순서 고정
  5. 추론 메모리 가드레일 정제
  6. 신뢰 프로필 결정 상태 정규화

Stage 4 · 표준화

3 단계를 거친 모든 정보는 CanonicalSecurityContext 라는 단일 표준 컨텍스트 모델로 집약됩니다. 현재 구현은 Lombok 기반의 클래스이며, hardener가 필드 정규화와 기본값 보정을 수행한 뒤 프롬프트 조립 단계에 전달합니다. 22 개 필드와 7 개 프로필이 정해진 자리에 담기므로, 이후 프롬프트 조립 단계는 어떤 필드가 어디 있는지 예측 가능합니다.

주체

  • userId
  • organizationId
  • tenantId
  • principalType
  • roleSet
  • authoritySet

세션

  • sessionId
  • clientIp
  • userAgent
  • authenticationType
  • mfaVerified
  • concurrentSessions

위임

  • delegated
  • agentId
  • objectiveId
  • allowedOperations
  • allowedResources
  • objectiveDrift

인가

  • effectiveRoles
  • effectivePermissions
  • scopeTags
  • authorizationEffect
  • policyId
  • policyVersion

의도

  • botUserAgent
  • impossibleTravel
  • missingReferer

위치 · IP

  • country · city
  • IP band · ASN

리소스

  • resourceType
  • businessLabel
  • sensitivity
  • actionFamily

프로필 7 종

  • SessionNarrative
  • Work
  • RoleScope
  • PeerCohort
  • Friction
  • ReasoningMemory
  • ObservedScope

CanonicalSecurityContext Java 클래스 구조

플랫폼 내부적으로 22개 기본 보안 필드와 7가지 행동 프로필을 단일 레코드로 담아 정규화하는 CanonicalSecurityContext의 실제 구조는 다음과 같습니다:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CanonicalSecurityContext {
    private Actor actor;                             // 주체 신원 (userId, tenantId, roleSet 등)
    private Session session;                         // 세션/인증 상태 (sessionId, clientIp, mfaVerified 등)
    private Device device;                           // 기기 핑거프린트 (os, browser 등)
    private Intent intent;                           // 행위 의도 분석 (botUserAgent, impossibleTravel 등)
    private Location location;                       // 지리/네트워크 위치 (country, city, ipBand, asn 등)
    private Resource resource;                       // 대상 리소스 정보 (resourceId, sensitivity, actionFamily 등)
    private Authorization authorization;             // 기존 인가 결과 (effectiveRoles, policyId 등)
    private Delegation delegation;                   // 대리 위임 증거 (delegated, agentId, allowedOperations 등)
    private ExecutionSubject executionSubject;
    private ExecutionEnvelope executionEnvelope;
    private Bridge bridge;                           // 브릿지 탐지/커버리지 정보
    private ObservedScope observedScope;             // 자율적으로 관찰된 범위 스냅샷
    
    // 7종 자율 행동/보안 프로필
    private SessionNarrativeProfile sessionNarrativeProfile;  // 세션 내 행동 시퀀스
    private WorkProfile workProfile;                          // 평소 개인 업무 프로필
    private RoleScopeProfile roleScopeProfile;                // 역할 범위 프로필
    private PeerCohortProfile peerCohortProfile;              // 동료 그룹(Cohort) 프로필
    private FrictionProfile frictionProfile;                  // 마찰 및 승인 이력 프로필
    private ReasoningMemoryProfile reasoningMemoryProfile;    // RAG/과거 사례 분석 메모리 프로필
    
    private ContextCoverageReport coverage;          // 정보 완성도 분석 보고서
    @Builder.Default
    private Map<String, Object> attributes = new LinkedHashMap<>();
    @Builder.Default
    private List<ContextTrustProfile> contextTrustProfiles = new ArrayList<>();
    @Builder.Default
    private Instant collectedAt = Instant.now();

    // 내부 정적 도메인 모델 클래스 예시
    @Data public static class Actor {
        private String userId;
        private String organizationId;
        private String tenantId;
        private String principalType;
        private List<String> roleSet;
        private List<String> authoritySet;
    }

    @Data public static class Session {
        private String sessionId;
        private String clientIp;
        private String userAgent;
        private String authenticationType;
        private Boolean mfaVerified;
        private Integer concurrentSessions;
    }

    @Data public static class Delegation {
        private Boolean delegated;
        private String agentId;
        private String objectiveId;
        private List<String> allowedOperations;
        private List<String> allowedResources;
        private Boolean objectiveDrift;              // 대리 위임 목표 이탈 여부
    }
}

정보 완성도 네 단계

채워진 필드 수와 프로필 유무를 종합해 ContextCoverageEvaluator 가 완성도 등급을 매깁니다. 등급이 낮으면 LLM 에게 업무 패턴 기반 결론을 내리지 말라는 경고 문구가 자동 삽입됩니다.

BUSINESS_AWARE
신원 · 세션 · 범위 · 리소스 · 관찰 패턴 모두 확보
SCOPE_AWARE
신원 · 범위만. 관찰 프로필 부재
IDENTITY_AWARE
신원만. 범위 · 프로필 부재
ENVIRONMENT_ONLY
IP · 시간 등 환경만 확보

Stage 5 · 조립

표준화된 컨텍스트는 이제 프롬프트가 됩니다. SecurityDecisionPromptSections 가 오케스트레이션하며, 2 개 시스템 섹션과 16 개 사용자 섹션(총 18 개 섹션 계획)을 렌더링합니다. 필드가 없으면 해당 빌더는 자기 섹션을 아예 출력하지 않습니다.

시스템 영역과 사용자 영역

시스템 메시지

LLM 에게 역할 · 정책 · 출력 형식을 지시합니다. 요청마다 달라지지 않는 부분.

  1. 보안 정책 지시
  2. 형식 · 길이 제약
  3. JSON 스키마 강제
  4. 거버넌스 버전 기록
사용자 메시지

현재 요청의 증거를 섹션별로 나열합니다. 요청마다 달라집니다.

  1. 현재 이벤트
  2. 정규 컨텍스트 · 완성도
  3. 신원 · 권한
  4. 디바이스 · 위치 · 세션
  5. 위임 · 마찰 · 행동 패턴
  6. 위협 지식 · 조직 학습 증거 · 명시적 누락 지식

18 개 섹션 계획

프롬프트 조립 시 각 섹션은 토큰 제약(Token Budget) 하에 아래 우선순위 등급에 따라 관리되며, 한도가 초과될 경우 P2 → P1 순서로 생략(Omit) 또는 요약(Compress)됩니다. 단, P0 등급 섹션은 절대 생략되거나 누락되지 않고 보존됩니다.

P0 (필수) P1 (높은 가치) P2 (참조 정보)
시스템 P0
SYSTEM_INSTRUCTION
정책 · 형식 지시
시스템 P0
DECISION_CONTRACT
JSON 스키마 강제
사용자 P0
CURRENT_REQUEST_AND_EVENT
현재 요청 · 페이로드
사용자 P0
BRIDGE_AND_COVERAGE
브릿지 보정 · 완성도
사용자 P0
IDENTITY_AND_ROLE
신원 · 권한 집합
사용자 P0
RESOURCE_AND_ACTION
리소스 · 액션 의미
사용자 P1
ROLE_SCOPE
역할 범위 · 기대 패밀리
사용자 P1
OBSERVED_AND_PERSONAL_WORK_PATTERN
개인 · 조직 평소 패턴
사용자 P1
RAG_EVIDENCE_CONTEXT
RAG 로 조회된 보안 컨텍스트 문서
사용자 P1
SUPPORTING_LEARNING_CONTEXT
참조 학습 · 보조 근거
사용자 P1
DEVICE_CONTEXT
운영체제 · 브라우저
사용자 P1
LOCATION_CONTEXT
국가 · 도시 · IP 대역
사용자 P1
INTENT_SIGNAL_CONTEXT
요청 의도 · 참조 신호
사용자 P1
SESSION_NARRATIVE
세션 상태 · MFA
사용자 P1
DELEGATED_OBJECTIVE
위임 범위 · 목표 이탈
사용자 P1
FRICTION_AND_APPROVAL
MFA · 승인 이력
사용자 P0
EXPLICIT_MISSING_KNOWLEDGE
누락 지식 · 신뢰 한계
사용자 P2
THREAT_LEARNING_AND_MEMORY
위협 인텔리전스 · 조직 학습
조건부 포함 원칙. 대부분의 컨텍스트 빌더는 CanonicalContextFieldPolicy.has*() 를 먼저 질의하고, 누락 지식 섹션은 coverage report 와 trust profile 을 기준으로 렌더링 여부를 결정합니다. 필드가 없으면 섹션 자체가 출력되지 않으므로, 프롬프트는 항상 정직한 정보만을 담습니다. 거버넌스 식별자 PromptGovernanceDescriptor 가 모델·버전을 같이 기록해 재현성을 보장합니다.

명시적 누락 지식

명시적 누락 지식(내부 섹션 키: EXPLICIT_MISSING_KNOWLEDGE)은 LLM 이 증거 공백을 확신으로 오해하지 않도록 만드는 P0 필수 품질 지표 섹션입니다. SecurityContextQualityUserSectionBuilderPromptContextComposer.composeMissingKnowledgeSection() 을 호출해 만들며, 커버리지 공백이나 신뢰 프로필의 evidence caution 이 있을 때만 출력됩니다. 결핍 신호가 없으면 섹션을 비워 두며, 이는 누락이 아니라 “명시할 지식 공백 없음”을 의미합니다.

  • 커버리지 공백missingCriticalFacts, remediationHints, confidenceWarnings 가 있으면 누락 지식 섹션을 생성합니다.
  • 신뢰 한계ContextEvidenceLimitation, ContextTrustLimitation, ContextTrustWarning, ContextFieldCoverage, ContextFieldLimitation 을 별도 항목으로 노출합니다.
  • 오탐 방지 — authorization effect 가 이미 해소된 경우 오래된 AUTHORIZATION_EFFECT 누락 경고는 출력하지 않습니다.
  • Baseline 보강 — 개인/조직 baseline 이 희박하면 BaselineGapSupport 를 같은 섹션에 붙여 “증거 부족은 위험 또는 정상의 증거가 아니다”라는 제약을 전달합니다.
  • 압축 보존 — compact budget 에서도 BaselineGapSupport, ConfidenceWarning, ContextEvidenceLimitation, ContextTrustLimitation, ContextTrustWarning 을 우선 보존합니다. 그래도 예산을 넘으면 요약/생략 내역을 compression ledger 에 남깁니다.

Stage 6 · 보정

LLM 이 응답을 돌려주면 끝이 아닙니다. 두 개의 안전장치가 순서대로 결과를 재조정합니다. 첫째는 자율성 제약, 둘째는 런타임 보정 입니다.

자율성 제약 (Autonomy Guardrail)

LLM 의 confidence 가 임계값 미만이거나 출력이 스키마를 벗어나면, PromptConfidenceGuardrail 이 최종 실행 액션을 더 안전한 상위 단계로 강제합니다. 제안 액션과 실행 액션이 분리 기록되어 감사 추적이 가능합니다.

ALLOW LLM 제안
CHALLENGE 제약 개입
ESCALATE 최종 집행
신뢰도가 낮을수록 더 안전한 상위 액션으로 한 단계씩 상승합니다.

런타임 보정 (Calibration)

제약이 적용되지 않은 결정은 SecurityDecisionCalibrationService 가 학습된 프로필로 미세 조정합니다. 과거 관찰 데이터에 근거해 신뢰도 가감과 액션 편향을 적용합니다.

  • 시나리오 분류 — 현재 요청을 과거 유사 시나리오로 분류 (예: 낯선 위치 + 평소와 다른 리소스)
  • 프로필 선택 — 최대 샘플 수와 운영자 검토가 완료된 프로필만 선택 (가장 강한 근거)
  • 액션 편향 적용 — INCREASE_CHALLENGE · DECREASE_CHALLENGE · NONE 중 하나
  • BLOCK 불변 보장 — BLOCK 액션은 어떤 편향으로도 변경 불가 (안전 원칙)
  • 제약 우선 — 자율성 제약이 걸린 결정은 보정을 무시 (이중 개입 방지)

최종 결정 레코드

모든 단계를 통과한 뒤 만들어지는 SecurityDecision 은 단순히 ALLOW · BLOCK 한 값이 아닙니다. LLM 의 원시 판단, 정책 개입, 학습 보정이 모두 기록된 감사 가능한 레코드입니다.

SecurityDecision 필드

action
LLM 이 1 차로 제안한 결정
autonomousAction
제약 · 보정을 거친 최종 실행 액션
llmAuditRiskScore / Confidence
LLM 원본 점수. 감사 전용, 집행에 영향 없음
autonomyConstraintApplied
자율성 제약 적용 여부와 사유 목록
calibrationApplied
런타임 보정 적용 여부와 프로필 식별자
processingLayer
1 = 빠른 계층 · 2 = 전문 계층 (에스컬레이션)

SecurityDecision 결과 레코드 JSON 예시

보정과 자율성 제약을 모두 거친 후 최종 생성되는 SecurityDecision의 예시 데이터입니다. 자율성 제약이 걸려(autonomyConstraintApplied: true) 1차 LLM 제안인 ALLOWCHALLENGE로 승격된 모습을 보여줍니다.

{
  "eventId": "evt_8a9f3b2c1d",
  "action": "ALLOW",
  "autonomousAction": "CHALLENGE",
  "riskScore": 65.0,
  "confidence": 0.45,
  "llmAuditRiskScore": 65.0,
  "llmAuditConfidence": 0.45,
  "analysisTime": 1781572000000,
  "processingTimeMs": 342,
  "processingLayer": 1,
  "llmModel": "cortex-l1-interactive",
  "threatCategory": "ANOMALOUS_ACCESS",
  "reasoning": "User access from a new device (fingerprint mismatch) and unusual time of day, but baseline confidence is too low to completely block.",
  "mitigationActions": [
    "PROMPT_MFA_CHALLENGE"
  ],
  "requiresApproval": false,
  "autonomyConstraintApplied": true,
  "autonomyConstraintReasons": [
    "LOW_CONFIDENCE_ESCALATION"
  ],
  "autonomyConstraintSummary": "LLM confidence (0.45) is below the required threshold (0.60). Automatically escalated from ALLOW to CHALLENGE.",
  "technicalFallbackApplied": false,
  "sessionContext": {
    "sessionId": "sess_9283f12a",
    "clientIp": "192.0.2.1"
  }
}

사람과 Agent 의 프롬프트 차이

같은 파이프라인을 통과해도 주체 유형에 따라 프롬프트의 무게 중심이 달라집니다. 사람은 평소 행동 기준과의 편차가 핵심이고, Agent 는 허용된 목표 범위의 이탈이 핵심입니다.

H 사람 (Human)
주체 유형HUMAN
위임 도장일반적으로 부재
핵심 프로필Work · PeerCohort · Friction
핵심 섹션IdentityAuthority · BehaviorProfile
판정 축평소 행동 기준과의 편차
MFA 신호로그인 시점 검증
A Agent
주체 유형AGENT · SERVICE_ACCOUNT
위임 도장필수. delegated = true + agentId
핵심 프로필ObservedScope · RoleScope
핵심 섹션Delegation · ObjectiveDrift
판정 축허용된 목표 범위 이탈 여부
MFA 신호위임 토큰 발급 시점 검증

LLM 공식검사

프롬프트 품질 보증 엔진은 프롬프트 문장만 검사하지 않습니다. 엔터프라이즈 공식검사는 프롬프트와 봉인된 증거 패키지로 생성된 LLM 판정이 보안 계약을 지키는지도 검증합니다.

CDC
컨텍스트-판정 보정
같은 컨텍스트에서 action, 위험 점수, 신뢰도가 기대 보안 판정과 맞는지 확인합니다.
ERA
증거-사유 정렬
reasoning이 실제 evidenceRefs를 인용하고, 근거 없는 주장이나 증거와 반대되는 주장을 하지 않는지 확인합니다.
SUHR
불확실성 안전 처리율
증거가 부족하거나 오래됐거나 충돌할 때 과신 허용으로 흐르지 않고 안전한 판정을 내리는지 확인합니다.
OCR
출력 계약 안정성
LLM 응답이 필수 JSON 계약, enum, 숫자 범위, reasoning, evidenceRefs를 지키는지 확인합니다.
DSS
판정 안정성 점수
동일한 봉인 증거를 반복 실행해도 action, 위험 방향, 신뢰도, reasoning이 안정적인지 확인합니다.
ARR
공격 저항률
프롬프트 주입, 위조 컨텍스트, 오래된 증거, 충돌 증거 시나리오에서 안전하게 판정하는지 확인합니다.
운영 해석. 이 검사는 모델 자체를 통제하는 기능이 아닙니다. 프롬프트, 컨텍스트, 파서, 판정 채점 규칙, 사후 안전 게이트가 LLM 판정을 감사 가능하게 만들 만큼 강한지를 검증합니다. LLM 공식검사 실패는 성공한 런타임 판정이 아니라 프롬프트/컨텍스트/증거/schema/안전 게이트 개선 대상으로 봅니다.