개요

App Safer(iOS)

App Safer(iOS)는 네이버 클라우드 플랫폼이 제공하는 모바일 보안 솔루션으로서, 모바일 기기나 서비스에 위협이 되는 행위를 탐지하는 API를 제공합니다. App Safer는 내부 보안 검사 엔진인 Brick을 사용합니다. iOS용 App Safer 라이브러리는 하나의 프레임워크로 구성되어 있으며, Bitcode Enable/Disable 환경을 모두 지원합니다.

파일 이름 지원 환경
BrickFramework.framework iOS 7.0 이상

AppSafer(iOS) 앱 등록하기


Step 1. 콘솔 접속

콘솔 접속 후 Security > App Safer > Management 메뉴에서 확인합니다.

① 생성한 App Safer가 없으므로 다음과 같은 문구가 표시됩니다.

  • 등록된 모바일 보안감시 대상 앱이 없습니다. 아래 버튼을 클릭하여 새로운 앱을 등록합니다.

② App Safer를 생성하려면 [앱 등록] 버튼을 클릭합니다.

Step 2. 앱 등록

앱 등록은 총 3단계로 구성되어 있습니다.

  1. 앱 정보 입력 단계
  2. Log 수집 설정 단계
  3. 최종 확인 단계

1. 앱 정보 입력 단계

앱 정보를 입력합니다.

  • OS : iOS 선택

  • 패키지명: iOS 앱의 번들 ID를 입력합니다.

    ※ "앱 이름"과 "앱 패키지 이름"은 등록된 후에는 변경이 불가합니다.

    ※ 실제 배포되는 앱과 동일한 패키지명을 기입해주세요.

  • 앱버전 : 하나의 패키지명을 여러번 등록할 때, 앱을 식별할 수 있는 정보입니다. (최소 3글자, 최대 30글자 범위로 입력)

  • 작성이 완료되었으면 [다음] 버튼을 클릭합니다.

2. Log 수집 설정 단계

AppSafer의 로그 저장 및 통계 조회는 Cloud Log Analytics(CLA) 서비스가 필수로 연동되어야 합니다.

※ 추가 이용 요금은 CLA 상품의 기준에 따르게 됩니다.

3. 최종 확인 단계
  • App Safer 설정 내용을 최종적으로 확인할 수 있습니다.

  • 등록 버튼을 클릭하면, App Safer의 보안 솔루션 적용 및 등록이 진행됩니다.

  • 등록에는 수분이 소요 될 수 있습니다.

Step 3. 앱 등록 후 내용 확인

앱 등록 후 상세 내용을 확인합니다.

앱 보안키 관리하기


앱 등록이 완료되면, 해당 앱의 앱 보안키(BrickKey)가 자동으로 발급됩니다.

Ncloud 콘솔 > App Safer > Management > 패키지 리스트의 SDK 버튼을 누르면 앱 보안키(BrickKey)를 확인할 수 있습니다.

App Safer에서 제공하는 API를 사용하려면 발급된 앱 보안키(BrickKey)가 필요합니다.

아래 예제 코드처럼, 발급된 앱 보안키(BrickKey)를 SDK 적용 시 사용할 수 있으며, 앱 보안키(BrickKey)를 통해 사용자 및 앱 인증을 진행할 수 있습니다.

※ App Safer API 중 'initBrick(..)' 사용 시 파라미터 값으로 적용하시면 됩니다.

#import <BrickFramework/BrickFramework.h>
@implementation ViewController

-(IBAction)initBrick:(id)sender{

    if(brick == nil) brick = [[Brick alloc] init];

    int res=0;

    if(brick != nil){

        res = [brick initBrick:self serviceCode:@”ncloud” key:@”brickKey”]; // 초기화 시 BrickDelegate가 구현된 인스턴스를 전달합니다.

        if(res == 0){
              //init start success
        }else if(res == 1){
              //init start fail
    }else{
        NSLog(@"brick is nil");
    }

}

앱 보안키(BrickKey)가 적용된 애플리케이션은 적용된 앱 보안키(BrickKey)를 활용하여 상태를 변경할 수 있습니다.

애플리케이션은 아래와 같이 4가지의 상태를 가질 수 있습니다.

  1. 운영중

    • App Safer를 적용한 앱을 정상 실행할 수 있습니다.

    • 정지 버튼을 클릭할 경우 정지 상태로 변경되며, 앱이 실행되지 않습니다.

  2. 정지

    • App Safer를 적용한 앱이 실행되지 않습니다.

    • 시작 버튼을 클릭하여 운영중 상태로 변경하면 앱이 정상 실행됩니다.

  3. 등록중

    • App Safer 보안솔루션을 적용 중입니다.

  4. 등록 실패

    • App Safer 보안솔루션 적용에 실패 했습니다.

      ※ 앱 등록 시 문제가 발생할 경우 Help Center를 통해 문의 주시면 최대한 빠르게 문제를 해결할 수 있도록 하겠습니다.

AppSafer(iOS) SDK 다운로드하기


Ncloud 콘솔 > App Safer > Management 화면에 접속합니다.

① App Safer 보안 솔루션 적용을 위한 SDK는 Ncloud 콘솔 > App Safer > Management > 패키지 리스트의 SDK 버튼을 통해 다운로드 가능합니다.

② 다운로드한 SDK 파일은 아래 SDK 적용 가이드에 따라 적용할 수 있습니다.

AppSafer(iOS) SDK 적용 가이드


BrickFramework를 적용하는 방법은 아래와 같습니다.
Xcode 8.0 이상의 환경에서 빌드를 권고합니다.

  1. 프로젝트 설정에서 General > Linked Frameworks and Libraries에 BrickFramework.framework를 추가합니다.
  2. Bitcode Enable 버전이면 Build Settings > Enable Bitcode를 Yes로 설정합니다.
  3. Bitcode Disable 버전이면 Build Settings > Enable Bitcode를 No로 설정합니다.

  4. Build Settings > Framework Search Paths를 BrickFramework.framework 파일이 있는 경로로 설정합니다.

  5. Build Settings > Linking > Other Linker Flags에 '-ObjC -lc++' Flag를 추가합니다.

AppSafer(iOS) API 목록

App Safer API는 비동기 방식으로 동작하며, 검사 결과는 BrickCallbackListener 인터페이스를 구현한 객체에서 전달받을 수 있습니다.
App Safer의 Brick클래스는 내부적으로 Singleton으로 객체를 생성해 사용하기 때문에 Brick 객체를 로컬변수로 사용 가능합니다.
App Safer API 목록은 다음과 같습니다.

클래스 이름 API 이름 API 설명
Brick -(int) initBrick:(id)delegate serviceCode:(NSString*) serviceCode key:(NSString *) brickKey Brick을 사용하기 위해 초기화
-(int) releaseBrick Brick에 대한 사용을 해지
-(int) checkTampering 탈옥 탐지를 수행
-(int) setUserID:(NSString *)userId 사용자 ID를 설정
Delegate 이름 필수 여부 API 이름 API 설명
BrickDelegate Required -(void) brickDidInitFinish:(NSUInteger)result msg:(NSString *)msg Brick의 초기화 결과를 전달받음
Required -(void) brickDidCheckTamperingFinish:(BOOL)result checkTampering 함수 수행이 완료되면 결과를 전달
optional -(void) brickDetectedJailBreak 탈옥이 탐지되는 시점에 호출

에러 코드

App Safer(iOS)에서는 다음의 에러 코드를 공통으로 사용합니다.

에러 코드 설 명
100 [Client Error] 정보 생성, 추출 실패
110 [Client Error] 기기의 탈옥 여부 검사(tampering check) 로직 에러
120 [Client Error] 검사 중 강제 종료
200 [Auth Error] 인증 실패
210 [Auth Error] 클라이언트에서 인가되지 않은 인증 정보를 사용함
300 [Server Error] 서버 내부 로직 에러
400 [Server Error] HTTP 요청 실패

AppSafer(iOS) API 설명

-(int) initBrick:(id)delegate serviceCode:(NSString ) serviceCode key : (NSString ) brickKey

Description

Brick을 사용하기 위해 초기화합니다. 로그를 전송하는 데 필요한 정보 및 전역으로 사용되는 변수를 초기화합니다.

  • App Safer의 모든 API는 initBrick()이 성공적으로 호출된 후에 사용할 수 있습니다.
  • 초기화 성공 여부를 전달받기 위해 BrickDelegate를 구현해야 합니다.
Callback
-(void) brickDidInitFinish:(NSUInteger)result msg:(NSString *)msg
Parameter
파라미터 설 명
delegate BrickDelegate가 구현된 인스턴스를 전달
serviceCode App Safer 서비스를 이용하기 위한 코드를 전달
네이버 클라우드 플랫폼 사용자는 반드시 'ncloud'를 전달
brickKey 콘솔에서 앱 등록 시 발급받은 key(보안키)값을 전달
Return Value
반환값 설 명
0 성공
1 실패
Example
#import <BrickFramework/BrickFramework.h>
@implementation ViewController

-(IBAction)initBrick:(id)sender{

    if(brick == nil) brick = [[Brick alloc] init];

    int res=0;

    if(brick != nil){

        res = [brick initBrick:self serviceCode:@”ncloud” key:@”brickKey”]; // 초기화 시 BrickDelegate가 구현된 인스턴스를 전달합니다.

        if(res == 0){
              //init start success
        }else if(res == 1){
              //init start fail
    }else{
        NSLog(@"brick is nil");
    }
}

-(void)brickDidInitFinish:(NSUInteger)result msg:(NSString *)msg{

    NSLog(@"brickDidInitFinish result %lu",result);

    NSLog(@"brickDidInitFinish msg %@",msg);
}

-(int) releaseBrick

Description

Brick을 이용하는 동안 사용한 변수들을 초기화합니다. initBrick 호출 후 App Safer API 사용이 완료되었거나 불필요해지면 releaseBrick을 호출하여 불필요한 메모리 사용을 막습니다.

Return Value
반환값 설 명
0 성공
1 실패
3 Brick이 초기화되지 않음
Example
-(IBAction)releaseBrick:(id)sender{

    int res = 0;

    if(brick != nil){

        res = [brick releaseBrick];

        if(res == 3){
        // please init Brick
}if(res == 0){

        //success

    }else if(res == 1){
        //fail

    }

        brick = nil;

    }else{

        NSLog(@"brick is nil");

    }
}

-(int) checkTampering

Description

기기의 탈옥 여부를 검사합니다.

검사 결과를 전달받으려면 BrickDelegate를 설정해야 합니다.

Callback
-(void) brickDidCheckTamperingFinish:(BOOL)result

검사가 완료되면 호출됩니다.

Return Value
반환값 설 명
0 검사 시작 성공
1 검사 시작 실패
3 Brick이 초기화되지 않음
Example
@implementation ViewController

-(IBAction)checkBrick:(id)sender{

    if(brick != nil){

        int res = [brick checkTampering];

        if(res == 3){
    // please init Brick
}if(res == 0){

    //tampering check start success

}else if(res == 1){
    // tampering check start fail

}

    }else{

        NSLog(@"brick is nil");

    }

}


-(void)brickDidCheckTamperingFinish:(BOOL)result{

    NSLog(@"brickDidCheckJailBreakFinish result %d",result);
}

-(int) setUserID:(NSString*)userId

Description

초기화 및 탐지 이벤트 발생 시 App Safer 서버에 전송되는 로그에 사용자 ID를 포함하고자 할 때 설정합니다.
설정된 사용자 ID는 SHA256으로 해싱하여 전송합니다.

Parameter
파라미터 설 명
userID 사용자 ID
Return Value
반환값 설 명
0 설정 성공
1 설정 실패
3 Brick이 초기화되지 않음
Example
@implementation ViewController

-(IBAction)setUserId:(id)sender{

    int res = 0;

    if(brick != nil){

        NSLog(@"setUserId text %@",[self.useridText text]);

        res = [brick setUserID:[self.useridText text]];

        if(res == 3){
    // please init Brick
}if(res == 0){

    //success

}else if(res == 1){
    //fail

}

    }else{
        NSLog(@"brick is nil");

    }
}

AppSafer(iOS) Callback Interface

App Safer의 검사 함수는 모두 비동기로 동작하며, 결과 처리는 BrickDelegate를 통해 위임됩니다.
만약 검사 결과를 받고 싶다면 App Safer에서 제공하는 BrickDelegate를 구현하고 initBrick() 함수를 이용해 등록해야 합니다.

-(void) brickDidInitFinish:(NSUInteger)result msg:(NSString *)msg

Description

initBrick 함수 호출 후 초기화 완료 시 결과를 전달합니다.

Parameter
파라미터 설 명
result 초기화 성공 여부 정보
0: 초기화 성공
100: 로컬 정보 설정 실패
200: 인증 실패
210: 인증 정보 생성 실패
300: 서버 내부 에러
400: HTTP요청 실패
msg 초기화 실패 시 실패 원인이 전달됩니다. 초기화 성공 시 값은 nil입니다.
- SERVERI_INTERNAL_ERROR: 서버 내부 에러(Server Fault)
- HTTP_[STATUS CODE]_ERROR: HTTP 요청 실패 [STATUS CODE] 부분에 HTTP 상태 코드가 전달됨(Server Fault)
- PROTOBUF_FORMAT_ERROR: 잘못된 Protobuf 요청에 따른 에러(Client Fault)
- REQUEST_FORMAT_ERROR: 잘못된 API 요청에 따른 에러(Client Fault)
- LOCAL_INFORMATION_ERROR: 기본 정보 설정 실패(Client Fault)
Example
#import <BrickFramework/BrickFramework.h> //BrickFramework.h를 import합니다

@implementation ViewController

-(IBAction)initBrick:(id)sender{

    if(brick == nil) brick = [[Brick alloc] init];

    int res=0;

    if(brick != nil){

        res = [brick initBrick:self serviceCode:@”ncloud” key:@”brickKey”]; // 초기화 시 BrickDelegate가 구현된 인스턴스를 전달합니다

        if(res == 0){
      //success
}else if(res == 1){
      //fail
}

    }else{

        NSLog(@"brick is nil");
    }

}

-(void)brickDidInitFinish:(NSUInteger)result msg:(NSString *)msg{

    if(result == 0){
        //init success

    }else {
        //init fail

        NSLog(@"brickDidInitFinish msg %@",msg);
}

}

-(void) brickDidCheckTamperingFinish:(BOOL)result

Description

checkTampering 함수 호출 후 검사가 완료되면 검사 결과를 전달하기 위해 호출됩니다.

Parameter
파라미터 설 명
result 탐지 여부 정보
- YES: 탈옥 탐지 결과가 있을 경우
- NO: 이벤트가 탐지되지 않음
Example
#import <BrickFramework/BrickFramework.h> //BrickFramework.h를 import합니다

@implementation ViewController

-(IBAction)checkBrick:(id)sender{

    if(brick != nil){

        int res = [brick checkTampering];


        if(res == 3){
// please init Brick
}if(res == 0){

       //success check start

}else if(res == 1){
//fail check start

    }

    }else{

        NSLog(@"brick is nil");

    }

}


-(void)brickDidCheckTamperingFinish:(BOOL)result{

    if(result == YES){

        //Detect JailBreak

    }else if(result == NO){

        //Safe

    }

    NSLog(@"brickDidCheckJailBreakFinish result %d",result);

}

-(void) brickDetectedJailBreak

Description

checkTampering() 함수 호출 후 탈옥이 탐지되는 시점에 호출됩니다.
checkTampering() 함수 동작이 완료되지 않았더라도 결과를 받고 싶을 때 사용합니다.

Example
#import <BrickFramework/BrickFramework.h> //BrickFramework.h를 import합니다.

@implementation ViewController

-(IBAction)checkBrick:(id)sender{

    if(brick != nil){

        int res = [brick checkTampering];


        if(res == 3){
// please init Brick
}if(res == 0){

       //success check start

}else if(res == 1){
//fail check start

    }

    }else{

        NSLog(@"brick is nil");

    }

}

-(void)brickDidCheckTamperingFinish:(BOOL)result{

    if(result == YES){

        //Detect JailBreak

    }else if(result == NO){

        //Safe

    }

    NSLog(@"brickDidCheckJailBreakFinish result %d",result);

}


-(void) brickDetectedJailBreak{

    NSLog(@"brickDetectedJailBreak ");
}

AppSafer(iOS) Use Case

초기화와 메모리 해제

#import <BrickFramework/BrickFramework.h> //BrickFramework.h를 import합니다

@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

       if(brick == nil) brick = [[Brick alloc] init];

    int res = 0;

    if(brick != nil){
 res = [brick initBrick:self serviceCode:@”ncloud” key:@”brickKey”]; // 초기화 시 BrickDelegate가 구현된 인스턴스를 전달합니다.
// Brick을 초기화해야 탐지 기능을 사용할 수 있습니다.
        NSLog(@"initBrick result %d",res);

    }else{
        NSLog(@"brick is nil");

    }

}


- (void)dealloc{

    [super didReceiveMemoryWarning];

    int res = 0;

    if(brick != nil){

        res = [brick releaseBrick]; //App Safer 사용이 끝나면 불필요한 자원 해제를 위해 호출합니다.
        NSLog(@"releaseBrick result %d",res);
        brick = nil;

    }else{
        NSLog(@"brick is nil");

    }

}


-(void)brickDidInitFinish:(NSUInteger)result msg:(NSString *)msg{

    if(result == 0){
        //init success

    }else {
        //init fail

        NSLog(@"brickDidInitFinish msg %@",msg);
}

}

기기의 탈옥 여부 검사

@implementation ViewController


-(IBAction)checkBrick:(id)sender{

    if(brick != nil){

        int res = [brick checkTampering]; // 탐지 함수 호출
        NSLog(@"checkBrick %d",res);

    }else{

        NSLog(@"brick is nil");

    }

}

-(void)brickDidCheckTamperingFinish:(BOOL)result{ // 탐지가 완료되면 결과가 전달됩니다.

    if(result == YES){
        //Detect JailBreak
    }else if(result == NO){
        //Safe
    }
    NSLog(@"brickDidCheckJailBreakFinish result %d",result);
}
-(void) brickDetectedJailBreak{
    NSLog(@"brickDetectedJailBreak ");
}
참고 사항

본 상품은 글로벌 리전 서비스로도 제공됩니다.

연관 정보 바로가기

아래 가이드에서 연관 정보를 확인할 수 있습니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...