Skip to main content

Command Palette

Search for a command to run...

[Swift] Swift의 URL 인코딩

Feat. 공공데이터 API 인증키 오류

Updated
[Swift] Swift의 URL 인코딩
T

안녕하세요🙇🏻‍♂️ 세상을 더 편리하게 바꾸고 싶은 iOS 개발자 최인호입니다.

Hello 👋 I'm Inho Choi, an iOS developer who wants to change the world more conveniently.

  • 대학교 졸업
  • Apple Developer Academy @ POSTECH 1기
  • KWDC Main Organizer
  • AsyncSwift Organizer

문제 발생 배경

URLComponents와 URLQueryItem에 넣어서 URL요청 했을 때 serviceKey가 틀리다는 응답이 나오는 문제

원인

문제의 원인은 Swift의 URL 디코딩과 Key값 문제

기본적으로 URL 인코딩을 진행할 때 Percent-encoding을 진행 함

대표적인 Percent-encoding 예시 문자들

[":", "/", "?", "#", "[", "]", "@", "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=", "%"]

Percent-encoding 에 관하여

하지만 Key에 특수문자가 포함되어 있다면?? 특히 %가 포함되어 있다면??

var urlStrings =  [":", "/", "?", "#", "[", "]", "@", "!", "$", "&", "'", "(", ")",  "*",  "+", ",", ";", "=", "%"]

for ele in urlStrings {
    var components = URLComponents(string: "https://example.com")

    components?.queryItems = [URLQueryItem(name: "key", value: ele)]

    print(components!.url!, ele)
}
원래문자 | Percent Encoding 문자
https://example.com?key=: :
https://example.com?key=/ /
https://example.com?key=? ?
https://example.com?key=%23 #
https://example.com?key=%5B [
https://example.com?key=%5D ]
https://example.com?key=@ @
https://example.com?key=! !
https://example.com?key=$ $
https://example.com?key=%26 &
https://example.com?key=' '
https://example.com?key=( (
https://example.com?key=) )
https://example.com?key=* *
https://example.com?key=+ +
https://example.com?key=, ,
https://example.com?key=; ;
https://example.com?key=%3D =
https://example.com?key=%25 %

보면 Swift의 URL 모든 문자에 대해서 Percent-encoding 하고 있지 않음.

왜? 생각해보니 각 문자는 URL에서 고유 역할을 하고 있었음

예를 들어 /는 URLPath를 지정하는 특수 문자

하지만 고약하게도 공공데이터 API 인증키에는 /, +가 들어있었음

위 문자는 Swift에서는 Encodign 해주지 않음...

해결책

Swift String에서 addingPercentEncoding(withAllowedCharacters: CharacterSet)함수를 이용하면 됨

여기서 파라미터로 받는 CharacterSet은 여러개가 있지만 대표적인거 몇 개만 소개함urlUserAllowed (15개)

! $ & \ ( ) * + , - . ; = _ ~

urlPasswordAllowed (15개)

! $ & \ ( ) * + - . ; = _ ~

urlPathAllowed (17개)

! $ & \ ( ) * + - . / : = @ _ ~

urlHostAllowed (18개)

! $ & \ ( ) * + - . : ; = [ ] _ ~

urlFragmentAllowed (19개)

! $ & \ ( ) * + - . / : ; = ? @ _ ~

urlQueryAllowed (19개)

! $ & \ ( ) * + - . / : ; = ? @ _ ~

[위 특수문자 + 영어 알파벳 + 숫자] 를 제외하고는 모두 Percent-Encoding 한다는 뜻이다.

더 많은 자료는 이 사이트 참조

공공데이터 API 인증키에 특수문자가 들어간 경우는 .alphanumerics을 사용하여 Encoding 하여 해결했음 -> 나름 하드코딩?

guard var urlString = urlComponents?.string else { throw NetworkError.URLComponentsError }
urlString += "?"        
for queryItem in queryItems {
    guard let value = queryItem.value?.addingPercentEncoding(withAllowedCharacters: .alphanumerics) else { throw NetworkError.QueryItemError }

    urlString += queryItem.name + "=" + value + "&"
}

guard let url = URL(string: urlString) else { throw NetworkError.URLError }

More from this blog

[CS] Https는 대칭키일까? 비대칭키일까?

결론: 둘 다 쓴다. 하지만 쓰는 타이밍은 다르다. 자세하기 알아보자. 혹시 모르니 용어는 정리해두자. 암호화 <-> 복호화 해독 = 복호화 비대칭키 해독은 대칭키 해독보다 오래 걸린다. 비대칭키를 쓰는 과정 💡 비대칭키는 대칭키를 만들기 위한 여정에 쓰인다. 뭔 소리지??? 대칭키를 만들기 위해서 비대칭키가 쓰인다고?? 비대칭키 해독은 대칭키 해독보다 오래걸린다. 1. Client가 Server에 접속을 요청하면 서버는 Secret ...

Jun 6, 202417

Xcode Cloud 사용 후기

애플에게 내는 친구비를 내며 Apple Developer 계정을 유지하려면 매년 애플에게 13만원의 친구비를 지불해야한다. 그리고 몇 개 친구 답례 상품을 주는데 그 중 하나가 Xcode Cloud 상품 주는데 안 쓸 이유는 없지 Xcode Cloud 개인에게는 과연? K-Spam 이라는 앱을 오랫동안 구상하고 드디어 출시를 했다. 생각보다 삽질을 많이 한 것 같다. 하지만 사이드 프로젝트의 진정한 의미는 삽질(?)하며 배우는 것이 아니겠나 개...

Jun 3, 202418

iOS Version 주의

앱 버전에는 상위버전이 출시한 상태에서 하위 버전을 아카이브 할 수 없음 예를 들어 출시한 버전이 1.3 이면 1.2로는 아카이브가 불가능함 단, 출시한 적이 없는 앱이라면 버전은 마음대로 지정 가능 App Store Connect의 버전 예를 들어 1.03 이랑 1.1 이랑 비교하면 앱 버전은 1.03 > 1.1 로 인식한다. . 단위로 잘라서 Int로 인식하는 것 같다. 그러니 0은 최대한 사용하지 않고 구분한다면 . 으로 구분해야겠다.

Jun 1, 20248

Toby의 iOS 블로그

34 posts

안녕하세요 세상을 더 편리하게 바꾸고 싶은 iOS 개발자입니다.