jwt

8 개의 포스트

cloudflare

모든 내부 바이브 코딩 애플리케이션을 한 번의 클릭으로 안전하게 보호하세요 (새 탭에서 열림)

AI로 애플리케이션 개발·배포가 쉬워진 만큼, 직원이 실수로 내부 애플리케이션이나 데이터를 인터넷에 노출할 위험도 커졌다. Cloudflare는 이를 막기 위해 Workers에 Cloudflare Access를 직접 연결해, 애플리케이션 코드나 개발자의 설정에 의존하지 않고 기본적으로 인증을 강제할 수 있도록 했다. 계정 전체, 개별 Worker, 프리뷰 환경에 정책을 적용하고, 코드에서는 별도의 JWT 검증 없이 인증 사용자 정보를 사용할 수 있다. ## Worker 단위로 적용하는 Cloudflare Access - Access를 Worker에 활성화하면 요청이 애플리케이션 코드에 도달하기 전에 인증이 수행된다. - 다음과 같은 접근 경로를 모두 보호할 수 있다. - 커스텀 도메인 - 라우트 - `workers.dev` 서브도메인 - 프리뷰 URL - 기존에는 호스트 이름별로 Access 정책을 설정해야 했기 때문에 새 도메인을 추가할 때마다 정책도 갱신해야 했다. - 이제 정책이 호스트 이름이 아닌 Worker에 연결되므로, 해당 Worker에 연결된 새 도메인과 URL도 자동으로 보호된다. - 보호 범위는 다음 중에서 선택할 수 있다. - 프리뷰 URL만 보호 - 모든 호스트 이름 보호 - 기존 IdP를 연결하거나 특정 이메일 주소, 도메인, 그룹만 허용할 수 있으며, 에이전트에는 서비스 토큰을 사용할 수 있다. ## 계정 전체의 Worker를 기본적으로 비공개 처리 - 계정 수준에서 Access 정책을 설정하면 현재 및 향후 생성되는 모든 Worker가 기본적으로 비공개가 된다. - 정책 적용 범위는 다음과 같이 선택할 수 있다. - 프리뷰 트래픽만 - 프로덕션 트래픽만 - 프리뷰와 프로덕션 모두 - 프로덕션은 공개해야 하지만 개발 중인 배포는 노출되면 안 되는 경우, 프리뷰 전용 정책이 유용하다. - 특정 Worker를 공개해야 한다면 계정 전체 정책을 해당 Worker에서 우회할 수 있다. ## 개별 Worker 정책과 우선순위 - 계정 전체를 잠그지 않고 특정 애플리케이션만 보호하는 것도 가능하다. - Worker 화면의 새로운 Access 탭에서 해당 애플리케이션에 적용되는 정책을 확인할 수 있다. - 여러 정책이 겹칠 경우 우선순위는 다음과 같다. 1. 호스트 이름 정책 2. Worker 정책 3. 계정 정책 ## 코드에서 인증 사용자 정보 확인 - Access가 Worker를 보호하면 요청의 `ctx` 객체에 인증 사용자 정보가 포함된다. - `ctx.access.getIdentity()`를 호출해 다음 정보를 얻을 수 있다. - 이메일 - 이름 - 그룹 - 기존에는 JWT를 직접 파싱하고 서명을 검증한 뒤 클레임을 추출해야 했지만, 이제는 Worker에서 바로 identity 객체를 사용할 수 있다. ```js export default { async fetch(request, env, ctx) { if (!ctx.access) { return new Response("Access required", { status: 403 }); } const identity = await ctx.access.getIdentity(); const email = identity?.email ?? "unknown"; return new Response(`Hello, ${email}`); } }; ``` - 사용자별 화면 구성, 권한 검사, 사용자 단위 감사 로그 등에 활용할 수 있다. ## 로컬 개발 환경에서 인증 사용자 시뮬레이션 - 배포 전에 `wrangler dev`에서 Access 사용자 정보를 테스트할 수 있다. - `wrangler.jsonc`에 개발용 Access identity를 설정한다. ```json { "access": { "dev": { "aud": "my-app", "identity": { "email": "admin@company.com" } } } } ``` - 로컬 요청에서도 `ctx.access.getIdentity()`가 프로덕션과 유사한 identity 객체를 반환한다. - 이메일 주소를 바꿔가며 사용자별 콘텐츠와 권한 동작을 배포 없이 검증할 수 있다. ## 내부 애플리케이션 플랫폼 보호 - Workers for Platforms를 이용하면 여러 애플리케이션을 대규모로 배포할 수 있다. - 각 Worker가 네임스페이스에 배포되고, 모든 요청은 하나의 dispatch Worker를 거친다. - dispatch Worker에 Access 정책을 한 번만 설정하면 이를 통해 배포되는 모든 Worker가 기본적으로 비공개가 된다. - 내부 드래그 앤 드롭 배포 플랫폼처럼 직원용 애플리케이션 플랫폼을 구축할 때 유용하다. ## FL2 기반 요청 처리 구조 - Worker 단위 Access 적용은 Cloudflare의 Rust 기반 모듈형 프록시인 FL2를 기반으로 한다. - Access가 실행되기 전에 요청이 어느 Worker로 라우팅될지 알아야 하므로, Workers 라우팅과 실행 로직을 분리해야 했다. - 라우팅을 Access보다 앞 단계로 이동함으로써 호스트 이름이 아니라 개별 Worker를 기준으로 인증 정책을 적용할 수 있게 되었다. - 기존 NGINX·Lua 기반 FL1 구조에서는 요청 파이프라인의 로직을 앞 단계로 옮기는 작업이 복잡하고 위험할 수 있었지만, FL2가 이를 가능하게 했다. 개발 조직에서는 계정 수준에서 프리뷰 배포를 우선 보호하고, 공개가 필요한 Worker만 명시적으로 예외 처리하는 방식이 실용적이다. 내부 플랫폼을 운영한다면 dispatch Worker에 Access를 적용해 새로 배포되는 모든 애플리케이션을 비공개 상태로 시작하는 것이 안전하다.

gitlab

GitLab Secrets Manager, ESO·Terraform·API 지원 추가 (새 탭에서 열림)

GitLab Secrets Manager가 External Secrets Operator(ESO), Terraform/OpenTofu, CLI, API를 지원하면서 CI/CD 외의 환경에서도 하나의 비밀 저장소를 사용할 수 있게 되었다. OpenBao 기반의 Vault 호환 인터페이스를 통해 Kubernetes, 인프라 코드, 외부 자동화가 동일한 방식으로 비밀을 조회하며, 인증에는 단기 JWT를 사용한다. 이를 통해 여러 저장소와 인증 모델, 감사 로그를 따로 관리해야 하는 부담을 줄일 수 있다. ### GitLab Secrets Manager의 통합 비밀 관리 - 기존에는 CI/CD, Kubernetes, Terraform마다 별도의 비밀 저장소를 사용하는 경우가 많았다. - GitLab Secrets Manager는 OpenBao를 기반으로 다음 환경에 동일한 저장소를 제공한다. - Kubernetes 워크로드 - Terraform 및 OpenTofu 실행 - OpenBao 또는 Vault CLI - GitLab CI/CD 작업 - 외부 자동화 시스템 및 스크립트 - Vault 호환 KV v2 API를 제공하므로 기존 Vault 생태계 도구와 연동할 수 있다. - 중앙 집중식 저장소를 사용하면 접근 정책과 감사 추적을 일관되게 관리할 수 있다. ### Kubernetes와 External Secrets Operator 연동 - ESO는 Vault provider를 통해 GitLab Secrets Manager에서 비밀을 가져온다. - Kubernetes 워크로드는 단기 JSON Web Token(JWT)을 사용해 OpenBao에 인증한다. - `SecretStore` 리소스에서 다음 항목을 설정한다. - `server`: GitLab Secrets Manager의 Vault 호환 서버 주소 - `path`: KV v2 마운트 경로 - `namespace`: 조직·그룹·프로젝트 계층을 나타내며 접근 가능한 비밀 범위를 제한 - `auth.jwt.path`: JWT 인증 경로 - `auth.jwt.role`: 사용할 인증 역할 - `secretRef`: Kubernetes Secret에 저장된 JWT 참조 - `ExternalSecret`은 원격 비밀과 Kubernetes Secret 사이의 매핑을 정의한다. - `remoteRef.key`: GitLab Secrets Manager의 비밀 경로 - `property`: 원격 비밀 내부에서 가져올 필드 - `secretKey`: Kubernetes Secret에 저장될 키 - `target.name`: 생성할 Kubernetes Secret 이름 - ESO는 대상 Secret을 생성하고 소유하며, 설정된 `refreshInterval`마다 값을 다시 조회한다. - 비밀이 교체되면 애플리케이션을 재배포하지 않아도 Kubernetes Secret에 변경 사항이 반영된다. ### Terraform과 OpenTofu에서 비밀 조회 - Terraform의 `.tfvars` 파일이나 상태 파일에 인증 정보가 기록되면 자격 증명이 유출될 위험이 있다. - GitLab Secrets Manager를 Terraform data source로 조회하면 비밀을 `.tfvars`나 CI/CD 변수에 직접 저장하지 않고 실행 시점에 가져올 수 있다. - 일반적인 흐름은 다음과 같다. - 외부 스크립트로 GitLab 프로젝트의 단기 JWT를 발급 - Terraform Vault provider에 서버 주소, namespace, 인증 경로, role, JWT 전달 - `vault_kv_secret_v2` data source로 원하는 비밀 조회 - 필요한 경우 `sensitive = true`로 출력값을 민감 정보로 표시 - Terraform 실행 시점에 인증이 이루어지므로 장기 자격 증명을 코드나 설정 파일에 남기는 일을 줄일 수 있다. ### OpenBao 및 Vault CLI 사용 - 기존에 Vault용 CLI나 스크립트를 사용 중인 팀은 별도의 클라이언트를 도입하지 않아도 된다. - `VAULT_ADDR`와 `VAULT_NAMESPACE`를 설정한 뒤, 발급받은 JWT를 JWT 인증 엔드포인트에 전달한다. - 인증 결과로 받은 OpenBao 토큰을 `VAULT_TOKEN`에 설정한다. - 이후 `vault kv get` 명령으로 KV v2 경로의 비밀을 조회할 수 있다. - Vault 호환 방식을 사용하므로 기존 운영 자동화와의 통합 비용이 낮다. ### Secrets Manager API를 통한 외부 자동화 - GitLab CI/CD, Kubernetes, Terraform에 포함되지 않는 외부 시스템은 Secrets Manager API를 사용할 수 있다. - 서비스 계정 또는 액세스 토큰으로 프로젝트별 액세스 토큰 발급 API를 호출한다. - API 응답에는 다음과 같은 연결 정보가 포함된다. - Vault 서버 주소 - namespace - KV 마운트 경로 - 비밀 경로 - JWT 인증 경로 - 인증 role - JWT - 외부 시스템은 이 정보를 이용해 단기 인증을 수행하고 필요한 비밀만 조회한다. - 하드코딩된 비밀번호나 별도의 변수 파일을 유지하지 않아도 되는 것이 장점이다. ### 실용적인 적용 권장 사항 - Kubernetes에서는 ESO의 `SecretStore`와 `ExternalSecret`을 사용해 자동 동기화와 비밀 교체를 구성한다. - Terraform에서는 비밀을 `.tfvars`에 넣기보다 실행 시점의 data source 조회 방식으로 전환한다. - 기존 Vault 자동화가 있다면 OpenBao/Vault CLI 호환 기능을 우선 활용한다. - 외부 서비스에는 장기 토큰 대신 프로젝트 범위와 역할이 제한된 단기 JWT를 사용하고, 접근 범위와 감사 로그를 함께 관리하는 것이 좋다.

cloudflare

MoQ를 위한 API: 자체 격리 릴레이 프로비저닝 (새 탭에서 열림)

Cloudflare는 MoQ(Media over QUIC)를 애플리케이션용으로 운영할 수 있도록 격리된 릴레이와 인증·권한 관리 기능을 추가했다. 프로비저닝 API나 대시보드에서 릴레이를 생성하면 별도 서버나 로드 밸런서 없이 Cloudflare 전역 네트워크에 수초 내 배포된다. 퍼블리셔와 구독자에게 서로 다른 토큰을 발급해 실시간 미디어 스트림의 접근 권한도 분리할 수 있다. ## MoQ의 구조와 장점 - MoQ는 IETF에서 개발 중인 공개 표준 기반의 publish/subscribe 프로토콜이다. - 퍼블리셔는 이름이 지정된 데이터 스트림을 전송하고, 구독자는 스트림 이름으로 원하는 데이터를 요청한다. - 릴레이는 데이터 내용을 해석하지 않고 스트림을 구독자들에게 복제·전달한다. - 하나의 프로토콜로 라이브 비디오, 화상 통화, 저지연 메시징 등 다양한 실시간 데이터를 처리할 수 있다. - QUIC을 기반으로 하므로 HTTP/3와 같은 낮은 지연 특성을 활용한다. - 애플리케이션이 직접 미디어 서버를 구축하거나 대규모 fan-out 서버를 운영할 필요가 줄어든다. ## 공개 프리뷰의 한계 - Cloudflare는 지난해 330개 이상의 도시에 있는 서버를 MoQ 릴레이로 개방했다. - 인증 없이 누구나 사용할 수 있어 프로토콜 테스트와 클라이언트 개발에 적합했다. - 그러나 인증이 없으면 누가 퍼블리시하거나 구독할 수 있는지 통제할 수 없다. - 예를 들어 경매 서비스에서는 시청자가 방송자의 트랙을 탈취하지 못하도록 퍼블리셔와 구독자의 권한을 분리해야 한다. - 따라서 기밀성, 인증, 역할 기반 접근 제어가 필요한 운영 환경에는 기존 공개 릴레이를 사용할 수 없었다. ## Cloudflare 릴레이의 격리 방식 - 릴레이를 생성해도 VM, 컨테이너, 전용 프로세스가 새로 실행되는 것은 아니다. - 기존 Cloudflare 글로벌 네트워크 위에 애플리케이션별 격리된 범위를 생성한다. - 각 범위는 다음을 분리한다. - 애플리케이션의 네임스페이스 - 미디어 트랙과 객체 - 접속 가능한 클라이언트 - 퍼블리시·구독 권한 - 클라이언트는 Anycast 엔드포인트에 접속하고, Cloudflare가 전 세계 네트워크로 라우팅한다. - 지역 선택, 용량 산정, 서버 배포, 로드 밸런서 설정 없이 즉시 사용할 수 있다. - 웹 호스팅에서 새 서버를 띄우는 것보다 가상 호스트를 추가하는 방식에 가깝다. ## 프로비저닝 API와 토큰 권한 - 프로비저닝 API는 미디어 데이터를 처리하지 않는 제어 평면이다. - 관리 대상은 두 가지다. - **Relay**: 애플리케이션별로 격리된 MoQ 실행 범위 - **Token**: 특정 릴레이에 대한 작업 권한을 부여하는 인증 정보 - 토큰은 다음 권한을 조합할 수 있다. - `publish` - `subscribe` - `publish`와 `subscribe` 모두 - 토큰마다 만료 시간을 설정할 수 있고, 개별적으로 폐기할 수 있다. - 기본적으로 토큰 권한은 릴레이 전체에 적용된다. - 현재는 세부 트랙별 권한보다 릴레이 단위 권한을 제공하며, 향후 더 정교한 권한 체계를 개발할 예정이다. - Cloudflare는 MoQ Transport draft-14와 draft-16 및 인증 기능을 지원한다. ## 릴레이 생성과 기본 토큰 - HTTP API에서는 릴레이 이름만 지정해 생성할 수 있다. - 생성 결과로 릴레이 ID와 기본 토큰 2개가 반환된다. - 퍼블리시와 구독이 모두 가능한 토큰 - 구독만 가능한 토큰 - 추가 토큰을 생성해 시청자, 방송자, 운영 도구 등 역할별로 권한을 세분화할 수 있다. - 예를 들어 시청자용 토큰은 `subscribe`만 허용하고, 2027년 1월 1일 만료되도록 설정할 수 있다. - 동일한 작업은 Cloudflare 대시보드의 **Media > Realtime > MoQ Relay** 메뉴에서도 수행할 수 있다. - 릴레이는 베타 기간 동안 무료로 제공된다. ## 퍼블리셔와 구독자의 연결 - 방송자에게는 `publish` 권한이 포함된 토큰을 제공한다. - 시청자에게는 `subscribe` 전용 토큰을 제공한다. - 클라이언트는 MoQ 세션을 열 때 토큰을 전달한다. - 릴레이는 토큰의 권한을 확인해 퍼블리시와 구독 작업을 허용하거나 거부한다. - 토큰은 MoQ 접속 URL 경로를 통해 전달되며, `moq-rs` 같은 오픈소스 도구와 FFmpeg를 이용해 fragmented MP4 스트림을 퍼블리시할 수 있다. ## 실용적인 결론 실시간 영상이나 저지연 데이터 서비스를 구축한다면 Cloudflare MoQ 릴레이를 통해 서버 운영과 확장 부담을 줄일 수 있다. 운영 시에는 방송자와 시청자 토큰을 반드시 분리하고, 만료 기간과 폐기 정책을 설정해 권한 탈취 위험을 최소화하는 것이 좋다.

line

ID-JAG The Hard Way: 실패로 배우는 AI 에이전트 보안 핸즈온 (새 탭에서 열림)

AI 에이전트의 API 접근에는 단순한 사용자 인증을 넘어, 에이전트가 특정 사용자를 대신해 정해진 범위의 작업만 수행하도록 통제하는 위임 인가가 필요하다. 글은 OAuth 기반 프로필인 ID-JAG를 활용해 Keycloak, Athenz, MCP 서버, 리소스 서버가 연계되는 전체 흐름을 로컬 핸즈온으로 재현한다. 특히 인증 정보와 실제 접근 권한을 분리하고, 기업 정책에 따라 실패 지점을 명확히 차단하는 중앙 집중형 인가 구조를 강조한다. ## ID-JAG가 해결하려는 문제 - ID-JAG는 다음 OAuth 표준을 결합해 위임된 크로스 도메인 API 접근을 지원한다. - OAuth 2.0 Token Exchange(RFC 8693) - JWT Profile for OAuth 2.0 Authorization Grants(RFC 7523) - 기존의 “사용자가 누구인가?”라는 인증 중심 질문을 다음과 같이 확장한다. - AI 에이전트가 현재 사용자를 대신해 특정 리소스에 접근할 권한이 있는가? - 요청된 권한 범위와 기업 정책을 충족하는가? - AI 에이전트에 영구적이고 포괄적인 권한을 주면 오작동이나 공격 시 피해 범위가 커지고, 사용자의 의도와 에이전트의 자율 행동을 구분하기 어렵다. - 모든 API 호출마다 사용자의 동의를 요구하면 자동화와 사용자 경험이 훼손된다. - ID-JAG는 임시 토큰 연결 대신, 정책에 기반한 명시적 위임과 중앙 집중형 신뢰 관계를 제공한다. ## 데모 아키텍처와 역할 분리 핸즈온에서는 인증과 인가 정책을 의도적으로 분리한다. - **Keycloak** - 사용자를 인증하는 업스트림 IdP다. - 로그인 결과로 원본 ID 어서션을 발급한다. - **Athenz** - KeycloakTokenExchangePlugin을 통해 연동된 IdP 인가 서버로 동작한다. - Keycloak 토큰의 발급자, 서명, 대상, 주체, 클라이언트 바인딩을 검증한다. - 기업 정책을 평가하고 최종 ID-JAG 어서션을 발급한다. - 중앙 리소스 인가 서버이자 정책 결정 지점(PDP) 역할을 한다. - **AI 에이전트** - 사용자를 대신해 ID-JAG와 액세스 토큰을 요청한다. - 장기 마스터 키가 아니라 정책으로 제한된 임시 권한을 사용한다. - **MCP 서버** - 에이전트가 호출하는 보호된 중간 리소스 서버다. - 전달받은 토큰을 인가 서버와 교환한 뒤 최종 리소스 서버에 접근한다. - **리소스 서버** - Athenz가 발급한 신뢰 가능한 토큰만 수용한다. - 업스트림 IdP의 토큰을 무조건 인가 그랜트로 인정하지 않는다. ## ID-JAG 실행 흐름 실습 환경에서는 다음 순서로 위임 접근이 진행된다. - 사용자가 Keycloak을 통해 로그인한다. - 사용자가 AI 에이전트에 작업을 지시한다. - 에이전트가 Athenz에 ID-JAG 토큰을 요청한다. - Athenz가 사용자, 클라이언트, 대상 리소스, 권한 범위 및 기업 정책을 검증한다. - 허용된 경우 에이전트가 Athenz에 액세스 토큰을 요청한다. - 에이전트가 액세스 토큰을 포함해 MCP 서버를 호출한다. - MCP 서버가 토큰 교환을 수행한다. - 교환된 토큰으로 최종 리소스 서버에 요청한다. 이 구조에서는 인증된 사용자라는 사실만으로 모든 리소스 접근이 허용되지 않으며, 각 단계에서 위임 범위와 정책을 다시 확인한다. ## 인증 토큰과 인가 그랜트의 분리 Keycloak의 ID 토큰을 곧바로 액세스 토큰으로 교환하는 방식도 기술적으로는 가능하지만, 보안 모델상 한계가 있다. - **ID 토큰** - 사용자가 클라이언트에 성공적으로 인증됐음을 나타낸다. - 특정 리소스에 접근할 권리를 직접 의미하지 않는다. - **인가 그랜트** - 특정 리소스와 권한 범위에 대한 액세스 토큰 발급을 요청하기 위해 인가 서버에 제출된다. - ID-JAG를 별도의 인가 그랜트로 사용하면 다음 실패 유형을 구분할 수 있다. - 사용자 인증 실패 - 그랜트 검증 실패 - 에이전트 위임 거부 - 기업 정책 거부 - 리소스 서버의 토큰 거부 - 이 경계는 장애 분석과 감사 추적을 명확하게 만들고, 로그인 성공이 곧 크로스 도메인 API 접근 권한으로 오해되는 것을 방지한다. ## 실패 경로를 통한 보안 검증 핸즈온은 정상 동작뿐 아니라 의도적인 설정 오류를 통해 정책 경계를 확인하도록 구성된다. - 토큰 없이 보호된 API를 호출하면 `401 Unauthorized`가 발생한다. - 엔터프라이즈 역할만 설정하고 멤버십을 누락하면 토큰 교환이 실패한다. - 에이전트에 필요한 위임 권한을 부여하지 않으면 위임 호출이 차단된다. - 각 오류는 인증, 역할, 멤버십, 위임 정책, 토큰 교환 중 어느 단계가 필요한지 보여준다. - Athenz UI에서 에이전트의 위임 권한을 제거한 뒤 다시 실행하면 차단이 발생하는 지점을 직접 추적할 수 있다. ## 중앙 정책 관리의 장점 - 기업의 위임 정책을 Athenz 한 곳에서 관리할 수 있다. - 여러 IdP, SaaS, 리소스 애플리케이션에 정책을 중복 배포할 필요가 줄어든다. - 벤더별 인가 로직에 대한 종속을 완화할 수 있다. - 시스템 간 정책 불일치와 운영상의 보안 위험을 줄인다. - Athenz가 ID-JAG 발급자이자 PDP로 기능하면서, 위임 API 접근에 대한 단일 진실 공급원이 된다. ## 실습 방법과 권장 사항 - `athenz-community/id-jag-the-hard-way` 저장소에서 튜토리얼을 실행한다. - 정상 흐름뿐 아니라 의도적으로 역할, 멤버십, 위임 권한을 제거해 실패 지점을 확인하는 것이 중요하다. - 실제 기업 환경에서는 인증 성공 여부와 별도로 리소스·권한·에이전트·정책을 명시적으로 검증해야 한다. - AI 에이전트 도입 시 장기 자격 증명 대신 제한된 범위의 단기 토큰과 중앙 정책 평가를 사용하는 방식을 권장한다.

line

AI 시대에 인증 과제를 해결할 차세대 표준 후보, ID-JAG (새 탭에서 열림)

AI 에이전트가 다양한 기업용 서비스와 연동되는 과정에서 발생하는 인증 및 인가 복잡성을 해결하기 위해 **Identity Assertion JWT Authorization Grant(ID-JAG)**라는 새로운 표준안이 주목받고 있습니다. ID-JAG는 기존 SSO의 신뢰 모델을 API 접근 영역으로 확장하여, 기업 IdP가 중앙에서 권한 정책을 일원화해 관리하고 검증 가능한 JWT를 통해 안전하게 토큰을 교환하도록 돕습니다. 이를 통해 사용자 경험을 개선하고 보안 가시성을 확보함으로써, 복잡한 연동 구조가 AI 도입의 병목이 되지 않도록 하는 것이 핵심입니다. **ID-JAG의 개념과 기술적 배경** * SSO를 통해 확립된 IdP(Identity Provider)에 대한 신뢰를 앱 간 API 호출이나 에이전트 서비스 연동에 적용하는 방식입니다. * OAuth 2.0 Token Exchange(RFC 8693)와 JWT Profile for OAuth 2.0 Authorization Grants(RFC 7523)라는 기존의 두 표준 기술을 결합하여 작동합니다. * IdP가 서명한 검증 가능한 JWT를 일종의 '소개장'으로 발행하고, API 리소스 측 인가 서버가 이 소개장을 신뢰하여 최종 액세스 토큰을 발행하는 구조입니다. **핵심 구성 요소와 작동 흐름** * **주요 주체:** 요청 에이전트(AI 등), 기업 IdP(중앙 정책 보유), 인가 서버(대상 앱의 서버), 리소스 서버(실제 API)의 네 가지 역할로 구분됩니다. * **작동 프로세스:** 사용자가 에이전트에 로그인하여 ID 토큰 획득 → IdP에 토큰 교환을 요청하여 ID-JAG 발급 → 인가 서버에 ID-JAG를 제시하고 최종 액세스 토큰 획득 → 리소스 서버 API 호출 순으로 진행됩니다. * **권한 판단의 주체 변화:** 개별 서비스 간의 파편화된 관계 대신, 조직 전체를 관리하는 기업 IdP와 인가 서버 간의 신뢰 관계로 허가 판단 시점이 이동합니다. **조직의 운영 및 보안 측면의 이점** * **사용자 경험(UX) 개선:** 새로운 도구를 연동할 때마다 나타나는 권한 동의 화면(Consent Screen) 절차를 IdP 관리자 정책에 통합하여 사용자의 번거로움을 줄입니다. * **보안 가시성 확보:** 모든 서비스 연결 관계가 IdP로 집중되므로, 누가 어떤 에이전트를 통해 어떤 데이터에 접근했는지 중앙 로그를 통해 명확하게 감사(Audit)할 수 있습니다. * **중앙 집중형 리스크 통제:** 승인되지 않은 '섀도우 AI'의 접근을 차단하고, 보안 사고 발생 시 개별 엔드포인트를 수정할 필요 없이 IdP 단에서 즉각적으로 권한을 제어할 수 있습니다. * **토큰 스프롤(Sprawl) 방지:** 장기 유효한 API 키나 리프레시 토큰 대신 동적으로 발행되는 ID-JAG를 사용하여 시스템 곳곳에 흩어진 인증 정보 노출 리스크를 낮춥니다. **도입 시 고려 사항 및 실용적 제언** * **표준화 상태 유의:** 현재 IETF 드래프트 단계이며 RFC로 최종 확정된 사양이 아니므로, 향후 변경 가능성을 염두에 둔 유연한 아키텍처 설계가 필요합니다. * **사전 신뢰 관계 구축:** 요청 에이전트가 IdP와 인가 서버 모두에 OAuth 클라이언트로 등록되어야 하며, 각 주체 간의 명시적인 신뢰 설정이 선행되어야 합니다. * **결론:** AI 에이전트 도입으로 인해 파편화된 권한 관리에 어려움을 겪는 기업이라면, ID-JAG를 통해 인가 정책을 중앙화하고 보안 표준을 프로토콜 기반의 동적 신뢰 구조로 전환하는 전략적 검토가 권장됩니다.

cloudflare

Access를 위한 관리형 OAuth: 클릭 한 번으로 내부 앱을 에이전트 대응 가능하게 만들기 (새 탭에서 열림)

Cloudflare는 내부 애플리케이션을 보호하는 'Cloudflare Access'에 클릭 한 번으로 활성화 가능한 'Managed OAuth' 기능을 도입하여 AI 에이전트의 접근성 문제를 해결했습니다. 기존에는 에이전트가 인증 페이지의 리다이렉션을 처리하지 못해 내부 데이터에 접근할 수 없었으나, 이제 OAuth 2.0 표준을 통해 에이전트가 사용자 대신 안전하게 인증을 수행하고 권한을 위임받을 수 있습니다. 이를 통해 기업은 수많은 레거시 앱의 코드를 수정하지 않고도 AI 에이전트가 즉시 활용할 수 있는 환경을 구축할 수 있게 되었습니다. **Managed OAuth의 작동 원리와 기술 표준** * Cloudflare Access가 직접 권한 부여 서버(Authorization Server) 역할을 수행하여 인증되지 않은 에이전트에게 `www-authenticate` 헤더를 반환합니다. * 에이전트는 RFC 9728 표준에 따라 `/.well-known/oauth-authorization-server` 경로에서 인증 서버 정보를 자동으로 탐색합니다. * RFC 7591(동적 클라이언트 등록)을 통해 에이전트가 자신을 클라이언트로 등록하고, RFC 7636(PKCE) 기반의 인증 흐름을 통해 보안성을 확보합니다. * 사용자가 인증을 승인하면 에이전트는 사용자 ID가 포함된 JWT(JSON Web Token)를 발급받아 이후 요청에 활용합니다. **레거시 앱의 즉각적인 AI 대응 환경 구축** * 수많은 내부 앱과 위키, REST API 등을 AI 에이전트가 읽을 수 있도록 개별적으로 코드를 수정하거나 별도의 MCP(Model Context Protocol) 서버를 구축할 필요가 없습니다. * Cloudflare Access 전면에 Managed OAuth를 활성화하는 것만으로 기존 앱들을 에이전트 친화적인 환경으로 즉시 업그레이드할 수 있습니다. * 특히 내부 위키와 같은 서비스의 경우 'Markdown for Agents' 기능과 Managed OAuth를 결합하여 에이전트가 보호된 콘텐츠를 원활하게 소비하도록 지원합니다. **서비스 계정 방식의 보안 한계 극복** * 정적 자격 증명을 사용하는 서비스 계정(Service Account) 방식은 감사 로그에서 실제 행위자를 파악하기 어렵고 '혼동된 대리인(Confused Deputy)' 문제에 취약합니다. * Managed OAuth는 모든 에이전트의 작업을 실제 사용자의 ID와 연결하므로, 사용자가 가진 권한 범위 내에서만 에이전트가 동작하도록 엄격히 제어합니다. * 이를 통해 기업은 보안 정책을 유지하면서도 어떤 사용자의 에이전트가 어떤 데이터에 접근했는지 명확한 감사 추적(Audit Log)을 남길 수 있습니다. **에이전트 도구의 표준 채택 권고** * 현재 대부분의 에이전트용 'web fetch' 도구는 HTTP 응답의 `www-authenticate` 헤더를 처리하지 못하는 한계가 있습니다. * Cloudflare는 에이전트가 MCP 서버뿐만 아니라 일반적인 웹 페이지나 API에 접근할 때도 RFC 9728 표준을 준수하여 자동으로 OAuth 흐름을 수행할 것을 제안합니다. * 이를 위해 오픈소스 프로젝트인 OpenCode의 web fetch 도구에 해당 표준을 적용하는 예시를 제시하며 에이전트 생태계의 표준화를 촉구하고 있습니다. 내부 인프라의 보안을 유지하면서 AI 에이전트의 활용도를 높이고 싶다면, 정적 토큰이나 서비스 계정 대신 Managed OAuth를 활성화하여 사용자 중심의 권한 위임 체계를 구축하는 것이 권장됩니다. 이는 보안 감사 가시성을 확보하는 동시에 가장 빠르고 효율적으로 내부 앱을 AI 시대에 맞게 현대화하는 방법입니다.

github

Squad가 리포지토리 내에서 협업하는 AI 에이전트를 실행하는 방법 (새 탭에서 열림)

Squad는 GitHub Copilot 기반의 여러 AI 에이전트를 저장소 안에 직접 구성해, 설계·구현·테스트·문서화를 협업 방식으로 수행하게 하는 오픈소스 도구다. 복잡한 오케스트레이션 인프라나 고급 프롬프트 설계 없이 `squad init`만으로 팀을 구성할 수 있으며, 저장소 파일을 공유 메모리로 활용한다. 다만 완전한 자동화가 아니라 사용자가 최종적으로 모든 변경 사항과 풀 리퀘스트를 검토하고 병합해야 한다. ## 저장소 안에 구성되는 AI 개발팀 - 전역 설치: ```bash npm install -g @bradygaster/squad-cli ``` - 저장소별 초기화: ```bash squad init ``` - 초기화하면 리드, 프런트엔드 개발자, 백엔드 개발자, 테스터 등 역할별 에이전트가 생성된다. - 사용자는 자연어로 작업을 요청하고, 코디네이터 에이전트가 적절한 전문가에게 작업을 분배한다. - 각 전문가는 별도의 브랜치와 파일을 사용해 구현, 테스트, 문서화 등을 병렬로 진행한다. ## 에이전트 간 작업 조정과 독립적 검토 - 예를 들어 JWT 인증을 요청하면: - 백엔드 에이전트는 refresh token과 bcrypt를 포함한 인증 기능을 구현한다. - 테스트 에이전트는 테스트 코드를 작성하고 실행한다. - 문서화 에이전트는 변경 내용을 정리해 풀 리퀘스트를 생성한다. - 테스트 실패 시 원래 구현자가 자기 코드를 스스로 수정하지 못하도록 검토 프로토콜을 적용할 수 있다. - 다른 에이전트가 별도의 컨텍스트에서 문제를 수정하므로, 자기검토보다 독립적인 리뷰에 가깝다. - 사용자는 중간 결과를 모두 검토하기보다 내부 검증 과정을 통과한 풀 리퀘스트를 검토할 수 있다. - 에이전트가 잘못된 가정을 할 수 있으므로, 최종 검토와 병합은 여전히 사람이 담당한다. ## `decisions.md`를 활용한 공유 메모리 - 실시간 대화나 벡터 데이터베이스 대신 저장소의 `decisions.md`에 아키텍처 결정을 기록한다. - 라이브러리 선택, 명명 규칙, 데이터베이스 연결 방식 같은 결정이 구조화된 블록으로 누적된다. - 이 방식의 장점: - 결정 사항이 지속적으로 보존된다. - Git으로 버전 관리할 수 있다. - 에이전트가 어떤 근거로 작업했는지 추적할 수 있다. - 연결이 끊기거나 세션이 재시작되어도 컨텍스트를 복구할 수 있다. - 저장소 파일을 팀의 “공유 두뇌”로 사용하는 비동기 협업 모델이다. ## 컨텍스트 분할 대신 컨텍스트 복제 - 한 에이전트가 설계, 구현, 테스트, 관리까지 모두 맡으면 컨텍스트 창이 메타 작업으로 가득 차고 환각 가능성이 커진다. - Squad의 코디네이터는 실제 작업을 수행하지 않고 전문가를 호출하는 얇은 라우터 역할을 한다. - 각 전문가는 별도의 추론 호출과 컨텍스트 창을 사용한다. - 지원 모델에서는 에이전트 하나당 최대 약 200K 토큰의 컨텍스트를 활용할 수 있다. - 하나의 컨텍스트를 여러 역할이 나누는 대신, 각 에이전트가 필요한 저장소 컨텍스트를 독립적으로 복제해 병렬 추론한다. ## 파일 기반의 명시적 에이전트 기억 - 에이전트의 기억은 모델 가중치나 숨겨진 세션 상태에 의존하지 않는다. - `.squad/` 폴더에 다음과 같은 텍스트 파일을 저장한다. - **Charter**: 에이전트의 역할과 정체성 - **History**: 에이전트가 과거에 수행한 작업 - **Team decisions**: 팀 전체가 공유하는 결정 사항 - 이 파일들은 코드와 함께 버전 관리되므로 에이전트의 행동 근거를 확인할 수 있다. - 저장소를 복제하면 코드뿐 아니라 프로젝트에 맞게 온보딩된 AI 팀의 기억도 함께 가져올 수 있다. ## 다중 에이전트 개발의 진입 장벽 완화 - 기존 다중 에이전트 시스템은 오케스트레이션 계층, 프레임워크, 벡터 데이터베이스 등을 직접 구성해야 하는 경우가 많다. - Squad는 CLI 명령 두 번으로 저장소에 사전 구성된 팀을 추가한다. - 복잡한 프롬프트 설계나 별도의 중앙 인프라 없이 바로 작업을 위임할 수 있다. - 저장소에 남는 결정 기록과 에이전트 이력 덕분에 동작을 비교적 쉽게 점검하고 재현할 수 있다. 실용적으로는 반복적인 구현·테스트·문서화 작업이 많은 저장소에서 Squad를 시도해볼 만하다. 다만 AI가 생성한 모든 변경 사항을 자동 병합하기보다는, 풀 리퀘스트와 테스트 결과를 사람이 확인하는 협업 도구로 사용하는 것이 적절하다.

cloudflare

번호판에서 배지로: (새 탭에서 열림)

Cloudflare는 에이전트 설치가 불가능한 환경에서도 사용자 신원을 확인하고 보안 정책을 적용할 수 있는 'Gateway Authorization Proxy'를 출시했습니다. 기존의 IP 기반 필터링에서 벗어나 브라우저의 기본 프록시 기능과 Cloudflare Access를 결합함으로써, 관리되지 않는 기기에서도 사용자별로 세밀한 트래픽 제어와 가시성 확보가 가능해졌습니다. 이는 기업 인수합병(M&A), VDI 환경, 규제가 엄격한 산업군에서 보안 공백을 메우는 강력한 해결책이 될 것입니다. ### IP 기반 프록시의 한계와 정체성 위기 * 기존의 프록시 엔드포인트 방식은 정적 IP 주소에 의존하여 사용자를 식별했기 때문에, '누가' 접속하는지가 아닌 '어느 IP'에서 오는지만 인식할 수 있었습니다. * 사용자가 장소를 옮겨 IP가 변경되면 정책이 제대로 적용되지 않는 취약함이 있었으며, 보안 로그에는 사용자 이름 대신 익명 IP만 기록되는 문제가 있었습니다. * 또한 프록시 설정을 안내하는 PAC(Proxy Auto-Configuration) 파일을 기업이 직접 호스팅하고 수동으로 관리해야 하는 운영상의 번거로움이 존재했습니다. ### 신원 기반 인증 프록시의 작동 원리 * 새로운 방식은 차량 번호판(IP) 대신 개별 배지(ID)를 확인하는 것과 같으며, Cloudflare Access와 연동하여 사용자가 누구인지 먼저 검증한 뒤 Gateway 필터링 정책을 적용합니다. * 서명된 JWT(JSON Web Token) 쿠키를 사용하여 신원을 유지하며, 도메인별 보안 토큰을 생성하여 세션을 관리합니다. * 이 모든 인증 과정은 Cloudflare의 글로벌 에지 네트워크에서 수 밀리초 내에 처리되므로, 사용자는 리다이렉트 과정을 거의 느끼지 못한 채 평소처럼 웹 서핑을 할 수 있습니다. ### 다중 ID 공급자 지원 및 통합 관리 * Okta, Azure AD 등 여러 ID 공급자(IdP)를 동시에 지원하여, 서로 다른 인증 체계를 가진 기업들이 합병되는 과정에서도 유연하게 보안을 통합할 수 있습니다. * 클라이언트를 설치하지 않고도 "재무팀만 특정 회계 도구에 접속 가능"과 같은 정교한 사용자별 정책 수립이 가능합니다. * 사용자별 라이선스(Seat) 기반의 단순한 과금 체계를 적용하여 기존 Cloudflare One Client 사용자들과 동일한 방식으로 비용을 관리할 수 있습니다. ### PAC 파일 호스팅 자동화와 AI 지원 * 기업은 이제 PAC 파일을 직접 관리할 필요 없이 Cloudflare 네트워크에서 직접 호스팅하고 배포할 수 있습니다. * 다양한 설정 템플릿을 제공하여 수 분 내에 설정을 완료할 수 있으며, AI 어시스턴트 'Cloudy'가 복잡한 PAC 코드를 요약하고 설명해 주어 설정 오류를 방지합니다. ### 권장 활용 시나리오 Cloudflare는 최상의 사용자 경험을 위해 전용 클라이언트(Cloudflare One Client) 설치를 우선적으로 권장하지만, 다음과 같은 특수 상황에서는 Gateway Authorization Proxy가 최적의 대안이 됩니다. * **VDI(가상 데스크톱) 환경:** 사용자가 가상 머신에 로그인하여 브라우저를 통해서만 인터넷에 접속하는 경우 * **인수합병(M&A):** 서로 다른 보안 환경을 가진 두 회사를 신속하게 하나의 보안 체계로 통합해야 할 때 * **규제 준수 및 제한적 환경:** 보안 정책이나 법적 문제로 인해 엔드포인트 기기에 소프트웨어를 설치할 수 없는 경우