-
iOS - URL과 ATSProgramming/iOS 2022. 3. 6. 04:00
안녕하세요 BeePeach입니다 :)
이번에는 네트워크에 대해서 공부해보려고 하는데요.
네트워크를 통해 데이터를 가져올 때 꼭 필요한 게 바로 URL입니다.
URL
Uniform Resource Locator의 약자입니다.
자세히 들어가면 많은 내용이 있지만 간단하게 리소스의 위치를 나타내는 것이라고 생각하면 됩니다.
iOS에서는 URL을 이용해서 네트워크를 통해 데이터를 가져오기도하고 내부 디렉토리와 파일에 접근합니다.
URL 구조
URL의 구조는 이렇게 생겼습니다.
Protocol
맨 앞에 http는 프로토콜입니다. http와 https가 무엇인지는 뒤에서 설명하겠습니다.
이 URL에서는 http 프로토콜을 사용하겠다고 먼저 명시한 것입니다.
Domain
도메인은 숫자로 표현된 IP주소를 사용자들이 쉽게 기억하도록 만든것입니다.
IP주소는 125.209.222.141 이런 식으로 되어있습니다.
우리가 이걸 보고 아 이게 네이버구나? 하고 바로 알기는 힘들죠?
하지만 music.naver.com이면 우리가 알기 쉬워집니다.
Path
Domain뒤에 /(slash)로 시작합니다.
리소스의 경로를 나타내는데요. 디렉터리의 경로를 떠올리면 이해하기 쉽습니다.
QueryString
Parameter라고도 불립니다.
Path뒤에 ?로 시작합니다. 그리고 key와 value로 이루어져 있습니다.
여러 개의 파라미터가 들어갈 수 있고 각각의 파라미터는 &로 구분합니다.
위 예에서는 domain이라는 key에 OVERSEA라는 value와 duration이라는 key에 1h라는 value가 들어간 파라미터가 2개 전달되는 것입니다.
URL 구조체
우리가 알아보았던 URL을 인스턴스화 한 게 바로 URL 구조체입니다.
생성자는 매우 매우 많은데요.
주로 String으로 URL 인스턴스를 생성하는 init?(string:)을 이용합니다.
String으로 된 url을 이용해서 URL 인스턴스를 생성했습니다.
해당 init은 failable이기 때문에 리턴형이 옵셔널입니다.
URL에서 제공하는 프로퍼티로 우리가 위에서 공부한 구조들을 얻어올 수 있습니다.
HTTP와 HTTPS
HTTPS는 Hyper Text Transfer Protocol Secure의 약자입니다.
서로 다른 시스템 사이에서 네트워크를 통해서 데이터를 주고받을 때 중구난방으로 아무렇게나 데이터를 보내면 안 되겠죠?
HTTPS는 www에서 데이터를 주고받기 위한 규약입니다.
간단하게 Reqeust와 Response로 구분할 수 있습니다.
이 개념은 이후에 URLSession을 이용해서 API 통신을 할 때 사용하니까 기억해 두시면 좋습니다.
HTTPS는 뒤에 Secure에 붙어있으니 보안과 관련이 있습니다.
HTTP를 이용하면 주고받는 데이터가 변경 없이 담겨있습니다.
그래서 만약 중간에 데이터를 가져간다면 그대로 노출됩니다.
이 데이터에 아이디, 비밀번호 등 개인정보가 담겨있다면 좋지 않겠죠?
HTTPS는 데이터를 암호화시켜서 중간에 훔쳐가도 이 데이터를 해독할 수 없게 해 줍니다.
위 구조에서는 http를 사용하고 있는데 요즘에는 대부분 https를 사용합니다.
그리고 iOS에서 http를 사용하면 안 되는 이유가 또 있습니다!
ATS
ATS란 Apple Transport Security 또는 App Transport Security의 약자입니다.
iOS 9.0에서부터 도입된 보안 기능인데요.
이게 왜 HTTP와 관련이 있느냐!
ATS는 보안성 관련 문제로 안전하지 않은 연결은 허용하지 않습니다.
그래서 HTTP 프로토콜을 사용한 URL을 사용하면 에러가 발생하게 됩니다.
한번 사용해보도록 할까요??
이렇게 WebKitView를 추가해주고 간단하게 http://apple.com를 load 해봤습니다.
엥 잘 나오네요..?
apple 사이트는 유일하게 http로 가져와도 에러가 안 나게 설정되어있습니다.
그럼 한번 url을 다른 사이트로 변경해보겠습니다.
http://www.naver.com으로 변경해보겠습니다.
어라..?
왜 잘 나오지?? 원래는 이런 에러가 나야 하는데 안 나네요..
이전에는 이렇게 ATS 정책에 따라서 secure connection으로 연결해야 한다는 에러가 나타났는데 오랜만에 다시 해보니 안 나네요...
이 부분은 이후에 다시 수정해보겠습니다.
아무튼! 다시 돌아와서 이렇기 때문에 ATS에 대해서 간단하게라도 알고 있는 게 좋습니다.
ATS 설정하기
ATS는 info.plist에서 설정할 수 있습니다.
info.plist에서 App Transport Security Settings 키를 추가해주세요.
하위 설정을 보면 이렇게 여러 개의 키가 존재합니다.
- Allow Arbitrary Loads를 True로 설정하면 http로도 연결이 가능해집니다.
- Exception Domains는 예외 domain을 설정합니다.
둘의 차이는 Allow Arbitrary Loads는 모든 연결에 대해서 보안설정을 해제하는 것이고 Exception Domains는 특정 도메인에 대해서만 해제하는 것입니다.
Exception Domains를 이용해 이렇게 특정 도메인만 예외로 처리해주는데 주의할 점은 Type이 Dictionary여야 합니다.
그리고 하위 key로 NSExceptionAllowsInsecureHTTPLoads를 True로 해주면 해당 도메인에 포함된 서브도메인들에게도 예외처리가 적용됩니다.
이렇게 ATS에 대해서 간단하게 알아보았는데요.
사실 더 많은 기능들이 있지만 여기서는 생략하도록 하겠습니다.
가장 주의할 점은 ATS설정을 변경하게 되면 앱 심사과정에서 리젝을 당할 수 있기 때문에 만약 설정을 변경한다면 왜 변경했는지 꼭 설명을 해주어야 합니다.
마무리
오늘은 이렇게 URL과 ATS에 대해서 공부해봤습니다.
다음 포스팅에서는 URL을 가지고 데이터를 가져오는 방법에 대해서 공부해보도록 하겠습니다.
참고자료
https://developer.apple.com/kr/security/
https://developer.apple.com/documentation/foundation/url
https://developer.mozilla.org/ko/docs/Learn/Common_questions/What_is_a_URL
728x90'Programming > iOS' 카테고리의 다른 글
iOS - Project의 Storyboard 삭제하기 (0) 2022.03.12 iOS - URLSession과 URLSessionTask (0) 2022.03.09 CI/CD - 입문하기 쉬운 Bitrise 사용해보기 (0) 2022.03.03 iOS - Cell안에 delegate를 두 객체에 연결하는 방법? (0) 2022.02.16 iOS - UIScrollView 사용하기 (0) 2022.01.31