securestorage
securestorage 는 HSP 에서 확장 라이브러리로 제공하는 API 로 aar 라이브러리 파일과 build.gradle 파일을 수정한 뒤 Realm 와 Network 관련 설정을 하게 되면 사용할 수 있다.
라이브러리 추가 방법은 Android 개발 가이드의 내용을 참조하면 되며 Realm 과 관련된 설정은 하단을 참고 한다.
사용 설정
Realm 설정
securestorage 는 ORM 디비인 Realm 이용하고 있으며 이와 관련되어 필요한 설정을 설명 한다.
(Realm 의 자세한 설정을 정보를 원하면 https://realm.io/kr/docs/java/latest/ 를 참조한다.)
먼저 Project Level 의 build.gradle 파일내 dependencies 에 realm 의 classpath 를 추가 한 뒤
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:10.15.1"
}
}
App Level 의 build.gradle 파일내 apply plugin: 'com.android.application' 하단에 아래의 코드를 추가 한다.
이후 Application 을 상속 받은 MainApp 의 onCreate 에 Secure Storage 의 init 을 추가하면 Realm 관련 설정이 완료된다.
@Override
public void onCreate() {
super.onCreate();
DAPSecureStorage.init(this);
HoneMobile.get().setContext(this);
}
}
INetworkDelegate
securestorage 는 디비 암호화를 위해 AES / RSA 를 이용하고 있고 이와 관련된 키 값을 얻기 위해 Operation 과 연동 작업이 이루어져야 한다. 이를 위해 NetworkDelegate 가 필요 하며 그에 대한 예제는 아래와 같다.
Example
@Override
public Object post(@NonNull NetworkDelegateParams params) {
Network.Builder builder = Network.builder();
// container 가 존재하면 구현해 두었던 DAPNetwork 를 통해 처리 하고
if (params.container != null) {
if (params.typeRef == null) {
return DAPNetwork.doRequest(HoneMobileActivity.this,
DAPNetwork.METHOD_POST, params.container);
} else {
return DAPNetwork.doRequest(HoneMobileActivity.this,
DAPNetwork.METHOD_POST, params.container, params.typeRef);
}
} else {
// 일단 url 로 호출했을 경우는 NetworkDelegate 를 통해 처리 한다.
if (!TextUtils.isEmpty(params.url)) {
builder.url(params.url);
}
if (params.forceDownload) {
builder.forceDownload(true).retrieveDownloadPath();
}
if (params.multipartBody != null) {
builder.multipartBody(params.multipartBody);
}
NetworkBase network = NetworkDelegate.get().net(HoneMobileActivity.this);
return networkInternal(false, network, builder, params);
}
}
@Override
public void asyncPost(@NonNull NetworkDelegateParams params) {
Network.Builder builder = Network.builder();
if (params.container != null) {
if (params.typeRef == null) {
DAPNetwork.asyncDoPost(HoneMobileActivity.this, params.container,
params.successCallback, params.errorCallback);
} else {
DAPNetwork.asyncDoPost(HoneMobileActivity.this, params.container,
params.successCallback, params.errorCallback, params.typeRef);
}
} else {
// 일단 url 로 호출했을 경우는 NetworkDelegate 를 통해 처리 한다.
if (!TextUtils.isEmpty(params.url)) {
builder.url(params.url);
}
if (params.forceDownload) {
builder.forceDownload(true).retrieveDownloadPath();
}
if (params.multipartBody != null) {
builder.multipartBody(params.multipartBody);
}
NetworkBase network = NetworkDelegate.get().net(HoneMobileActivity.this);
Executors.newSingleThreadExecutor().execute(() -> networkInternal(true, network, builder, params));
}
}});
instance
instance 는 디비를 초기화 하기 위한 준비 작업으로 암호화 관련 정보를 전달 받은 후 Realm 디비를 초기화 하는 과정이다.
초기화 완료 후 SecureObject에 담아 전달되며 아래의 클래스 형태로 구성되어 있으며 세부 내용은 하단을 참조한다.
SecureObjectClass Class
public final Realm db;
public final Serializable msgContainer;
}
CaptureParams
필드 | 설명 |
---|---|
db | 디비 객체 |
msgContainer | 데이터 컨테이너 |
Example
// TODO
}, {
// TODO
}, true)
// TODO
}, e -> {
// TODO
}, true);
get
get 은 키를 기준으로 저장된 데이터를 얻을 수 있다. (복호화된 값을 얻는다.)
options
필드 | 설명 | M/O |
---|---|---|
reaml | 디비 객체 | M |
key | 키 값 | M |
Example
DAPSecureStorage.get(this@MainActivity, secureObj.db, "key", { result ->
// TODO
}, {
// TODO
})
}, {
// TODO
}, true)
DAPSecureStorage.get(MainActivity.this, secureObj.db, "key", result -> {
// TODO
}, e -> {
// TODO
});
}, e -> {
// TODO
}, true);
set
set 은 키를 기준으로 데이터를 저장한다. 이때 데이터는 암호화 되어 저장된다.
options
필드 | 설명 | M/O |
---|---|---|
reaml | 디비 객체 | M |
key | 키 값 | M |
value | 저장할 값 | M |
Example
DAPSecureStorage.set(this@MainActivity, secureObj.db, "key", "value", { result ->
// TODO
}, {
// TODO
})
}, {
// TODO
}, true)
DAPSecureStorage.set(MainActivity.this, secureObj.db, "key", "value", result -> {
// TODO
}, e -> {
// TODO
});
}, e -> {
}, true);
remove
remove는 키를 기준으로 데이터를 삭제한다.
options
필드 | 설명 | M/O |
---|---|---|
reaml | 디비 객체 | M |
key | 키 값 | M |
Example
DAPSecureStorage.remove(this@MainActivity, secureObj.db, "key", { result ->
// TODO
}, {
// TODO
})
}, {
// TODO
}, true)
DAPSecureStorage.remove(MainActivity.this, secureObj.db, "key", result -> {
// TODO
}, e -> {
// TODO
});
}, e -> {
}, true);
Error Code
Code | Cause | Comment |
---|---|---|
E11300 | 파라메터 값이 잘못되어 있을 경우 | |
E11301 | 전달된 액션 값이 알 수 없는 액션일 경우 | |
E11302 | 키 값이 잘못되어 있을 경우 키 값이 63자 초과 입력 되었을 경우 | |
E11303 | 저장할 값이 잘못되어 있을 경우 | |
E11350 | 실행 중 오류가 발생 되었을 경우 | |
E11351 | 서버로 부터 전달받은 응답 메시지가 없는 경우 | |
E11352 | 서버로 부터 전달받은 응답 메시지가 잘못되어 있는 경우 서버로 부터 전달받은 응답 메시지에 복호화 키값이 잘못되어 있는 경우 | |
E11353 | 초기화시 오류가 발생 되었을 경우 | |
E11354 | 키 값이 존재하지 않는 경우 | |
E11399 | 알 수없는 오류가 발생 되었을 경우 | |