SwiftUI를 이용해서 Web에 있는 JSON API를 호출할 때 다음과 같은 코드를 사용한다.
class WebService {
func fetchData(url: String) async throws -> [Person] {
guard let url = URL(string: url) else { return [] }
let (data, _) = try await URLSession.shared.data(from: url)
let nkdata = try JSONDecoder().decode([Person].self, from: data)
return nkdata
}
}
하지만 학습하거나 테스트를 할 때 종종 우리는 에러를 마주하곤한다.
내가 학습하면서 확인한 에러는 다음과 같았다. 나는 정부에서 제공해주는 공공 데이터 서비스를 정식 절차를 거쳐서
인증키를 발급받아 Web Api 데이터에 접근했고 이를 SwiftUI에서 호출할 때 아래와 같은 에러를 마주했다.
Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server."
아래는 WebApi 호출 결과 받아온 error 문구이다.
HTTP load failed, 0/0 bytes (error code: -1004 [1:61])
이 에러가 왜 발생하는지 알기위해서는 먼저 HTTP / HTTPS가 무엇인지부터 확인해야한다.
1. HTTPS / HTTP
HTTP는 Hypertext Transfer Protocol의 약자다. Hypertext를 전송하기 위한 통신규약을 말하는데, 여기서 Hypertext는 흔히 HTML을 말한다. 즉, HTML을 전송하기 위해서 따라야하는 통신 규약을 의미한다는 것이다.
HTTPS는 HTTP에 S라는 글자가 붙으면서 쉽게말해 Secure 즉, 보안을 뜻한다. 직관적으로 얘기하면 HTTP에 보안이 강화된 통신 규약을 의미한다. HTML은 SSL이라는 인증서를 필요로하게 되는데, 이 인증서는 정말로 정말로 정말로 중요한 보안 문서이다.
여기서 알아야할 점은 HTTP 프로토콜을 이용해서 HTML을 제공해주는 사이트가 있다는 것과 보안인증서가 포함되어 보안이 강화된 HTTPS 프로토콜을 이용해서 HTML을 제공해주는 사이트가 있다는 것이다.
- 왜 모두 HTTPS를 쓰지 않냐고 의문이 들 수 있지만, 쓰지 않는 것이 아니라 못하는 것이다...
자세한 이야기는 https://www.ssl.com/ko/자주-묻는-질문/인증-기관이란-무엇입니까/ 참고하시길...
2. ATS
ATS는 App Transport Security의 약자다. iOS 9에서 도입된 개인 정보 보호 기능이다. 이 기능은 Xcode 프로젝트가 생성되면 기본적으로 사용 설정이되고, 보안 연결을 적용한다.
애플에서는 기본적으로 암호화되지 않은 정보 HTTP를 허용하지 않는다. 따라서 HTTPS를 사용 권장한다.
ATS를 수정하면 HTTP 접속을 허용할 수 있지만 앱 심사에는 통과되지 못할 가능성이 있기 때문에 개발 테스트 중 외에는 권장하지 않는다.
ATS를 수정한다면, 정당한 이유가 있어야한다.
3. ATS 수정방법
ATS를 수정하면 앱 심사에는 통과되기 어렵겠지만 테스트, 학습을 위해서라면 일시적으로 HTTP 접속을 허용해도 되지 않을까?
다음은 HTTP 접속을 허용하기 위한 수정방법이다.
수정방법을 찾으면서 코드로 된 블로그 포스팅이 많아서 나는 수정하는데 오래걸렸다. 따라서 차근차근 직관적으로 설명하겠다.
1. 먼저 프로젝트 파일을 클릭하고 TARGETS에 있는 본인 프로젝트를 클릭한다.
2. 중앙 상단부분을 보면 위와 같은 메뉴들이 있을 텐데, Info를 선택해준다.
3. 중앙 Custom iOS Target Properties 목록들이 보이는가? 아무 곳을 클릭한 후 '+' 버튼을 눌러준다.
4. '+' 버튼을 누르면 목록이 뜰텐데 알파벳 순으로 정렬되어있다. 여기서 App Transport Security Settings를 선택해준다.
5. App Transport Security Settings를 추가해줬으면 왼쪽에 '>' 버튼을 눌러서 펼치기를 해준다. 아무 변화가 없이 화살표가 아래를 향하고만 있을 것이지만 그것이 정상이다. 화살표가 아래를 향한다면 다시 '+' 버튼을 클릭해서 Allow Arbitrary Loads를 추가해준다.
6. 이제 Allow Arbitrary Loads의 오른쪽 'NO' 값을 'YES'로 변경해준다.
이로서, 이제 HTTP 통신이 가능해진다.
4. HTTP Web 데이터 사용하기
내가 원하는 데이터가 HTTP Web Api 라면, 이를 활용해 앱을 출시하는 것은 어려울 것이다. 그렇다면 나는 이 데이터를 활용한 앱을 만드는 것을 포기해야하는 것일까?
확인해보니, HTTP Web Api인 경우, 보안문제도 있을 뿐더러 애초에 다량의 트래픽 이슈로 인해서 앱을 운영하기 위한 별도의 서버를 둔다고 한다. 따라서 데이터를 제공해주는 사이트에 직접적으로 모든 사용자들이 데이터를 요청하는 것이 아닌, 앱 배포를 위한 별도의 서버에 사용자들이 데이터를 요청하게 된다.
데이터 제공 사이트 ---- 배포 서버 ---- 사용자
이와 같은 구조로 데이터가 주고받게 되며, 그러면 배포 서버를 HTTPS 통신이 가능하도록 구축하면 앱은 ATS 정책을 위반하지도 않고,
사용자가 앱을 사용하는 동안 트래픽 이슈도 수월하게 해결될 것이다.
'SwiftUI' 카테고리의 다른 글
SwiftUI Firebase Email Auth Login 구현하기 (0) | 2022.12.23 |
---|---|
SwiftUI Firebase Auth - Google Account 연동하기 (0) | 2022.12.23 |
SwiftUI Firebase Realtime Database CRUD 제대로 사용하기 (12) | 2022.12.08 |
SwiftUI 문서 구조화 해보기 - 초급 (0) | 2022.11.07 |
ViewModifier를 어떻게 쓸 수 있을까 (0) | 2022.10.26 |