설치 가이드
Contexa AI Native Zero Trust 플랫폼을 Spring 프로젝트에 적용합니다. CLI 자동 설치 또는 수동 설정 중 선택할 수 있습니다.
빠른 설치 (권장)
Contexa CLI를 설치하고 하나의 명령으로 모든 설정을 자동으로 완료합니다.
1단계 — CLI 설치
curl -fsSL https://install.ctxa.ai | sh
권한 오류(Permission Denied) 발생 시 — 시스템 공용 디렉토리(예: /usr/local/bin)에 쓰기 작업을 수행하면서 권한 오류가 발생할 경우, sudo sh를 사용하여 권한을 상승시켜 실행하십시오:
curl -fsSL https://install.ctxa.ai | sudo sh
irm https://install.ctxa.ai/install.ps1 | iex
Windows 사용자 안내 — PowerShell 5.1 이상에서 동작합니다. 스크립트가 자동으로 SHA-256 체크섬을 검증하고 %LOCALAPPDATA%\Programs\Contexa에 contexa.exe를 설치한 뒤 PATH 안내를 출력합니다. Git Bash 또는 WSL을 사용하시는 경우 위의 Linux/macOS 명령을 그대로 사용하셔도 됩니다.
또는 contexa-security/contexa-cli 릴리스 페이지에서 contexa-win-x64.exe를 직접 다운로드하여 PATH에 배치하셔도 됩니다.
2단계 — 프로젝트 초기화
초기화 전에 현재 로컬 개발 환경의 Contexa 구동 적합성을 사전 테스트해 보려면 다음 명령어를 실행하십시오:
contexa init --check
환경 검사 완료 후 아래 명령을 통해 프로젝트의 대화형 자동 설정을 진행합니다:
cd your-spring-project
contexa init
설치 시작 시 Pre-installation 환경 진단이 자동 수행됩니다. 만약 도커 미기동이나 Java 버전 충돌이 감지되면 복구 가이드와 함께 설치 진행이 경고되거나 제한됩니다. 문제가 지속될 시 contexa doctor 진단을 구동하십시오.
CLI가 대화형으로 설정을 안내합니다:
- 프로젝트 유형 — 신규 프로젝트 (FULL) 또는 레거시 시스템 (SANDBOX)
- AI 보안 모드 — 관찰만 또는 즉시 차단
- AI / LLM 모델 — Ollama (로컬), OpenAI, Anthropic
- 인프라 — Standard (PostgreSQL + Ollama, 단일 서버 인메모리)가 기본. PoC/엔터프라이즈 시연용 분산 모드(Redis + Kafka 포함)는
contexa init --distributed로 활성화
CLI가 자동으로 수행하는 작업:
- 빌드 파일에
spring-boot-starter-contexa의존성 추가 application.yml에 올바른 설정 구성- 인프라용
docker-compose.yml생성 - Docker 컨테이너 시작 및 AI 모델 다운로드
3단계 — 어노테이션 추가
@EnableAISecurity
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
// AI Zero Trust로 보호할 엔드포인트에 추가
@Protectable
@GetMapping("/api/customers")
public List<Customer> getCustomers() { ... }
기본 모드 — 속성 없이 선언한 @EnableAISecurity는 SANDBOX 모드이며 HOST_OWNED로 동작합니다. 이 경우 Contexa는 인증용 SecurityFilterChain을 만들지 않으므로 애플리케이션의 Spring Security 설정이 인증과 인가를 담당하고, @Protectable 메서드는 호출 시점에 Spring Authentication이 있어야 합니다. Contexa가 로그인과 인증 체인을 구성하게 하려면 @EnableAISecurity(mode = SecurityMode.FULL)을 사용하세요. 자체 인증 시스템이 있다면 아래 레거시 시스템 연동을 참고하세요.
4단계 — 애플리케이션 시작
./gradlew bootRun
설정 완료. AI 기반 Zero Trust 보안이 활성화되었습니다. @Protectable 엔드포인트에 대한 모든 요청이 AI에 의해 실시간 분석됩니다.
레거시 시스템 연동 (SANDBOX 모드)
프로젝트에 이미 자체 인증 시스템이 있다면 SANDBOX 모드를 사용하세요. 기존 로그인을 수정하지 않고 AI 보안을 추가합니다. SANDBOX 모드는 기본적으로 HOST_OWNED로 동작하므로, 인증과 인가는 애플리케이션의 Spring Security 설정이 계속 담당합니다.
@EnableAISecurity(
mode = SecurityMode.SANDBOX,
authObjectLocation = AuthObjectLocation.SESSION,
authObjectAttribute = "loginUser" // 레거시 세션 속성명
)
@SpringBootApplication
public class LegacyApplication { }
기존 보안 동작 유지 — 애플리케이션이 자신의 Spring Security 설정(SecurityFilterChain)을 선언해 두면, HOST_OWNED(SANDBOX 모드의 기본값)에서 Contexa는 로그인 페이지, 세션 관리, 접근 규칙을 바꾸지 않습니다. Contexa의 브리지 필터는 호스트 Authentication이 있는 모든 요청을 관찰하고, @Protectable 분석은 어노테이션이 붙은 메서드에서 수행됩니다.
Spring Security를 사용하지 않던 애플리케이션 — SANDBOX 모드(HOST_OWNED)에서 Contexa는 인증용 SecurityFilterChain을 만들지 않습니다. 애플리케이션에 SecurityFilterChain 빈이 없으면 Spring Boot 기본 보안이 적용되어 모든 요청에 인증이 필요해지고 기본 폼 로그인과 HTTP Basic 로그인이 생성됩니다. Contexa는 이 상황을 기동 시 error 로그로 알립니다. 기존 동작을 유지하려면 아래처럼 자신의 SecurityFilterChain을 선언하고, 페이지 보호는 기존 레거시 필터에 그대로 맡기세요.
@Configuration
public class HostSecurityConfig {
@Bean
public SecurityFilterChain hostSecurityFilterChain(HttpSecurity http) throws Exception {
// 페이지 보호는 기존 레거시 필터가 계속 담당합니다
http.authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
return http.build();
}
}
이 체인에도 Spring Security의 기본 설정(CSRF 보호, 보안 응답 헤더 등)은 적용되므로, 기존 동작과 다른 부분은 애플리케이션 요구에 맞게 조정하세요.
@Protectable을 사용하려면 — @Protectable 메서드는 호출 시점에 Spring Authentication이 필요합니다. 없거나 익명이면 호출이 거부되며, 응답은 호스트의 Spring Security 예외 처리가 결정합니다. 세션에만 저장된 레거시 사용자 객체(위 예의 loginUser)는 그것만으로 인증 증거가 되지 않으며, 세션·요청 속성·헤더는 인가·위임 증거로 읽힙니다. 레거시 방식으로 인증한 사용자를 호스트가 직접 Spring SecurityContext에 넣거나(예: 위 체인에 추가한 필터), Contexa가 인증을 소유하도록 CONTEXA_OWNED(예: mode = SecurityMode.FULL)를 사용하세요.
Contexa CLI 명령어 레퍼런스
Contexa CLI가 제공하는 주요 명령어를 상세 설명합니다. 터미널에서 contexa <command> [options] 형식으로 실행할 수 있습니다.
| 명령어 | 설명 | 주요 옵션 |
|---|---|---|
init |
현재 프로젝트에 Contexa 보안 스타터와 데이터베이스 설정을 자동으로 추가하고 인프라(Docker)를 시작합니다. |
--yes: 프롬프트 없이 기본값으로 즉시 자동 설치--force: 기존 설정을 덮어쓰고 강제 재설치--distributed: Redis, Kafka 등 분산 데모 인프라 설치--simulate: 포트 충돌이 없는 테스트용 격리 시뮬레이션 환경 구축
|
reset |
Contexa 설정 및 프로젝트 의존성, 실행 중인 Docker 컨테이너 스택을 최초 이전 상태로 완전히 롤백합니다. |
--dir <path>: 프로젝트 디렉터리 지정 (기본값: 현재 디렉터리)-s, --simulate: 시뮬레이션 환경 전체(프로젝트 내 시뮬레이션 설정 및 ctxa-sim 컨테이너/볼륨) 초기화-i, --infra: 프로젝트 전용 Docker 인프라만 초기화 (코드 제외)-c, --code: 프로젝트 소스 코드 및 설정(의존성, 어노테이션)만 초기화 (인프라 제외)-a, --all: 전체 구성요소(소스 코드 설정, 프로젝트 인프라, 시뮬레이션 스택) 강제 초기화
|
simulate |
시뮬레이션 컨테이너 스택(ctxa-sim-*)의 생명주기를 관리합니다 (하위 명령어: up, down, reset, logs, ps). |
up: 시뮬레이션 컨테이너 시작down: 시뮬레이션 컨테이너 중지reset: 시뮬레이션 데이터베이스 볼륨 초기화 (깨끗한 빈 데이터베이스 상태로 재구동)logs: 컨테이너 로그 확인ps: 컨테이너 실행 상태 점검
|
mode |
제로 트러스트 차단 정책 모드(SHADOW 또는 ENFORCE)를 동적으로 전환합니다. |
--enforce, -e: 위협 감지 시 실시간 즉시 차단 활성화--shadow, -s: 위협 감지 시 차단 없이 모니터링 로그만 기록
|
doctor |
현재 시스템의 Java 버전, Docker 데몬 기동 여부, 네트워크 연결 상태 등을 검사하고 문제 해결 가이드를 제공합니다. | N/A |
status |
가동 중인 Contexa 컨테이너 상태, DB 연결 상태, Ollama AI 모델 목록 등을 빠르게 점검합니다. | N/A |
scan |
프로젝트 코드 내 @EnableAISecurity 및 @Protectable 선언 적합성과 필수 의존성을 검사합니다. |
N/A |
사전 요구 사항
CLI 및 수동 설치 모두에 필요합니다:
| 요구 사항 | 버전 | 용도 |
|---|---|---|
| Java | 17+ | 런타임 (Gradle 툴체인으로 구성) |
| Spring Boot | 3.x | 애플리케이션 프레임워크 (4.x 버전 미지원) |
| Docker | 최신 버전 | 인프라 서비스 (PostgreSQL, Ollama) |
분산 배포 (PoC / 엔터프라이즈 시연) — contexa init --distributed 를 실행하면 PostgreSQL + Ollama 에 더해 Redis, Kafka, Zookeeper 컨테이너를 자동 생성하고 contexa.infrastructure.mode: DISTRIBUTED, spring-kafka, redisson 의존성까지 자동 추가합니다. 운영 배포는 Kubernetes + Helm 을 권장합니다.
수동 설치
CLI를 사용하지 않으려면 다음 단계를 수동으로 진행합니다.
1. 의존성 추가
dependencies {
implementation 'ai.ctxa:spring-boot-starter-contexa:0.1.0'
}
<dependency>
<groupId>ai.ctxa</groupId>
<artifactId>spring-boot-starter-contexa</artifactId>
<version>0.1.0</version>
</dependency>
2. 인프라 시작
# Standard 모드 (PostgreSQL + Ollama)
docker compose up -d
# AI 모델 다운로드
docker exec contexa-ollama ollama pull qwen2.5:14b
docker exec contexa-ollama ollama pull mxbai-embed-large
# PoC/시연용 분산 모드 (PostgreSQL + Ollama + Redis + Kafka)
# contexa init --distributed 를 실행하면 docker-compose.yml 에 모두 포함됩니다
docker compose up -d
3. 인프라 서비스
| 서비스 | 이미지 | 포트 | 모드 |
|---|---|---|---|
| PostgreSQL | pgvector/pgvector:pg16 | 5432 | Standard |
| Ollama | ollama/ollama:latest | 11434 | Standard |
| Redis | redis:7.2-alpine | 6379 | Distributed |
| Kafka | cp-kafka:7.4.0 | 9092 | Distributed |
문제 해결
자가 진단 도구 사용 안내 — Contexa 설치 또는 실행 중 문제가 발생하면 먼저 터미널에 contexa doctor를 입력하여 로컬 개발 환경 상태를 진단하십시오. 더 자세한 오류 유형별 원인과 OS별 해결책은 문제 해결 상세 가이드 (Troubleshooting) 바로가기 문서에서 확인하실 수 있습니다.
@EnableAISecurity 시동 오류 가이드
수동 설치로 spring-boot-starter-contexa 만 추가하고 @EnableAISecurity 를 선언하면, 시동 시점에 다음 세 가지 오류가 순서대로 노출될 수 있습니다. contexa-cli 가 자동으로 추가하는 의존성은 spring-boot-starter-contexa 한 개뿐이므로, 나머지는 사용자가 본인 빌드에 직접 추가해야 합니다. 각 오류마다 원인과 해결책을 정확히 표시합니다.
오류 1 — contexa.datasource.url must be configured for @EnableAISecurity
전체 메시지: java.lang.IllegalStateException: contexa.datasource.url must be configured for @EnableAISecurity. Use a dedicated Contexa database by default; sharing the application database requires explicit POC approval.
원인 — Contexa 는 보안 정책·세션·벡터 인덱스를 사용자 운영 DB 와 분리된 전용 PostgreSQL 에 저장합니다. @EnableAISecurity 가 활성화되면 contexa.datasource.url 이 반드시 설정되어 있어야 하며, 미설정 시 ContexaDataSourceIsolation 검증이 즉시 실패합니다.
해결 — 사용자 application.yml 에 contexa 전용 데이터소스 설정을 추가합니다.
contexa:
datasource:
url: jdbc:postgresql://localhost:5432/contexa
username: ${CONTEXA_DB_USERNAME:contexa}
password: ${CONTEXA_DB_PASSWORD:contexa1234!@#}
driver-class-name: org.postgresql.Driver
isolation:
contexa-owned-application: true
운영 DB 와 동일 인스턴스에 별도 스키마로 두려면 운영팀과 사전 승인 후 같은 URL 을 사용하실 수 있습니다. 기본은 별도 DB(권장).
오류 2 — No Spring AI ChatModel is configured for CONTEXA
전체 메시지: No Spring AI ChatModel is configured for CONTEXA. Add at least one Spring AI chat provider starter to your application dependencies (for example org.springframework.ai:spring-ai-starter-model-openai, org.springframework.ai:spring-ai-starter-model-anthropic, or org.springframework.ai:spring-ai-starter-model-ollama), then configure the matching provider under spring.ai.*
원인 — Contexa 의 LLM 티어 자동 설정(CoreLLMTieredAutoConfiguration) 이 ChatModel 빈을 요구하지만, classpath 에 Spring AI provider starter 가 없습니다. spring-boot-starter-contexa 는 ChatModel starter 를 transitive 의존성으로 끌고 오지 않습니다 — 어떤 provider(Ollama/OpenAI/Anthropic) 를 쓰실지는 사용자 결정이라서입니다.
해결 — 본인이 사용하실 provider starter 한 개 이상을 빌드에 추가하시고, 매칭 설정을 contexa.llm.* 아래에 두십시오. (Contexa 는 Spring AI 의 기본 자동 설정을 타지 않고, 전용 네임스페이스 contexa.llm 을 통해 모델 생성을 제어합니다.)
dependencies {
implementation 'ai.ctxa:spring-boot-starter-contexa:0.1.0'
// 아래는 @EnableAISecurity 사용 시 직접 추가 (provider 1개 이상)
implementation 'org.springframework.ai:spring-ai-starter-model-ollama'
}
contexa:
llm:
selection:
chat:
mode: dynamic-priority
priority: ollama,openai,anthropic
chat:
ollama:
baseUrl: ${CONTEXA_CHAT_OLLAMA_BASE_URL:http://127.0.0.1:11434}
model: ${CONTEXA_CHAT_OLLAMA_MODEL:qwen2.5:7b}
keepAlive: ${CONTEXA_OLLAMA_CHAT_KEEP_ALIVE:30m}
embedding:
ollama:
dedicatedRuntimeEnabled: false
model: ${CONTEXA_EMBEDDING_OLLAMA_MODEL:mxbai-embed-large}
dimensions: ${CONTEXA_EMBEDDING_OLLAMA_DIMENSIONS:1024}
OpenAI 또는 Anthropic 사용 시 spring-ai-starter-model-openai / spring-ai-starter-model-anthropic 으로 교체하시고 contexa.llm.openai.* / contexa.llm.anthropic.* 에 API 키를 설정하십시오.
오류 3 — rag-vector capability unresolved / SecurityDecisionPostProcessor 미생성
전체 메시지(요약): [ContexaCapability] rag-vector ... Resolve rag-vector first; SecurityDecisionPostProcessor is created only after UnifiedVectorService is available.
원인 — @EnableAISecurity 의 의사결정 후처리기(SecurityDecisionPostProcessor) 가 UnifiedVectorService 를 의존하고, 그 뿌리에는 Spring AI VectorStore 빈이 있습니다. classpath 에 pgvector 벡터스토어 starter 가 없으면 rag-vector capability 가 미해결되어 후속 빈 트리가 생성되지 않습니다.
해결 — pgvector 벡터스토어 starter 를 추가하시고, contexa.vectorstore.pgvector.* 를 설정합니다. PostgreSQL 컨테이너는 pgvector/pgvector:pg16 이미지를 사용하셔야 vector 확장이 자동 활성화됩니다.
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-pgvector'
}
contexa:
vectorstore:
pgvector:
dimensions: 1024
initialize-schema: true
왜 contexa-cli 가 spring-ai-* 를 자동 추가하지 않는가 — Spring AI provider/벡터스토어 starter 를 모든 사용자에게 자동 주입하면 @EnableAISecurity 를 선언하지 않은 사용자 앱에서도 PgVectorStore / ChatModel 빈이 생성되려 시도하면서 시동이 깨집니다. Contexa 의 contract 는 "한 줄(spring-boot-starter-contexa)만 추가, 나머지는 사용자 결정" 입니다. contexa init 종료 시점에도 next.steps 에 위 의존성 라인을 그대로 출력해 드립니다.
인프라 문제 해결
컨테이너 이름 충돌 — The container name "/contexa-postgres" is already in use
전체 메시지(요약): Error response from daemon: Conflict. The container name "/contexa-postgres" is already in use by container "<hash>". You have to remove (or rename) that container to be able to reuse that name.
이어서 contexa-cli 가 출력: × Docker start failed. Run manually: docker compose up -d
원인 — 같은 이름의 컨테이너(contexa-postgres, contexa-ollama 등) 가 이미 호스트에 존재합니다. Docker 데몬은 같은 이름의 컨테이너 두 개를 동시에 가질 수 없습니다. 보통 다음 두 케이스입니다:
- 이전
contexa init실행이 만든 컨테이너가 그대로 살아있음 → 그대로 사용해도 무방 - 다른 프로젝트가 같은 이름을 점유 중 → 그쪽을 정리하거나 simulate 격리 모드로 전환
해결 방법 1 — 기존 컨테이너 그대로 사용 (권장, 데이터 보존)
# 1) 기존 컨테이너가 떠있는지 확인
docker ps --filter "name=contexa-" --format "table {{.Names}}\t{{.Status}}"
# 2) 떠있다면 그대로 두고 애플리케이션만 시작
./gradlew bootRun
해결 방법 2 — 기존 컨테이너 제거 후 재생성 (데이터 손실 주의)
# 정지 + 제거 (볼륨은 보존)
docker rm -f contexa-postgres contexa-ollama
# 분산 모드도 같이 정리하려면
docker rm -f contexa-redis contexa-zookeeper contexa-kafka
# 다시 시작
contexa init --distributed
해결 방법 3 — 격리된 시뮬레이션 모드로 전환 (운영 컨테이너 보호)
contexa init --simulate
--simulate 옵션은 컨테이너 이름 prefix 를 ctxa-sim- 로 분리하고 포트도 +20000 으로 띄워, 운영 컨테이너와 충돌 없이 사이드 바이 사이드로 사용할 수 있습니다.
| 문제 | 해결 방법 |
|---|---|
| PostgreSQL 연결 거부 | Docker 실행 확인: docker ps. 포트 5432 사용 여부 확인. |
| Ollama 연결 거부 | 컨테이너 로그 확인: docker logs contexa-ollama. 포트 11434 확인. |
| AI 모델 미발견 | 모델 다운로드: docker exec contexa-ollama ollama pull qwen2.5:14b 및 ... pull mxbai-embed-large |
vector 확장 누락 (PostgreSQL) |
이미지를 pgvector/pgvector:pg16 으로 사용하시거나, 기존 DB 라면 CREATE EXTENSION IF NOT EXISTS vector; 를 한 번 실행하십시오. |
| 포트 충돌 | 기본 포트: PostgreSQL 5432, Ollama 11434, Redis 6379, Kafka 9092 |
contexa init — 화살표 키 미작동 |
Windows: Git Bash에서 winpty contexa init 사용, 또는 Windows Terminal에서 실행 |
도움이 필요하신가요? — 설정 레퍼런스를 확인하거나 GitHub Discussions를 방문하세요.