최소 TLS 1.2올리기 전에 누가 막히는지부터 셉니다
한눈에 보기
최소 TLS 버전?은 방문자와 Cloudflare 사이 연결의 하한선입니다. 1.2 로 올리면 1.0·1.1 클라이언트는 핸드셰이크?에서 끊기고 로그에도 남지 않으니, 먼저 세고 그다음 올립니다.
최소 TLS 버전은 어느 연결에 걸리나요?
방문자와 Cloudflare 사이 TLS? 연결에만 걸립니다. 오리진? 쪽은 암호화 모드?가 정합니다.
걸리는 곳과 안 걸리는 곳
| 구간 | 무엇이 정하나 |
|---|---|
| 방문자 ↔ Cloudflare | 최소 TLS 버전 |
| Cloudflare ↔ 오리진 | 암호화 모드(가능하면 Full (strict)) |
존의 프록시? 레코드 전체에 걸립니다. 프록시를 끈 레코드 같은 예외는 전문가 «이 설정이 닿지 않는 곳은 어디인가요?»에 있습니다.
왜 1.0·1.1 을 닫나요?
1.0·1.1 은 알려진 취약점이 있습니다. 카드 결제 보안 표준(PCI DSS?) v4.0 도 1.2 를 최소로 요구합니다.
왜 1.2 인가
- PCI DSS v4.0 요구사항 4.2.1 은 1.0·1.1 을 강한 암호로 인정하지 않습니다.
- TLS 1.3 은 PCI DSS 요구가 아닌 Cloudflare 권장이며, 모든 플랜에서 별도 스위치로 켭니다.
- 업데이트된 주요 브라우저는 모두 1.3 을 지원합니다.
올리면 누가 막히나요?
1.2 를 쓰지 못하는 클라이언트입니다. 오류 페이지 없이 클라이언트 쪽 연결 오류로 끝납니다.
막히는 쪽과 보이는 모습
- 오래 업데이트하지 않은 운영체제와 브라우저
- 결제 단말, 셋톱박스처럼 펌웨어를 잘 바꾸지 않는 장비
- 오래된 HTTP 라이브러리로 만든 연동 프로그램
핸드셰이크?에서 멈추므로 상태 코드도 없습니다.
로그는 요청이 프록시에 닿은 뒤에만 남아, 이 실패는 로그에 없습니다.
어떤 순서로 올리나요?
네 단계입니다. 분포를 세고, 1.0·1.1 쪽에 알리고, 올린 뒤 curl?로 막히는지 봅니다.
세고, 알리고, 올리고, 확인하기
- 셉니다. 버전별 요청 비율을 봅니다(중급 «TLS 버전 분포는 어디서 보나요?»).
- 알립니다. 1.0·1.1 비율이 0 이 아니면 그 클라이언트에 업데이트를 요청합니다.
- 올립니다. Minimum TLS Version 에서 TLS 1.2 를 고릅니다.
도메인 › SSL/TLS › Edge Certificates › Minimum TLS Version

- 확인합니다. 1.1 까지만 쓰는 접속은 실패하고 1.2 는 되는지 봅니다.
curl https://www.example.com -svo /dev/null --tls-max 1.1바꾸기 전에 지금 값을 적어 두고, 문제가 생기면 같은 화면에서 되돌립니다.
함정: 가장 흔한 착각: «로그에 없으니 아무도 안 막혔다»
올린 뒤 로그가 조용해도 아무도 막히지 않은 것은 아닙니다. 막힌 연결은 로그에 남지 않습니다.
핸드셰이크에서 실패한 연결은 요청 로그에도 보안 이벤트에도 없습니다.
- 영향은 올리기 전에 셉니다.
- 올린 뒤에는 고객 문의와 앱·장비 쪽 오류 기록을 봅니다.
한눈에 보기
올리기 전에 누가 1.0·1.1 을 쓰는지 셉니다. 분포는 세 곳에서 보고, 호스트별로 나눠 올리려면 ACM?이 필요합니다.
TLS 버전 분포는 어디서 보나요?
세 군데입니다. 계정 분석, 요청 로그, 규칙 필드가 방문자 쪽 TLS 버전을 보여 줍니다.
분포를 보는 곳
계정 › Observability › Analytics › Account analytics
| 어디 | 보이는 것 | 메모 |
|---|---|---|
| Network › Traffic Served Over SSL | 버전별 트래픽 비율 | 계정 전체 합계 |
요청 로그 ClientSSLProtocol | 요청마다 클라이언트 TLS 버전 | none 은 TLS 미사용 |
규칙 필드 cf.tls_version | 요청마다 Cloudflare 까지의 버전 | 예시 값 "TLSv1.2" |
- 요청 로그는 Logpush?로 받고, 받을 수 있는 데이터셋은 계정 제품에 따라 다릅니다.
- GraphQL? 데이터셋과 차원 이름은 짐작하지 말고 스키마 탐색(GraphiQL)으로 찾습니다.
1.0·1.1 로 들어오는 쪽은 누구인가요?
비율만 보고 올리지 않습니다. 1.0·1.1 요청의 호스트와 User-Agent?, 출발지로 대상을 적습니다.
대상 찾기
요청 로그에서 1.0·1.1 줄만 골라 셉니다.
- 호스트:
ClientRequestHost - 클라이언트:
ClientRequestUserAgent - 출발지:
ClientIP,ClientASN
규칙으로는 cf.tls_version 조건 커스텀 룰을 Log 액션으로 둡니다(Log 는 Enterprise 전용).
User-Agent 는 바꿀 수 있어 짐작에만 쓰고, 연락 대상은 출발지와 호스트로 좁힙니다.
올리기 전에 어떻게 시험하나요?
버전을 지정해 curl?로 접속합니다. 막히는 버전은 핸드셰이크? 오류로 끝납니다.
curl 로 확인
curl https://www.example.com -svo /dev/null --tls-max 1.1막히면 tlsv1 alert 가 든 오류가 납니다.
| 버전 | curl 옵션 |
|---|---|
| 1.0 | --tlsv1.0 --tls-max 1.0 |
| 1.1 | --tlsv1.1 --tls-max 1.1 |
| 1.2 | --tlsv1.2 --tls-max 1.2 |
| 1.3 | --tlsv1.3 --tls-max 1.3 |
회사 VPN 이나 단말 보안 프로그램이 먼저 막을 수 있으니, 없는 곳에서 시험합니다.
외부 시험 도구(SSL Labs Server Test)로도 봅니다.
존 전체로 올리나요, 호스트별로 올리나요?
대시보드 설정은 존 전체에 하나입니다. 호스트마다 다르게 두려면 ACM?과 API 가 필요합니다.
적용 범위
| 범위 | 어디서 | 조건 |
|---|---|---|
| 존 전체 | 대시보드, API | 모든 플랜 |
| 호스트별 | API 만 | ACM(유료 부가 기능) |
| SaaS 사용자 지정 호스트? | 호스트 설정 | 없으면 존 값 |
- 값은 1.0 부터 1.3 까지 넷이고, 바꾸지 않은 존은 1.0 입니다.
- ACM 이 없으면 날짜를 정해 존 전체를 올립니다.
- 1.1 을 거쳐 올리면 1.0 전용 클라이언트부터 걸러 냅니다.
함정: 1.3 스위치와 «최소 1.3»은 다른 설정입니다
TLS 1.3 스위치와 최소 1.3 은 서로 다른 설정입니다. 최소를 1.3 으로 올리면 1.2 클라이언트까지 막습니다.
TLS 1.3 을 켜면 지원하는 클라이언트만 1.3 을 쓰고, 1.2 클라이언트는 그대로입니다. 1.2 로 올릴 때 바꿀 것은 Minimum TLS Version 하나입니다.
한눈에 보기
설정은 API 한 줄이고, 확인은 방문자 쪽과 오리진 쪽을 나눠 합니다. 로그에 두 구간 버전이 따로 찍히고(ClientSSLProtocol·OriginSSLProtocol), 장애도 상태 코드 유무로 구간이 갈립니다.
API 로 어떻게 바꾸고 되돌리나요?
존 값은 min_tls_version 을 PATCH 합니다. 호스트별 값은 ACM 이 있을 때 PUT 으로 넣고 DELETE 로 지웁니다.
API
존 전체(권한 Zone Settings Write):
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/min_tls_version" --request PATCH --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" --json '{"id": "min_tls_version", "value": "1.2"}'호스트별(ACM, 권한 SSL and Certificates Write):
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/hostnames/settings/min_tls_version/$HOSTNAME" --request PUT --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" --json '{"value": "1.2"}'- 어느 값이 걸리는지는 호스트 우선순위 규칙이 정합니다.
되돌리기도 같은 호출이니, 지금 값과 되돌릴 명령을 먼저 적어 둡니다.
두 구간은 로그에서 어떻게 따로 읽나요?
요청 로그에 방문자 쪽 ClientSSLProtocol 과 오리진 쪽 OriginSSLProtocol 이 따로 있고, 최소 TLS 는 앞쪽만 바꿉니다.
로그 필드
| 필드 | 구간 | 뜻 |
|---|---|---|
ClientSSLProtocol | 방문자 ↔ Cloudflare | 클라이언트 TLS 프로토콜(none 은 미사용) |
ClientSSLCipher | 방문자 ↔ Cloudflare | 클라이언트 암호 |
OriginSSLProtocol | Cloudflare ↔ 오리진 | 오리진 연결의 TLS 프로토콜 |
- 오리진 쪽 버전은 오리진 서버 설정이 정합니다.
- Logpush?는 모든 플랜에서 씁니다.
핸드셰이크에서 끊긴 연결은 로그 줄이 없어 두 필드 어디에도 없습니다.
접속 장애 신고는 구간별로 어떻게 가르나요?
상태 코드로 가릅니다. 최소 TLS 로 막히면 상태 코드가 없고, 525·526 이 보이면 오리진 쪽입니다.
증상으로 구간 가르기
| 증상 | 구간 | 먼저 볼 것 |
|---|---|---|
| 연결 오류, 상태 코드 없음 | 방문자 ↔ Cloudflare | 클라이언트 TLS 버전과 최소 TLS 설정 |
| 525 | Cloudflare ↔ 오리진 | Full 모드에서 오리진이 443 HTTPS 와 인증서를 내주는지 |
| 526 | Cloudflare ↔ 오리진 | Full (strict) 에서 인증서 만료, 발급자, 이름 요건 |
- 최신 브라우저는 되고 특정 단말만 실패하면 최소 TLS 를 의심합니다. 그 단말 버전으로
curl --tls-max를 지정해 재현합니다.
이 설정이 닿지 않는 곳은 어디인가요?
프록시를 끈 레코드, R2 사용자 지정 도메인, Pages 기본 주소입니다. 존 값만 바꿨다고 끝나지 않습니다.
예외 목록
| 대상 | 동작 |
|---|---|
| 프록시를 끈 레코드 | 오리진 서버 설정을 따름 |
| R2 사용자 지정 도메인 | R2 쪽에서 지정 |
Pages 기본 주소(*.pages.dev) | 최소 TLS 와 암호 목록 변경 불가 |
| SaaS 와일드카드 사용자 지정 호스트 | 직접 만든 호스트만 호스트 값, 나머지는 존 값 |
Pages 결제 페이지는 내 존에 붙인 사용자 지정 도메인으로 서비스해야 존 설정이 걸립니다.
함정: 프록시를 끈 호스트는 존 설정 밖입니다
존을 1.2 로 올렸는데 외부 점검에 1.0 이 보이면 그 호스트는 프록시가 꺼져 있을 수 있습니다.
프록시를 끈 레코드는 방문자가 오리진에 바로 붙어 오리진의 TLS 설정이 보입니다.
- 1.0 이 보인 호스트는 프록시 상태부터 봅니다.
- 프록시를 켤 수 없으면 오리진 서버에서 1.0·1.1 을 끕니다.
이 문서의 용어
- 사용자 지정 호스트
- Custom hostname · Cloudflare for SaaS 로 내 존에 붙인 고객사 도메인. 호스트마다 최소 TLS 버전을 따로 둘 수 있습니다.
- 암호화 모드
- SSL/TLS encryption mode · Cloudflare 가 오리진에 HTTP 로 붙을지 HTTPS 로 붙을지, 인증서를 검증할지 정하는 존 설정.
- 오리진
- Origin(원 서버) · Cloudflare 뒤에서 실제로 응답을 만드는 서버.
- 최소 TLS 버전
- Minimum TLS Version · 이 버전보다 낮은 TLS 로 들어오는 방문자 연결을 Cloudflare 가 받지 않는 하한선.
- 프록시
- Proxied(주황 구름) · DNS 레코드의 트래픽이 Cloudflare 를 거치는 상태. 최소 TLS 버전은 이 레코드에만 걸립니다.
- 핸드셰이크
- TLS handshake(TLS 연결 협상) · 암호화 연결을 시작할 때 버전과 암호를 서로 맞추는 첫 단계. 여기서 실패하면 HTTP 요청이 만들어지지 않습니다.
- ACM
- Advanced Certificate Manager(고급 인증서 관리) · 유료 부가 기능. 호스트별 최소 TLS 버전과 암호 목록 지정이 들어 있습니다.
- curl
- curl(명령줄 HTTP 도구) · 터미널에서 TLS 버전을 지정해 접속해 볼 수 있습니다.
- GraphQL
- GraphQL Analytics API(분석 조회 API) · 대시보드 분석과 같은 데이터를 쿼리로 가져오는 API.
- Logpush
- Logpush(로그 내보내기) · 요청 로그를 저장소나 분석 도구로 보내는 기능.
- PCI DSS
- Payment Card Industry Data Security Standard(카드 결제 보안 표준) · v4.0 은 TLS 1.2 를 최소로 요구합니다.
- TLS
- Transport Layer Security(전송 계층 보안) · 브라우저와 서버 사이 연결을 암호화하는 규약. 숫자가 클수록 새 버전입니다.
- User-Agent
- User-Agent(사용자 에이전트) · 요청이 스스로 밝히는 클라이언트 이름. 누구나 바꿀 수 있습니다.