본문 바로가기
macOS

macOS - 샌드박스 및 북마크 개념

by vapor3965 2022. 4. 10.

목차

    iOS처럼 마찬가지로 macOS도 샌드박스 개념이 존재한다. 

    샌드박스란? 

    쉽게 생각하면, 다른 어플리케이션이 접근하지 못하도록 자신만의 구역이라고 할 수 있겠다.

    어플리케이션은 데이터들을 로컬에 저장하거나, 캐시로 이용하거나 등 많은 이유로 자신만의 구역이 필요하다. 

    그럼 샌드박스가 필요한 이유는 반대로 생각하면 짐작이 간다. 다른 어플리케이션이 접근하도록 허락하면, 해당 어플리케이션이 사용하는 데이터가 변질될 가능성이 농후하다. 더 나아가 샌드박스 개념이 없다면, 어플리케이션이 악성코드에 노출되어 해당 사용자의 모든 데이터에 접근하여 바이러스를 심거나 할 수도 있겠다. 

     

    앱이 샌드박스화 되어지면, 자신만의 구역이 생기는 것 뿐만 아니라, 사용자의 시스템 데이터에 접근에도 제한이 생기게 된다.  ( 샌드박스 이외에 구역들, ex 다운로드폴더, 사진폴더, 등등 )

     

    그리고 어플리케이션이 맥엡스토어에 출시하기 위해서는 샌드박스화 해야한다.

     

    샌드박스화 하기 위해서는 

    Capability에서 SandBox를 enable시키면 된다. 그러면 자동적으로 XXX.entitlement 파일이 생긴다. 

    * GUI인터페이스에서도 추가적인 옵션들을 선택할 수도 있고, .entitlement파일에 key-value로 설정할 수 있다. 

    해당 어플리케이션은 홈디렉토리 - Library - Containers 안에 자신만의 샌드박스가 생성되고, 이제 어플리케이션은 이 구역안에서는 자유롭게 read, write할 수 있게 된다. ( 실제로 Containers 폴더에 가보면 굉장히 많은 폴더들이 있는걸 볼 수 있다. 다르게 말하면 많은 어플리케이션들의 샌드박스 구역이라고 볼 수 있다. )

     

    샌드박스화 한 이후에 달라지는 점 

    • NSOpenPanelNSSavePanel이 달라지는데, 샌드박스화한 앱에서는 ok메소드를 호출할수없고, NSOpenSavePanelDelegate의  panel:userEnteredFilename:confirmed: 를 재정의?할수없다
    • 아래와같이 런타임에 상속구조가 변경되어, NSPanel이나,NSWindow, NSResponder 메소드를 사용할 경우 exception 발생시킨다. 런타임에 발생하므로, 컴파일러는 워닝을 제공하지 않는다. 

     

     

    샌드박스 이외에 접근하기 위해서는? 

    아래 key처럼 사용자가 선택한 파일이나, 다운로드, 사진, 음악, 영화 폴더에 대해 접근을 지정할 수 있다. 

    사용자가 선택한 파일은,  아래처럼 다일로그 패널을 띄울 때 선택한 파일이 된다.

    ( 조금만 더 설명하면 사용자 선택파일을 접근가능하게 설정하게 되면, 자동적으로 Powerbox 사용할 있게되는데, Powerbox api 없고, 패널을 띄울 경우, 앱은 Powerbox 사용하게되는데,  윈도우는 Appkit 아닌, Powerbox 보여지게된다. 사용자 입장에서는 Powerbox나 다일로그인지 차이는 없는 듯 하다)

     

     

    만약 어플리케이션에서 다운로드, 사진, 음악, 영화 폴더 이외에 폴더안에 있는 파일을 코드로 접근하고자 한다면? 

    당연히 안되겠지만, 직접 눈으로 보고싶었으므로, permission이 없다고 파일을 열수가 없다라고 에러가 뜬다. write도 마찬가지. 

    Error Domain=NSCocoaErrorDomain Code=257 "The file “hihi.mov” couldn’t be opened because you don’t have permission to view it.

    Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “NEWNEW.m4a” in the folder “Desktop”."

     

     


     

     

    북마크란?

    북마크가 무엇인지 알아보기 전에, 샌드박스화가 되면 불편한 점이 생긴다. 사용자가 선택한 파일, 다운로드, 사진, 음악, 영화 폴더 이외에는 접근을 할 수가 없다. ( 이덕분에 시스템, 사용자의 데이터는 안전해진다는 장점이 있다. ) 

     

    그래서 이러한 단점을 약간이나마 보완하면서 사용자의 의지를 포함시켜 안정성도 추가한 개념이 북마크다.

    다시 정리하면, 북마크는 사용자가 선택한 폴더에 영구적으로 접근할 수 있게 해준다. 

    ( 예시로, 특정 어플리케이션에서는 어플리케이션의 데이터를 사용자가 지정한 폴더 ( 다운로드 폴더 이외 )에 저장하게 하는 기능이 있는데, 이런 기능이 북마크를 이용한 것으로 볼 수 있다. )

     

    북마크기능을 가능하게 하기 위해서는?

    북마크도 크게 app-scoed bookmarks,  document-scoped bookmarks로 나뉜다.

    app-scoped bookmarks는 사용자가 지정한 파일이나 폴더에 영구적으로 접근을 가능하게 해주며, 

    가능하게 하기 위해서는, .entitlement 파일에 key-value를 추가한다. 

    ( key는 com.apple.security.files.bookmarks.app-scope ) 

     

     

    북마크 사용 방법

    간단히 하면, 사용자가 선택한 폴더의 URL을 NSData로 만들어서 로컬에 저장하고, 해당 NSData를 NSURL로 만들어서 접근하도록 한다. 

     

    처음에 북마크 데이터를 생성하려면,

    사용자에게 폴더를 선택하도록 다일로그를 띄우고, 사용자가 선택한 폴더의 URL을 NSURL 메소드인, bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error: 사용하여 북마크 데이터를 생성한다. 

    그리고 이 데이터를 로컬에 저장한다. ( 주로 UserDeafult 또는 .plist 안에 )

     

    북마크 데이터를 사용하기 위해서는

    그 다음부터는 저장한 NSData를 로컬로 가져오고, URL로 만들어서 접근해야 하므로, NSURL 클래스메소드인  URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error: 사용하여 URL로 만들어낸다. 

    그리고 실질적으로 접근하기 위해서는, 지금부터 접근하겠다고 명시해야하는데, URL 메소드인  startAccessingSecurityScopedResource 호출해야한다.

    그리고 더 이상 접근이 필요없게 되는 경우에는 URL의 메소드인 stopAccessingSecurityScopedResource  호출해야한다.    

     

     

     

     

     


    참고

     

    https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW16

     

    App Sandbox in Depth

    App Sandbox in Depth The specific steps you take to adopt App Sandbox are unique to your app, but the access control mechanisms used by App Sandbox to protect user data remain consistent: Entitlements. Communicate to macOS the specific system resources you

    developer.apple.com

    https://developer.apple.com/documentation/security/app_sandbox?language=objc 

     

    Apple Developer Documentation

     

    developer.apple.com

     

    https://developer.apple.com/documentation/professional_video_applications/fcpxml_reference/asset/media-rep/bookmark?language=objc 

     

    Apple Developer Documentation

     

    developer.apple.com

     

    'macOS' 카테고리의 다른 글

    objective-c 와 swift 차이점  (0) 2022.08.13

    댓글