Ch2. config.toml 설계
프로젝트·사용자·시스템 설정 레이어 우선순위, 프로필 분리(0.134.0 마이그레이션), permission profile과 deny-read, requirements.toml 강제까지 config.toml 운영 전략
핵심 요약
- 설정은 프로젝트(trusted)
.codex/config.toml→ 사용자~/.codex→ 시스템/etc/codex→ built-in → CLI 오버라이드 순으로 병합되며, 가장 가까운 파일이 승리합니다. - 0.134.0 이후 프로필은
[profiles.x]테이블이 아니라~/.codex/x.config.toml별도 파일에 top-level key로 작성해 레이어로 얹습니다. --config는 JSON이 아니라 TOML로 파싱되고,--ignore-user-config·--ignore-rules로 CI·비교 실험에서 개인 설정을 배제할 수 있습니다.default_permissions와[permissions.<name>]로 파일시스템과 네트워크 정책을 분리 선언하고,"deny"glob으로.env·secrets/를 "보이되 못 읽게" 막습니다(0.122.0).requirements.toml은 approval/sandbox 범위뿐 아니라 web search 모드와 네트워크 제약까지 강제하고, 레이어별 effective 값은/debug-config로 진단합니다.
Codex의 동작은 config.toml로 제어합니다.
조직에서는 기본값을 표준화하고 프로젝트별로 필요한 부분만 덮어쓰는 방식이 잘 맞습니다.
설계 원칙
- 기본값은 보수적으로: 승인/샌드박스 옵션은 엄격하게
- 프로젝트 오버라이드 최소화: 팀 공용 기본값(Team Config/관리자 정책) 우선
- 비밀 정보 분리: 토큰/키는 환경 변수로 관리
설정 레이어(우선순위) 이해
Codex는 여러 레이어에서 설정을 읽습니다. 운영할 때는 "어디에 적으면 어떤 범위에 적용되는지"를 알아야 합니다.
- 프로젝트 설정: 레포 내부의
.codex/config.toml(프로젝트 루트 → 현재 작업 디렉토리까지 순회, 가장 가까운 파일이 승리, 단 trusted 프로젝트만 적용) - 사용자 설정:
~/.codex/config.toml - 시스템 설정(선택): Unix 기준
/etc/codex/config.toml - 기본값: built-in defaults
- CLI 1회성 오버라이드: 전용 플래그(예:
--model) 또는--config로 단발성 덮어쓰기
팀 운영에 유용한 패턴
1) "기본 안전 + 예외만 프로필"로 설계
기본 설정은 보수적으로 두고, 역할/상황별 예외는 프로필로 분리합니다.
# ~/.codex/config.toml (예시)
model = "gpt-5.5"
approval_policy = "on-request"
sandbox_mode = "workspace-write"
web_search = "cached"# ~/.codex/deep-review.config.toml (예시)
model = "gpt-5.5"
model_reasoning_effort = "high"
review_model = "gpt-5.5"codex --profile deep-review
codex exec --profile deep-review "review this change"0.134.0 이후 profile migration
--profile deep-review는 더 이상 ~/.codex/config.toml 안의 [profiles.deep-review] 테이블이나
top-level profile = "deep-review"를 읽지 않습니다. 프로필은 ~/.codex/deep-review.config.toml처럼
별도 파일에 top-level key로 작성하고, 기본 사용자 설정 위에 얹는 레이어로 관리하세요.
2) CLI 오버라이드는 "전용 플래그 우선, 없으면 --config"
--config는 값이 JSON이 아니라 TOML로 파싱됩니다. 이 점을 팀에 미리 공유해두면 삽질이 줄어듭니다.
# 전용 플래그 (권장)
codex --model gpt-5.5
# 범용 오버라이드 (value는 TOML)
codex --config model='\"gpt-5.5\"'모델 기본값 갱신 (2026-06)
공식 모델 문서 기준으로 현재 Codex 기본 추천은 gpt-5.5입니다. 2026-06-12 재검증 기준
gpt-5.5는 ChatGPT 로그인과 API-key 인증 모두에서 Codex CLI/SDK·App/IDE에 지원됩니다.
조직 rollout, 비용, latency 정책상 보수적 운영이 필요하면 gpt-5.4 fallback을 함께 문서화하세요.
0.122.0부터는 재현성 높은 자동화를 위해 사용자 전역 설정과 rules를 일부러 무시하는 플래그
--ignore-user-config, --ignore-rules도 생겼습니다. 개인 취향이 섞이면 안 되는 CI나
비교 실험에서는 이 플래그를 함께 고려하세요.
3) CODEX_HOME(로컬 상태) 기준으로 "환경 재현성" 관리
Codex는 로컬 상태를 CODEX_HOME 아래에 저장하고, 기본값은 ~/.codex입니다.
팀에서 재현/디버깅이 잦다면 문제 재현 시 CODEX_HOME과 설정 파일을 함께 수집하는 절차를 정하세요.
4) Feature Flags 관리
codex features 명령으로 실험적 기능을 켜고 끌 수 있습니다.
codex features list # 전체 플래그 확인
codex features enable multi_agent # 멀티에이전트 활성화
codex features disable shell_snapshot변경은 ~/.codex/config.toml 또는 지정된 프로필에 저장됩니다.
5) 플러그인/요구사항(requirements)도 설정 레이어로 취급
최근 릴리스 기준으로 Codex는 플러그인 단위로 skills/MCP/apps를 로드할 수 있고, 관리자
requirements.toml은 웹 검색 모드와 네트워크 제약까지 강제합니다.
- 플러그인 카탈로그 운영: "실험용 → 팀 allowlist → 전사 배포" 순으로 승격시키는 절차를 둡니다
- required MCP 최소화: fail-fast 동작이 강화됐기 때문에, 정말 필수인 서버만 required로 승격합니다
- 네트워크 제약 문서화:
requirements.toml에서 허용된 네트워크/검색 모드를 함께 기록해 현장 편차를 줄입니다 - cloud-managed requirements: Business/Enterprise/Edu 조직은 Codex 서비스에서
requirements.tomlcompatible 정책을 배포할 수 있습니다. 0.137.0 이후 cloud-managed config bundle 적용 흐름이 보강됐으므로 CLI/App/IDE 전반에 걸친 정책 적용 여부를/debug-config와 관리자 화면에서 함께 점검하세요 - marketplace source 표준화: 0.121.0부터
codex marketplace add가 GitHub, git URL, 로컬 디렉토리, 직접marketplace.jsonURL을 지원하므로, 팀은 "어떤 source만 허용할지"를 allowlist로 정하는 편이 좋습니다 - plugin sharing 정책화: 0.129.0~0.130.0부터 workspace sharing, share access controls, source filtering, link metadata, discoverability controls가 강화됐습니다. 개인 실험 plugin과 팀 공유 plugin을 같은 목록에서 다루지 말고, share 권한과 discoverability를 릴리즈 절차에 포함하세요.
- plugin JSON 감사: 0.138.0~0.139.0 기준
codex plugin add/remove --json,codex plugin list --available --json,codex plugin marketplace list --json이 marketplace source와 설치/가용 상태를 구조화해 출력합니다. 팀 감사는/plugins화면 캡처보다 JSON 출력을 기준으로 삼으세요.
6) TUI keymap과 입력 모드도 설정으로 관리
0.128.0부터 configurable TUI keymaps가 들어왔고, 0.129.0에서는 /keymap과 modal Vim composer 흐름이
좋아졌습니다. 팀에서 pair/mob 세션이나 원격 터미널을 많이 쓴다면 shortcut 충돌을 개인 취향에 맡기지 말고
기본 keymap만이라도 문서화하세요.
[tui.keymap.global]
# 예시는 팀 표준에 맞게 실제 CLI에서 /keymap으로 확인한 뒤 고정조직 표준(강제/공유) 레이어
- 관리자 강제(requirements.toml): 조직이 허용하는
approval_policy/sandbox_mode범위를 제한할 수 있습니다(예:never또는danger-full-access금지). - Team Config: 팀 공용 기본값/규칙/스킬을 공유하는 계층입니다.
Team Config 운영
Team Config는 공용 config.toml + rules/skills를 중앙에서 배포하기 위한 레이어입니다.
CLI는 다음 경로에서 .codex/ 디렉토리를 순서대로 탐색하며, config.toml, rules/, skills/를 로드합니다.
- 현재 작업 디렉토리
- 부모 디렉토리(상위로 순회)
- Git 리포지토리 루트
- 사용자 홈(
~/.codex) - 시스템(
/etc/codex)
이 구조를 활용하면 팀 표준은 상위 레이어로 고정하고 프로젝트별 예외만 로컬에서 좁게 덮어쓸 수 있습니다.
운영 팁
Team Config는 CLI/IDE/Codex App에서 공유되는 설정입니다. 공용 정책을 바꾸면 모든 클라이언트가 영향을 받으니, 변경은 릴리즈 노트 + 롤백 플랜과 함께 관리하세요.
설정 진단: /debug-config
설정이 꼬였을 때 /debug-config를 실행하면 각 레이어의 설정 값과 우선순위를 한눈에 볼 수 있습니다.
requirements.toml이 제한한 값도 표시되므로 디버깅할 때 요긴합니다.
0.139.0 sandbox 진단
최신 CLI는 /debug-config에서 effective sandbox mode를 더 명확히 보여주고, codex sandbox -P <profile>로
named permissions profile을 바로 검증할 수 있습니다. configured network proxy도 sandbox 경로에서 강제되므로,
proxy/egress 정책은 config 문서와 실제 sandbox smoke test를 함께 관리하세요.
Permission Profile 설정 언어
최신 config reference에서는 default_permissions와 [permissions.<name>] 테이블로 파일시스템 정책과
네트워크 정책을 분리해서 선언할 수 있습니다. 0.133.0~0.135.0 이후에는 profile inheritance, managed
requirements.toml, 런타임 refresh, /permissions 내 custom profile 표시가 좋아져서, 운영자가 의도한
프로필이 실제 세션에 적용됐는지 확인하기 쉬워졌습니다.
# config.toml 예시
default_permissions = "safe"
[permissions.safe]
description = "Workspace edits with OpenAI and registry access."
extends = ":workspace"
[permissions.safe.filesystem.":workspace_roots"]
"**/*.env" = "deny"
"secrets/**" = "deny"
[permissions.safe.network]
enabled = true
[permissions.safe.network.domains]
"api.openai.com" = "allow"
"registry.npmjs.org" = "allow"팀에서는 :read-only, :workspace, :danger-full-access 같은 built-in profile을 그대로 쓰거나,
:workspace를 extends한 named permission profile로 파일/네트워크 예외를 좁게 선언한 뒤 /debug-config와
/permissions picker에서 실제 병합 결과를 확인하세요.
운영 팁: 분리 정책의 장점
"파일은 workspace-write지만 네트워크는 restricted"처럼 이전에는 커스텀 스크립트로 해결하던 조합을 설정 한 곳에서 선언적으로 관리할 수 있습니다.
deny-read 정책으로 "보이되 못 읽게" 만들기 (0.122.0)
0.122.0부터 filesystem permissions는 "deny" 값을 쓴 deny-read glob 정책을 더 잘 지원합니다.
"프로젝트 전체는 쓰게 두되, 비밀 파일과 일부 민감 경로만 읽지 못하게" 막는 게 핵심입니다.
[permissions.safe.filesystem.":workspace_roots"]
"." = "write"
"**/*.env" = "deny"
"secrets/**" = "deny"permissions.<name>.filesystem.<scope>.<path-or-glob> = "deny"로 읽기 차단:workspace_roots는 현재 세션의 workspace roots와 profile-defined roots에 같은 규칙을 적용- 관리형 requirements에서도 deny-read 정책을 강제할 수 있으므로, 조직 표준으로 승격하기 좋음
팀 운영 팁:
.env,secrets/, 배포 자격증명 디렉토리는 deny-read로 먼저 막고 시작- 쓰기 권한이 필요해도 "읽으면 안 되는 것"은 별도로 분리
/debug-config로 실제 profile 병합 결과를 꼭 확인
스킬 enablement 설정
최신 config reference는 skills.config로 특정 스킬 경로의 활성 여부를 관리합니다. 팀에서는 개인 실험용
스킬과 프로젝트 표준 스킬을 나누고, 위험한 스크립트가 든 스킬은 기본 disabled로 두는 편이 안전합니다.
[[skills.config]]
path = "/Users/you/.codex/skills/release-checklist"
enabled = true
[[skills.config]]
path = "/Users/you/.codex/skills/destructive-maintenance"
enabled = false주의
스킬은 지시뿐 아니라 helper script와 MCP 의존성을 포함할 수 있습니다. 설치/활성화 여부는 plugin sharing과 같은 공급망 절차로 관리하세요.
웹 검색 정책화
web_search는 disabled | cached | live를 지원합니다.
기본값은 cached이며, --yolo 같은 full access 모드에서는 기본이 live로 동작할 수 있으므로(운영/컴플라이언스 관점), 팀 정책으로 명시하는 편이 안전합니다.
최근 릴리스에서는 관리자 requirements.toml이 웹 검색 모드 제한뿐 아니라 네트워크 제약까지 함께
강제하도록 확장됐습니다. 보안팀/플랫폼팀은 "누가 live 검색을 쓸 수 있는지"와 "어떤 네트워크
경로를 열 수 있는지"를 한 문서에서 관리하는 편이 좋습니다.
0.122.0부터는 tool discovery와 image generation이 기본 활성화됩니다. Codex가 작업에 도움이 된다고 판단하면 내장 도구를 더 적극적으로 찾고 제안한다는 뜻입니다. deterministic한 CI나 감사 중심 환경에서는 프롬프트, rules, permissions에 "웹 검색 금지", "이미지 생성 금지" 같은 제약을 명시적으로 적어 두는 편이 안전합니다.
웹 검색 도구 상세 설정
웹 검색은 top-level web_search와 tools.web_search 객체형 설정으로 관리합니다.
검색 context size, allowed domains, user location을 세밀하게 제어할 수 있습니다.
# config.toml 예시
web_search = "live"
[tools.web_search]
context_size = "medium"
allowed_domains = ["developers.openai.com", "github.com"]
[tools.web_search.location]
country = "KR"
timezone = "Asia/Seoul"팀에서 검색 범위를 사전 제한하면 비용 절감과 보안 경계 관리에 모두 도움이 됩니다.
Deprecated 주의
[features]의 web_search* 토글은 deprecated(legacy)입니다. 가능한 한 top-level web_search
또는 [tools.web_search] 설정으로 표준화하세요.
참고 문서
- config 기본: https://developers.openai.com/codex/config-basic (영어)
- Team Config: https://developers.openai.com/codex/team-config (영어)
- config 고급: https://developers.openai.com/codex/config-advanced (영어)
- config 레퍼런스: https://developers.openai.com/codex/config-reference (영어)
- config 예시: https://developers.openai.com/codex/config-sample (영어)
- Permissions: https://developers.openai.com/codex/permissions (영어)
- Managed configuration: https://developers.openai.com/codex/enterprise/managed-configuration (영어)
- Customization 가이드: https://developers.openai.com/codex/concepts/customization (영어)
- GitHub Releases: https://github.com/openai/codex/releases (영어)