Access 는 어떻게 동작하나네트워크 대신 앱을 하나씩 엽니다
한눈에 보기
Access?는 앱 앞에서 요청마다 신원을 확인하고, 정책이 요구하는 로그인(IdP?, MFA?)을 통과한 요청만 앱에 보냅니다. VPN?과 달리 앱 하나씩 엽니다.
Access는 무엇을 하나요?
앱 앞에서 요청마다 신원을 확인하는 프록시입니다. 정책을 통과한 요청만 오리진?으로 보냅니다.
요청 하나가 지나가는 길
- 사용자가 앱 주소를 열면 요청이 Cloudflare 엣지에 먼저 닿습니다.
- Access가 로그인 화면을 띄우고, 사용자는 회사 IdP로 로그인합니다(정책이 요구하면 MFA까지).
- 통과하면 Access가 JWT?를 발급해 쿠키
CF_Authorization에 담습니다. - 이후 요청은 토큰과 함께 앱으로 갑니다.
기본값이 «거부»라 Allow 정책에 맞는 요청만 들어갑니다.
VPN과 무엇이 다른가요?
여는 단위가 다릅니다. VPN은 네트워크를, Access는 정책에 맞는 앱만 열어 계정이 도용돼도 피해가 덜 번집니다.
VPN과 Access 비교
| 구분 | VPN | Access |
|---|---|---|
| 여는 단위 | 네트워크 | 앱(호스트·경로) |
| 확인 시점 | 접속할 때 | 요청마다 정책 확인 |
| 서버 쪽 | VPN 장비로 들어오는 연결 | Tunnel이면 들어오는 포트 없음 |
| 사용자 단말 | VPN 클라이언트 | 웹 앱은 브라우저만으로 |
Zero Trust?는 «사내망 안이니 믿는다»를 버리고, 요청마다 판단해 역할에 필요한 만큼만 엽니다.
사설 IP로만 닿는 앱은 Cloudflare 연결 네트워크 밖의 사용자에게 Cloudflare One Client가 필요합니다(브라우저 격리 방식은 예외). 공개 호스트 이름의 웹 앱은 브라우저만으로 됩니다.
서버에 들어오는 포트를 열어야 하나요?
열지 않습니다. Cloudflare Tunnel?의 cloudflared?가 Cloudflare로 나가는 연결을 맺으니, 들어오는 방향은 모두 닫습니다.
Tunnel이 포트를 열지 않는 이유
cloudflared가 안에서 먼저 연 연결 위로 요청과 응답이 오갑니다.
- 방화벽은 cloudflared의 나가는 연결만 열어 둡니다(Cloudflare 7844 포트, TCP와 UDP).
- 서버에 공인 IP가 없어도 됩니다.
Tunnel 경로를 Access 앱보다 먼저 만들면 그 사이에 누구나 앱에 닿습니다. Access 앱을 먼저 만듭니다.
사무실 IP로만 막으면 안 되나요?
IP만으로는 «누구»인지 모릅니다. 같은 IP 뒤의 누구든 들어오므로 Access로 사람을 확인합니다.
IP 허용 목록에 Access를 더하는 이유
IP 허용 목록은 «어디서»만 봅니다. 같은 출구 IP 뒤라면 아래도 통과합니다.
- 같은 출구를 쓰는 방문객 Wi-Fi
- 악성 코드에 감염된 사내 PC
- 지금은 직원이 아닌 사람
IP 조건은 버리지 않고 Require에 남겨 «사무실에서, 우리 사람만»으로 겁니다.
| 액션 | 규칙 | 조건 |
|---|---|---|
| Allow | Include | 이메일 도메인 @example.com |
| Require | IP 범위 203.0.113.0/24 |
퇴사자는 IdP 계정을 막고 세션을 회수하면 IP와 상관없이 막힙니다.
함정: 가장 흔한 실수: «로그인만 하면 누구나»
Allow 정책에 Everyone이나 One-time PIN 전체를 넣으면 사실상 누구나 들어옵니다.
로그인 화면이 떠도 정책이 «누구를» 허용하는지가 전부입니다.
Include에 One-time PIN?을 넣고 이메일 도메인을 좁히지 않으면, 어떤 이메일로든 코드를 받아 들어옵니다.
허용 대상은 이메일 도메인이나 IdP 그룹으로 좁힙니다.
한눈에 보기
Access 앱과 정책을 먼저 만들어 시험하고 Tunnel 경로는 나중에 연결합니다. 정책은 Include(또는), Require(그리고), Exclude(제외)로 쓰고, 프로그램은 서비스 토큰?을 씁니다.
어떤 순서로 적용하나요?
다섯 단계입니다. Tunnel 경로는 정책을 시험한 뒤 마지막에 열어야 앱이 무방비로 열리는 틈이 없습니다.
다섯 단계
Zero Trust › Access › Applications › Add an application › Self-hosted

- 로그인 수단: 조직을 만들면 Cloudflare 계정 로그인이 기본으로 붙고, 회사 IdP나 One-time PIN을 더합니다.
- Access 앱과 정책: 정책이 없는 앱은 모든 요청을 거부합니다.
- 시험: Policy tester?로 누가 통과하는지 미리 봅니다.
- 연결: Tunnel 경로(published application route)를 만듭니다.
- 오리진 검증: Tunnel의 Protect with Access를 켜거나 앱이 토큰을 직접 검증하게 합니다.
정책은 어떻게 쓰고 평가되나요?
Include는 «또는», Require는 «그리고», Exclude는 «제외»입니다. Service Auth와 Bypass를 먼저 보고, Allow와 Block은 그다음입니다.
규칙 종류와 평가 순서
Zero Trust › Access › Policies › Add policy

| 칸 | 논리 | 쓰임 |
|---|---|---|
| Include | 또는(OR) | 들어올 수 있는 후보. 하나만 맞아도 후보 |
| Require | 그리고(AND) | 후보가 반드시 갖출 조건 |
| Exclude | 제외(NOT) | 맞으면 다른 조건과 상관없이 제외 |
모든 정책에는 Include가 하나 이상 있어야 합니다.
- 평가 순서: 각 묶음 안에서는 화면 위부터 보고, Allow나 Block에 맞으면 거기서 끝납니다.
- Block: Allow의 예외용입니다. 기본이 거부라 Block만 두면 의미가 없습니다.
- 2단계 인증: IdP가 알려 주는 인증 방식을 Require로 걸거나(지원 IdP만), Access가 직접 묻는 독립 MFA로 요구합니다.
Require에 값을 여러 개 넣으면 모두 «그리고»로 묶입니다. «한국 또는 미국»은 규칙 그룹을 Include로 만들고 Require에서 그 그룹을 부릅니다.
사람이 아닌 프로그램은 어떻게 들어오나요?
서비스 토큰?으로 들어옵니다. CI/CD?나 모니터링은 토큰 두 값을 헤더에 넣고, 정책 액션은 Service Auth?로 둡니다.
서비스 토큰
Zero Trust › Access controls › Service credentials › Service Tokens › Create Service Token
- 이름과 만료 기간(Service Token Duration)을 정합니다. Client Secret은 이때 한 번만 보여 줍니다.
- 정책 액션을 Service Auth로 둡니다. 다른 액션이면 IdP 로그인을 요구합니다.
- 출발지까지 묶으려면 Require에 IP 범위(예:
192.0.2.0/24)를 더합니다. - 프로그램은 두 값을 헤더에 넣어 보냅니다.
curl -H "CF-Access-Client-Id: <CLIENT_ID>" \
-H "CF-Access-Client-Secret: <CLIENT_SECRET>" \
https://app.example.comClient Secret은 비밀번호와 같습니다. 코드나 저장소에 그대로 두지 않습니다.
좌석은 언제 쓰이나요?
사용자가 Access에 인증하는 순간 좌석? 하나를 씁니다. 좌석이 다 차면 새로 로그인하려는 사용자가 막힙니다.
좌석 세는 법
| 일어난 일 | 좌석 |
|---|---|
| 사용자가 인증 이벤트를 일으킴 | 하나 씀 |
| 세션 회수(Revoke) | 그대로 |
| 사용자 제거 | 비워짐 |
| 제거한 사용자가 다시 인증 | 다시 씀 |
Zero Trust › Team & Resources › Users › 사용자 선택 › Action › Remove users
Free 플랜으로도 시작할 수 있고, 플랜별 좌석 수는 요금제와 계약에서 확인합니다.
외부인이 쓰는 화면(공개 문의 폼 등)에 Access 로그인을 걸면 로그인한 외부인마다 좌석을 씁니다.
함정: Access는 Cloudflare를 거친 요청만 지킵니다
Tunnel 없이 공개 IP로 열린 서버는 Access를 건너뛰고 직접 들어올 수 있습니다. 오리진이 토큰을 검증해야 합니다.
Access는 Cloudflare 엣지에서만 동작해, 오리진에 직접 온 요청은 만나지 못합니다.
- Tunnel로 연결: 방화벽의 들어오는 방향을 닫습니다.
- 토큰 검증: 오리진이 토큰 없는 요청을 거절합니다. Tunnel이면 Protect with Access로 cloudflared가 대신 검증합니다.
한눈에 보기
오리진은 서명이 검증된 토큰만 믿습니다. Cf-Access-Jwt-Assertion 헤더의 JWT?를 팀 도메인? 공개키로 검증하고, aud가 내 앱의 AUD 태그?인지 봅니다.
토큰은 무엇을 검증하나요?
서명, aud, iss, exp 네 가지가 모두 맞아야 통과입니다. 공개키는 팀 도메인의 /cdn-cgi/access/certs에서 받습니다.
검증할 것
| 항목 | 확인 |
|---|---|
| 서명 | https://<팀 이름>.cloudflareaccess.com/cdn-cgi/access/certs의 공개키로 검증 |
aud | 이 Access 앱의 AUD 태그와 같은가 |
iss | 팀 도메인(https://<팀 이름>.cloudflareaccess.com)인가 |
exp | 만료되지 않았나 |
- 토큰은 요청 헤더
Cf-Access-Jwt-Assertion으로 옵니다. 앱 도메인의CF_Authorization쿠키에도 들어 있습니다. - 서비스 토큰 요청은
sub가 빈 문자열이고, Client ID는common_name에 담깁니다.
서명을 검증하지 않고 헤더만 보면 누구나 같은 이름의 헤더를 만들어 보낼 수 있습니다.
앱 코드를 고치지 않고 검증할 수 있나요?
됩니다. Tunnel의 Protect with Access를 켜면 cloudflared가 오리진으로 넘기기 전에 Access 토큰을 검증합니다.
Protect with Access
원격 관리 터널은 경로의 Additional application settings에서, 설정 파일 터널은 originRequest에서 켭니다.
originRequest:
access:
required: true
teamName: <팀 이름>
audTag:
- <AUD 태그>- L7 요청마다 Access가 JWT를
Cf-Access-Jwt-Assertion헤더로 보내고, cloudflared가 검증합니다. - Access 앱이 보호하는 공개 호스트 이름 서비스에 겁니다.
오리진이 Tunnel 말고 다른 길로도 열려 있으면 그 길은 검증을 거치지 않습니다.
로그인 기록과 긴급 차단은 어디서 하나요?
로그인 기록은 Access authentication logs, 정책 결과는 Policy tester?에서 봅니다. 급할 때는 세션을 회수합니다.
확인 도구와 긴급 조치
| 하려는 일 | 어디서 |
|---|---|
| 로그인 기록 보기 | Zero Trust › Insights › Logs › Access authentication logs |
| 정책 미리 시험 | Zero Trust › Access controls › Applications › 앱 › Configure › Policies › Policy tester |
| 사용자 바로 내보내기 | IdP에서 계정을 막고 Users 화면에서 Revoke |
| 앱 하나의 세션 모두 끊기 | 앱 설정의 Revoke existing tokens |
- 요청 단위 Access 로그는 Enterprise 대시보드에서 보이고, Logpush로 내보낼 수 있습니다.
- Policy tester는 사용자 전체(마지막으로 본 신원과 단말 기준)나 한 사람에게 정책을 돌려 허용과 거부를 보여 줍니다.
- 시험 대상은 App Launcher나 다른 Access 앱에 한 번 이상 로그인한 사용자입니다.
- 회수 직후 최대 1분 동안 그 사용자는 다시 로그인하지 못합니다.
API와 기본 한도는 어떻게 되나요?
정책과 앱은 API나 Terraform으로 관리합니다. 계정 기본 한도는 앱 500개, 서비스 토큰 50개입니다.
API와 기본 한도
API 토큰 권한은 Access: Apps and Policies Write입니다.

서비스 토큰 정책을 만드는 예:
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "Authenticate service with service token",
"decision": "non_identity",
"include": [{"service_token": {"token_id": "<SERVICE_TOKEN_ID>"}}],
"require": [{"ip": {"ip": "192.0.2.0/24"}}]
}'| 화면 액션 | API decision |
|---|---|
| Allow | allow |
| Block | deny |
| Bypass | bypass |
| Service Auth | non_identity |
계정 기본 한도(Enterprise는 늘릴 수 있음):
| 항목 | 기본 한도 |
|---|---|
| Access 앱 | 500 |
| 서비스 토큰 | 50 |
| IdP | 50 |
| 앱당 규칙 | 1,000 |
함정: Bypass는 «기록도 없는 공개»입니다
Bypass로 연 경로에는 검사도 기록도 없습니다. 웹훅 하나 열려다 앱 전체를 여는 일이 생깁니다.
Bypass? 정책에는 이메일 같은 신원 조건도 쓸 수 없습니다.
- 공개할 경로만 따로 Access 앱(예:
app.example.com/oauth/callback)으로 만들어 거기에만 겁니다. - 기록이 필요한 기계 접근은 Service Auth와 서비스 토큰을 씁니다.
- 운영에 넣기 전에 시험합니다.
이 문서의 용어
- 서비스 토큰
- Service token · 사람이 아닌 프로그램용 자격 증명. Client ID 와 Client Secret 두 값으로 이루어집니다.
- 오리진
- Origin(원 서버) · Access 뒤에서 실제로 응답하는 앱 서버.
- 좌석
- Seat · Zero Trust 사용자 수 단위. 사용자가 인증하면 좌석 하나를 씁니다.
- 팀 도메인
- Team domain · Zero Trust 조직마다 정하는 <팀 이름>.cloudflareaccess.com 주소. 토큰 검증용 공개키를 이 주소에서 받습니다.
- Access
- Cloudflare Access · 앱 앞에서 요청마다 정책을 확인하는 신원 기반 프록시(identity-aware proxy).
- AUD 태그
- Application Audience tag(앱 대상 태그) · Access 앱마다 붙는 고유 값. 토큰이 이 앱용인지 확인할 때 씁니다.
- Bypass
- Bypass(우회) · Access 검사를 하지 않는 정책 액션. 요청 기록도 남지 않습니다.
- CI/CD
- Continuous Integration/Continuous Delivery(지속적 통합·배포) · 코드를 자동으로 빌드하고 배포하는 작업 흐름.
- Cloudflare Tunnel
- Cloudflare Tunnel · 서버 쪽 프로그램(cloudflared)이 Cloudflare 로 바깥 방향 연결을 맺어, 들어오는 포트 없이 서비스를 내보내는 방식.
- cloudflared
- cloudflared · Tunnel 연결을 만들고 유지하는 프로그램. 서버나 사내망 안의 컴퓨터에 설치합니다.
- IdP
- Identity Provider(신원 제공자) · 사용자 로그인을 맡는 서비스. Google, Microsoft Entra ID, Okta 같은 것입니다.
- JWT
- JSON Web Token · 서명된 토큰. Access 가 로그인한 사용자 정보를 담아 발급하고, 오리진이 서명을 검증합니다.
- MFA
- Multi-Factor Authentication(다중 인증) · 비밀번호에 더해 인증 앱이나 보안 키 같은 두 번째 수단을 확인하는 것.
- One-time PIN
- One-time PIN(일회용 PIN) · IdP 없이, 허용된 이메일 주소로 일회용 코드를 보내 로그인하게 하는 방식.
- Policy tester
- Policy tester(정책 시험기) · 정책이 어떤 사용자를 통과시키는지 미리 보여 주는 기능.
- Service Auth
- Service Auth · 사람 로그인 없이 서비스 토큰이나 mTLS 로 인증하는 정책 액션.
- VPN
- Virtual Private Network(가상 사설망) · 단말을 사내 네트워크에 붙여 주는 방식. 붙은 뒤에는 그 네트워크 안을 넓게 다닐 수 있습니다.
- Zero Trust
- Zero Trust(제로 트러스트) · 사내망 안에 있다고 믿어 주지 않고, 요청마다 신원과 맥락을 확인한 뒤 허용하는 보안 방식.