URLSessionConfiguration의 모든 것: 캐싱, 타임아웃, 그리고 보안 설정

작성일 :

URLSessionConfiguration의 모든 것: 캐싱, 타임아웃, 그리고 보안 설정

Swift 개발 환경에서 네트워크 작업을 효율적으로 처리하기 위해 URLSessionConfiguration을 사용하는 방법을 다룬다. 이 글에서는 캐싱, 타임아웃, 그리고 보안 설정을 중심으로 설명하며, 이를 통해 최적화된 네트워크 성능과 보안을 갖춘 앱을 개발하는 방법을 알아본다.

URLSessionConfiguration 개요

URLSessionConfiguration은 Swift에서 네트워크 관련 설정을 관리하는 핵심 객체다. 이는 기본적으로 세 가지 구성 옵션을 제공한다:

  • default: 일반적인 네트워크 작업을 위한 기본 설정.
  • ephemeral: 데이터 저장을 하지 않는 임시 세션. 쿠키, 캐시 등이 유지되지 않는다.
  • background: 백그라운드에서 네트워크 작업을 수행할 때 사용하는 설정.

각 세션 구성은 특정 사용 사례에 최적화되어 있으며, 사용자 요구에 따라 설정을 변경할 수 있다. 이러한 구성 옵션을 제대로 이해하고 적절히 사용하는 것이 중요하다.

캐싱 설정

캐싱은 네트워크 요청의 효율성을 높이는 중요한 요소다. URLSessionConfiguration에서는 캐싱을 URLCache를 통해 설정할 수 있다.

swift
let config = URLSessionConfiguration.default
let cache = URLCache(memoryCapacity: 512000, diskCapacity: 10240000, diskPath: "myCache")
config.urlCache = cache
config.requestCachePolicy = .useProtocolCachePolicy

memoryCapacitydiskCapacity는 각각 메모리와 디스크에 저장할 수 있는 캐시의 용량을 정의한다. 위 예제에서는 메모리에 512KB, 디스크에 10MB의 캐시 용량을 설정하였다. requestCachePolicy는 다양한 캐시 정책 옵션을 제공한다. 예를 들어, .useProtocolCachePolicy는 기본 프로토콜 캐시 정책을 따른다.

캐시 정책 옵션

  • .useProtocolCachePolicy: 기본 캐시 정책을 따른다.
  • .reloadIgnoringLocalCacheData: 캐시를 무시하고 항상 원본 데이터를 요청한다.
  • .returnCacheDataElseLoad: 캐시 데이터가 없으면 원본 데이터를 요청한다.
  • .returnCacheDataDontLoad: 캐시 데이터가 없으면 실패한다.

각 정책은 특정 상황에 적합하게 사용할 수 있게 해 주며, 올바른 캐시 정책을 선택하는 것이 네트워크 성능을 최적화하는 데 중요하다.

타임아웃 설정

타임아웃 설정은 네트워크 요청의 대기 시간을 관리하는 데 유용하다. 기본적으로 세 가지 타임아웃 설정을 제공한다:

  • timeoutIntervalForRequest: 개별 요청이 완료될 때까지의 시간.
  • timeoutIntervalForResource: 모든 리소스를 다운로드할 때까지의 시간.
  • waitsForConnectivity: 네트워크 연결을 기다릴지 여부.
swift
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30.0
config.timeoutIntervalForResource = 60.0
config.waitsForConnectivity = true

위 설정은 개별 요청에 대해 최대 30초, 모든 리소스 다운로드에 대해 60초의 시간을 부여하고, 네트워크 연결이 없을 경우 기다리도록 한다.

보안 설정

URLSessionConfiguration은 보안 설정도 제공한다. 가장 중요한 설정 중 하나는 tlsMinimumSupportedProtocol이다. 이를 통해 지원할 최소 TLS 프로토콜 버전을 설정할 수 있다.

swift
let config = URLSessionConfiguration.default
config.tlsMinimumSupportedProtocol = .TLSv12

TLSv1.2 이상만을 지원하도록 설정하면, 더 강력한 보안 연결을 확보할 수 있다. 또한, HTTP 헤더에 보안 설정을 추가할 수도 있다.

swift
var headers: [String: String] = [:]
headers["Content-Security-Policy"] = "default-src 'self';"
headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"
config.httpAdditionalHeaders = headers

위 코드에서는 Content-Security-PolicyStrict-Transport-Security 헤더를 추가하여 보안을 강화하였다.

인증 및 자격 증명

네트워크 요청에서 필요할 경우, 사용자 자격 증명도 설정할 수 있다. 이를 위해 URLCredential 객체를 사용한다.

swift
let user = "username"
let password = "password"
let credential = URLCredential(user: user, password: password, persistence: .forSession)
let protectionSpace = URLProtectionSpace(host: "example.com", port: 443, protocol: "https", realm: nil, authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
URLCredentialStorage.shared.setDefaultCredential(credential, for: protectionSpace)

이러한 설정은 네트워크 요청이 인증된 상태에서 이루어지도록 한다. URLCredentialPersistence 옵션을 통해 자격 증명 저장 방식을 선택할 수 있다.

결론

URLSessionConfiguration을 통해 캐싱, 타임아웃, 보안 설정을 최적화하면 네트워크 작업의 성능과 안전성을 크게 향상시킬 수 있다. 이 글에서 다룬 다양한 설정 옵션을 이해하고, 올바르게 적용하여 더욱 완성된 Swift 애플리케이션을 개발해보자.