설명
Foundation의 URLSessionConfiguration 또는 Security 프레임워크의 프로토콜 옵션에서 TLS 1.0이나 TLS 1.1을 최소 버전으로 설정하면 레거시 피어와 해당 프로토콜을 협상할 수 있습니다. 최대 버전을 TLS 1.0이나 TLS 1.1로 설정하면 TLS 1.2와 TLS 1.3을 사용할 수 없게 됩니다.
IETF BCP 195의 RFC 8996은 TLS 1.0과 TLS 1.1을 사용하지 말아야 한다고 규정합니다. 이 버전들은 최신 권장 암호 스위트와 AEAD를 충분히 지원하지 않고, 핸드셰이크 무결성이나 피어 인증에 SHA-1 기반 메커니즘을 의존하는 등의 한계가 있습니다. 다만 낮은 최소 버전을 설정했다는 사실만으로 특정 연결이 실제로 구식 버전을 협상했거나 공격자가 다운그레이드를 강제했다는 사실까지 입증되지는 않습니다. 서버 지원 버전과 실제 네트워크 경로도 함께 확인해야 합니다.
Apple 플랫폼의 현재 기본값
- Apple은 iOS 15, iPadOS 15, macOS 12, watchOS 8, tvOS 15부터 TLS 1.0과 TLS 1.1을 더 이상 사용하지 않는 버전으로 분류했습니다.
- iOS 26 또는 macOS 26 이후에 링크된 앱에서는
URLSession과 Network 프레임워크의 기본 TLS 최소 버전이 1.0에서 1.2로 변경되었습니다. - App Transport Security(ATS)가 적용되는
URLSession연결은 기본적으로 서버의 TLS 1.2 이상 지원을 요구합니다. ATS 예외를 추가하면 이 보호가 약해질 수 있습니다. - Apple의 2026년 플랫폼 보안 문서는 운영체제가 TLS 1.0과 TLS 1.1도 지원한다고 명시합니다. 따라서 구식 버전을 명시적으로 설정하거나 이전 링크 환경을 사용하는 경우에는 현재 OS에서도 앱의 명시적인 TLS 설정을 검토해야 합니다.
모든 Apple OS 기본값이 항상 동일하다고 가정하지 말고, 앱의 링크 대상, 최소 배포 버전, ATS 예외, 사용하는 네트워크 API를 함께 검토해야 합니다.
잠재적 영향
- 레거시 피어와 연결할 때 TLS 1.0/1.1의 오래된 암호 기능이 사용되어 통신 보호가 약해질 수 있습니다.
- 최대 버전을 1.0/1.1로 제한하면 현대적인 TLS만 허용하는 서버와 연결되지 않거나, 애플리케이션이 구식 서버에 계속 의존하게 됩니다.
- 규정 준수 또는 조직 보안 정책에서 요구하는 TLS 1.2 이상 기준을 충족하지 못할 수 있습니다.
해결 방법
- TLS 1.0/1.1 설정을 제거하거나 최소 버전을
tls_protocol_version_t.TLSv12로 설정합니다. 필요한 모든 피어가 지원한다면 TLS 1.3을 우선합니다. - 최대 버전을 TLS 1.2 미만으로 제한하지 않습니다. 특별한 상호 운용성 요구가 없다면 최대 버전을 설정하지 않아 새 프로토콜도 협상할 수 있게 합니다.
- 새 코드에서는
tlsMinimumSupportedProtocolVersion과sec_protocol_options_set_min_tls_protocol_version을 사용하고, 더 이상 사용되지 않는SSLProtocol속성이나sec_protocol_options_set_tls_min_version함수는 추가하지 않습니다. - 애플리케이션 전체 정책을 낮추지 말고 레거시 피어를 업데이트하거나 격리된 전용 연결로 분리합니다. 예외에는 소유자, 만료일, 허용 대상을 기록합니다.
- 배포된 클라이언트와 서버를 함께 테스트하여 실제 엔드포인트에서 TLS 1.2/1.3만 협상되는지 확인합니다.
예시
변경 전
import Foundation
import Security
import class Foundation.URLSessionConfiguration
func configureLegacyTLS(
_ configuration: Foundation.URLSessionConfiguration
) {
configuration.tlsMinimumSupportedProtocolVersion = .TLSv10
configuration.tlsMaximumSupportedProtocolVersion = .TLSv11
}
최소 버전은 TLS 1.0을 허용하고 최대 버전은 TLS 1.1로 제한하므로, 이 구성은 TLS 1.2나 TLS 1.3을 협상할 수 없습니다.
변경 후
URLSession
import Foundation
import Security
let configuration = URLSessionConfiguration.default
configuration.tlsMinimumSupportedProtocolVersion = .TLSv12
// 최대 버전은 설정하지 않아 TLS 1.3 같은 최신 버전도 허용합니다.
let session = URLSession(configuration: configuration)
Network 프레임워크
import Network
import Security
let tlsOptions = NWProtocolTLS.Options()
sec_protocol_options_set_min_tls_protocol_version(
tlsOptions.securityProtocolOptions,
.TLSv12
)
let parameters = NWParameters(tls: tlsOptions)
TLS 1.2를 호환 가능한 최소값으로 설정하고 최대값을 열어 두면, 피어가 지원할 때 TLS 1.3을 협상할 수 있습니다. TLS 버전 정책과 별도로 인증서 체인 및 호스트 이름 검증도 유지해야 합니다.
참조
- Apple:
URLSessionConfiguration.tlsMinimumSupportedProtocolVersion - Apple: Security framework TLS protocol options
- Apple:
sec_protocol_options_set_min_tls_protocol_version - Apple: TLS 1.0 및 1.1 사용 중단 안내
- Apple: macOS 26 릴리스 노트
- Apple Platform Security: TLS security
- CodeQL: Insecure TLS configuration
- RFC 8996: Deprecating TLS 1.0 and TLS 1.1
- NIST SP 800-52 Rev. 2
- CWE-757: Selection of Less-Secure Algorithm During Negotiation
- OWASP Top 10:2025 A04 Cryptographic Failures