작년 9월. 그러니까 2015년 9월 이었을까. iOS9에 대한 대응책에 대하여 올라왔었다.
그중에 IPv6 적용에 대해 이야기가 나왔었는데 2016년 6월 1일부터 등록되는 앱에 관해 IPv6 대응을 하지 않으면
검수에서 통과하지 못한다는 이슈가 있다.
이미 애플에는 아래와 같은 뉴스가 올라와 있다.
내용은 뭐 2015년 WWDC때 iOS9 부터 IPv6 대응을 사용해야 한다고 말해왔다.
2016년 6월 1일 부터 앱스토어에 올리는 앱은 IPv6를 지원 해야 한다.
NSURLSession이나 CFNetwork API는 이미 IPv6를 지원하고 있으니 대부분의 앱은 수정이 필요없을 거다.
하드코딩된 IPv4를 사용하는경우는 지원 IPv6를 DNS64 / NAT64 네트워크를 읽어 호환성을 보장해야한다.
Supporting IPv6-only Networks
May 4, 2016
At WWDC 2015 we announced the transition to IPv6-only network services in iOS 9. Starting June 1, 2016 all apps submitted to the App Store must support IPv6-only networking. Most apps will not require any changes because IPv6 is already supported by NSURLSession and CFNetwork APIs.
If your app uses IPv4-specific APIs or hard-coded IP addresses, you will need to make some changes. Learn how to ensure compatibility by reading Supporting IPv6 DNS64/NAT64 Networks and watch Your App and Next Generation Networks.
애플에서 IPv6지원에 대한 예시 및 테스트 방법은 이미 작년부터 제공했었다. 아래 페이지 참조.
https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1
영어라서 읽고 싶어도 못잀고 또 읽기도 싫고, 번역기 돌려보면 이상한 잡소리인 것 같고... 이래서 수정해야 할 점들을 간략하게 정리해 본다.
일단 요점!!!
iOS9에서는 DNS64/NAT64 라고 하는 기술로 구축된 IPv6베이스 네트워크로 앱이 동작하도록 할 필요가 있다... 가 중요 포인트 이고 그니까 수정 안하면 리젝이요... 라고 말하는게 요점이다.
요점을 풀어서 요약을 해본다.
• iPhone에 IPv6 통신 환경 만 제공하는 통신 사업자가 향후 등장한다.(우리나라는 늦겠지???)
• 기존의 IPv4 호스트와 통신하려고하면 통신 사업자의 게이트웨이에서 IPv6 ⇔ IPv4의 변환이 이루어진다 (DNS64 / NAT64).
• (연결이 IPv4 / v6의인지에 관계없이) 앱이 IPv6 환경에서 작동하도록하지 않으면 안된다. 이것은 심사에 의해 확인된다.
그럼 우리가 수정이 필요한 앱은?? 또 앞으로 새로 개발하는 앱에 대해 무엇을 어떻게 대응 할까?
• 네트워크 통신을 구현 한 iOS 응용 프로그램 모두에서 동작 확인과 문제가 있으면 수정을 해야한다.
• (iOS 외에서 작동) 서버 사이드에 대해서는 원칙적으로 영향을받지 않는다.
네트워크 접속에 대한 변경점
현재까지의 앱들은 IPv4 와 IPv6 두개의 프로토콜을 이용하여 네트워크를 사용하고 있다.
그러니까 아래 그림과 같이 서비스를 IPv4에서 제공하는 것이라면 IPv4 인터페이스로 연결된다.
서비스를 IPv6에서 제공하는 것이면 IPv6로 연결... 된다.
위의 그림과 같았던 네트워크 접속 방법을 아래 그림과 같이 IPv4프로토콜을 이용하는 네트워크는 DNS64/NAT64 를 거쳐서 IPv6로 전환하여 네트워크 접속을 한다는 소리다. 사실 IPv6로의 전환은 우리나라는 아직 시기상조인 것 같다.
빠르게 태새 전환하는 미국과 일본 등의 나라와는 달리 아직 우리나라는 IPv6로의 이전에 대한 이야기는 그리 들어 본 적이 없다.
재차 말하지만 많은 수의 앱은 특별히 대응을 하지 않아도 NAT64에서 문제가 없다.
iOS가 제공하는 고레벨의 API인터페이스는 특별히 바뀌지 않고 접속에 대해서도 통신사업자 측에서 알아서 처리해 줄 것이기 때문.
그반면, 아래와 같은것을 앱 구현에 사용했다면 문제가 생긴다.
• IPv4를 전제로 한 변수 / 구조체 (uint32_t, in_addr, sockaddr_in)
• IPv4에서만 사용할 수 API (inet_aton, gethostbyname)
• IPv4에서만 제대로 작동하지 않을 API 호출 (gethostbyname2 (hostname, AF_INET))
• IPv4에 의존하는 네트워크 연결 확인 프로세스가 존재하는 경우
◦ 장치가 IPv4 주소를 가지고 있는 경우
◦ 0.0.0.0에 방식의 주소를 사용하는 경우
위의 내용을 사용하여 구현하였다면, NAT64 환경에서는 "네트워크에 연결할 수 없다"는 팝업과 함께 앱의 멈춘다.
그럼 무엇을 어떻게 대응 할까?
1. 일단 연결 확인을 미리하는 것이 아니라 연결의 실패를 처리하도록 구현하자.
2. NSURLSession, CFNetwork 고레벨 계층의 프레임 워크를 사용하자.
3. IP숫자 말고 주소 리터럴을 사용하자.
4. RFC4038를 참고.(구글 검색)
5. 주소 리터럴에 연결하는 API를 사용한다.
아직 까지는 대응 하지는 않았지만 검색해본결과 이정도다.
웹서버와 통신하는 앱들은 사실 큰 문제가 없어보인다. 문제는 소켓통신 같은 곳에서 많은 문제가 발견 될 것 같다.