programming/Swift(iOS) 38

[Swift/iOS] (Base) XML Parser를 만드는 과정, 설계부터 고민까지

Swift로 XML Parser 만들기, 설계부터 고민까지1. 이야기의 시작프로젝트에서 XML 응답을 파싱해야하는 일이 생겼습니다. 주로 API로부터 응답은 JSON 포맷으로 받게 되지만 어쩌다 한번씩 XML 포맷으로 응답을 받는 경우가 있습니다.흔하지 않은 경우이기도 해서 그때마다 필요한 데이터나 정보에 맞게 Parser를 만들었습니다.하지만 생각보다 XML 포맷의 응답이 많아지고 있었습니다.Swift의 XMLParser의 불편한 문제기본으로 제공하는 XMLParser는 실제로 사용하는데 몇가지 불편한 점이 있습니다.XMLParser는 데이터를 한 줄, 한 줄 읽으면서 파싱을 하게 됩니다.현재 어느 위치에서 파싱이 진행되는지 알 수 없기 때문에 이 위치를 알기 위해서는 수 많은 추가 작업들이 필요합니다..

[Swift/iOS] Jailbreak Detection(탈옥 감지)의 필요성

Jailbreak Detection, 완벽한 방어는 없지만 그래도 해야 하는 이유1. 들어가며iOS 개발을 하다 보면 보안 관련 작업은 왠지 "굳이 하지 않아도 되는 것"처럼 느껴질 때가 있습니다. 애플의 보안성을 믿기도 하고, 요즘도 탈옥하는 사람이 있나? 싶은 마음도 있습니다. 기능 개발도 바쁜데, 탈옥 감지나 앱 무결성 검증까지 신경 써야 하나 싶기도 합니다. 그럼에도 불구하고 왜 해야 하는지, 어떻게 접근해야 하는지를 이야기해보려 합니다.이 글에서는 iOS의 기본 보안 구조를 살펴보고, 탈옥이 그 구조를 어떻게 무너뜨리는지, 공격자가 실제로 무엇을 할 수 있는지, 그리고 탈옥 감지와 앱 무결성 검증을 어떻게 구현하는지까지 차근차근 살펴보겠습니다.2. iOS 보안 개념iOS 샌드박스란?iOS의 모든..

[macOS] .pkg(.dmg) 배포를 위한 서명 및 공증(Notarization)

macOS 앱을 배포할 때 가장 까다로운 부분 중 하나가 바로 공증(Notarization) 과정입니다.여러 개의 .dmg 앱이 포함된 .pkg 파일을 만들면서 직접 겪고 해결한 과정들을 정리해 보았습니다. [macOS] .pkg 배포를 위한 서명 및 공증(Notarization)macOS 앱을 웹에서 직접 배포(Direct Distribution)하려면, 단순히 빌드하는 것만으로는 부족합니다.별다른 작업 없이 그냥 파일을 전달하면 사용자가 파일을 열었을 때 개발자가 인증되지 않아서 파일을 실행할 수 없다는 내용의 경고를 확인하게 됩니다.설정에 들어가서 경고를 무시하고 실행할 수 있도록 하는 불편한 과정을 감수해야 앱을 실행할 수 있습니다.이런 경고를 없애려면 Apple로부터 공증을 받아야 합니다.앱 서..

[Swift/iOS] 토큰 데이터를 KeyChain에 안전하게 저장하기

앱에서 로그인 후, 서버에서 반환되는 사용자 인증토큰(accessToken과 refreshToken)을 저장하려고 합니다.CoreData를 사용하기에는 너무 단순한 형태이고,UserDefaults에는 간단한 설정값을 저장하는데 주로 사용하기 때문에,인증토큰처럼 보안이 중요한 경우에는 다른 방법을 찾아보는게 좋다는 생각이 들었습니다. KeyChain은 암호화된 저장소로 토큰 데이터를 저장하기에 알맞다고 판단한 후 앱에서 사용해보았습니다. UserDefaults가 키-값 쌍으로 데이터를 저장하고 불러오는 것처럼, 키체인도 사용할 수 있습니다.다만 KeyChain은 데이터와 속성을 묶고 추가적인 보안 속성을 함께 사용할 수 있습니다. 키체인 서비스 KeyChain Service사용자를 대신해서 안전하게 작은 ..

[Swift/iOS] 애플 로그인 후 반환 값 ASAuthorizationAppleIDCredential From 공식문서

애플 로그인(Apple Authentication Services)를 적용시킨 후 반환되는 값에 대해서 살펴보고자 합니다.유저가 첫 로그인에 성공하면, 가입 후 애플 서버로부터 받은 유저 정보를 서비스하는 서버에 전달해야 합니다.서비스에서도 일부 정보를 사용하고 저장해야하기 때문입니다.(애플 서버가입 여부는 아이폰 기준, 설정 - Apple ID - 암호 및 보안 - Apple로 로그인 - Apple ID를 사용하는 앱에서 확인 가능) 서버 쪽에서는 이 전달받은 데이터를 다시 검증하는 것으로 알고 있습니다.authorization.credential as? ASAuthorizationAppleIDCredential첫 로그인 시 확인할 수 있는 값 중 identityToken과 authorizationCo..

[Swift/iOS] CoreData 사용하기(4) - 속성값 유무에 따른 데이터 저장, 속성의 optional 타입

https://modelinspring.tistory.com/92 [Swift/iOS] CoreData 사용하기(3) - 데이터 저장하기, 데이터 불러오기 기초https://modelinspring.tistory.com/91 [Swift/iOS] CoreData 사용하기(2) - CoreData Stack 설정하기 From 공식문서! 공식문서를 참고한 글입니다.https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack https://modemodelinspring.tistory.com위 포스트에 이은 CoreData 네 번째, 마지막 포스트입니다. 이전 포스팅에서는 Object에 값을 채운 후 데이터를 저장했습니다. 모든..

[Swift/iOS] CoreData 사용하기(3) - 데이터 저장하기, 데이터 불러오기 기초

https://modelinspring.tistory.com/91 [Swift/iOS] CoreData 사용하기(2) - CoreData Stack 설정하기 From 공식문서! 공식문서를 참고한 글입니다.https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack https://modelinspring.tistory.com/90 [Swift/iOS] CoreData 사용하기(1) - 프로젝트 중간에 추가하기, Entity 만들기Coremodelinspring.tistory.com위 포스트에 이은 CoreData 세 번째 포스트입니다. Core Data 데이터 저장하기이전 포스트에서 Car Entity를 만들어놓았습니다.이제..

[Swift/iOS] CoreData 사용하기(2) - CoreData Stack 설정하기 From 공식문서

! 공식문서를 참고한 글입니다.https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack https://modelinspring.tistory.com/90 [Swift/iOS] CoreData 사용하기(1) - 프로젝트 중간에 추가하기, Entity 만들기CoreData를 사용하기 위해서는 프로젝트 생성시에 Use Core Data를 체크하면 되지만,프로젝트 중간에 CoreData를 추가하게 되었습니다.이 과정을 살펴보겠습니다. 프로젝트 중간에 CoreData 추가하기Data Mmodelinspring.tistory.com위 포스트에 이은 CoreData 두 번째 포스트입니다.Core Data StackCore Data ..

[Swift/iOS] CoreData 사용하기(1) - 프로젝트 중간에 추가하기, Entity 만들기

CoreData를 사용하기 위해서는 프로젝트 생성시에 Use Core Data를 체크하면 되지만,프로젝트 중간에 CoreData를 추가하게 되었습니다.이 과정을 살펴보겠습니다. 프로젝트 중간에 CoreData 추가하기Data Model 파일 생성하기[command + N] 또는 [File] - [New] - [File...] 으로 Core Data의 Data Model 파일을 생성합니다. .xcdatamodeld 확장자의 파일이 생긴 것을 확인할 수 있습니다. AppDelegate 수정하기그 다음으로 AppDelegate를 수정합니다.CoreData를 import해주고,import CoreData      // MARK: UISceneSession Lifecycle메서드들 다음에 아래 코드들을 추가합니다..

[Swift/iOS] 메모리 안전성 Memory Safety From 공식문서(2)

[Swift/iOS] 메모리 안전성 Memory Safety From 공식문서(1)[Swift/iOS] 메모리 안전성 Memory Safety From 공식문서(2)! 공식문서를 참고한 글입니다. 메서드에서 Self로의 접근 충돌 Conflicting Access to Self in Methods구조체의 mutating 메서드는 메서드 호출의 지속시간 동안 자기 자신(Self)을 향한 쓰기 접근을 갖습니다.struct Player { var name: String var health: Int var energy: Int static let maxHealth = 10 mutating func restoreHealth() { health = Player.maxHealt..