작은 게시판을 만드는 상황에서 역할 기반 리소스 접근 제어를 구성하는 예제로 콘솔 사용법을 설명하겠습니다.
/board/v1.0/{boardId}
API를 호출하면 게시물을 반환하는 API가 있고, 이 API는 인증된 회원만 호출할 수 있다고 가정하겠습니다.
먼저 인증된 회원이라는 역할을 만들어야 합니다.
curl을 사용한 예제에서 "{Appkey}" 와 "{SecretKey}" 값은 실제 프로젝트 내의 활성화한 ROLE 서비스의 앱키와 비밀 키로 대체해야 합니다.
역할을 만들었으면 오퍼레이션을 만들어야 합니다.
이제 /board/v1.0/{boardId}
를 리소스로 등록해 보겠습니다.
board
, v1.0
, {boardId}
로 나누어서 순차적으로 등록해야 합니다.
board
를 추가합니다.
v1.0
를 추가합니다.
{boardId}
를 추가합니다.리소스까지 등록했다면 역할이 오퍼레이션을 수행할 수 있는 리소스를 지정하기 위해, 역할-리소스
관계를 설정해야 합니다.
생성한 역할에 특정 조건에만 오퍼레이션 수행 권한을 부여하기 위해, 역할-조건 속성
관계를 설정해야 합니다.
조건 속성은 조건 속성에 미리 추가한 역할에서만 사용할 수 있습니다. 조건 속성을 생성/수정할 때, 앞서 생성해 둔 역할을 조건 속성에 추가해 줍니다.
마지막으로 게시판 API를 사용할 사용자를 추가하고, 접근 제어를 설정하기 위해 MEMBER
역할과 instance.name
조건 속성을 설정합니다.
userId
가 Header 의 'uuid'
로 값이 넘어온다고 가정해 보겠습니다.
12345678-1234-5678-1234-567812345678
사용자가 /board/v1.0/1
API를 호출하였을 때, 권한을 체크하면 아래와 같습니다.
curl -X POST -H "Content-Type: application/json" -d '{
"resources": [
{
"attributes": {
"attributeId": "instance.name",
"attributeValue": "GPU"
},
"authRequestId": "",
"operationId": "GET",
"resourceId": "",
"resourcePath": "/board/v1.0/1",
"scopeId": "ALL"
}
]
}' "https://role.api.nhncloudservice.com/role/v3.0/appkeys/{Appkey}/users/12345678-1234-5678-1234-567812345678/authorizations/resources"
응답 예시) 접근 권한이 있는 경우 해당 리소스 내부에 permission: true
로 응답이 내려옵니다.
{
"authorizations" : [
{
"attributes" : [
{
"attributeId" : "instance.name",
"attributeValue" : "GPU"
}
],
"operationId" : "GET",
"permission" : true,
"resourceId" : "{boardId}",
"resourcePath" : "/board/v1.0/1",
"scopeId" : "ALL"
}
],
"header" : {
"isSuccessful" : true,
"resultCode" : 0,
"resultMessage" : ""
}
}
ROLE 서비스를 사용하는 다른 프로젝트가 있다면, 데이터 이관 기능을 이용해서 편리하게 데이터를 동기화 시킬 수 있습니다.
데이터 동기화의 대상은 리소스
, 역할
, 오퍼레이션
이며 범위
와 사용자
는 동기화되지 않습니다.
관리 탭의 마이그레이션 메뉴 영역에서 데이터를 이관할 프로젝트 혹은 앱키를 입력해서 진행할 수 있습니다.
데이터를 이관할 프로젝트를 선택하거나, 직접 앱키를 입력할 수 있습니다.
클라이언트 SDK 캐시 설정을 할 수 있습니다.
설정할 수 있는 속성은 TTL
, ID별 사이즈
, Path별 사이즈
, Tree별 사이즈
가 있습니다.
리소스 경로의 마지막 '/'
에 대해 설정할 수 있습니다.
Non Identical Path
로 설정한다면, '/board/v1.0/{boardId}'
와 '/board/v1.0/{boardId}/'
는 서로 다른 경로입니다.
하지만, Identical Path
로 설정한다면, '/board/v1.0/{boardId}'
와 '/board/v1.0/{boardId}/'
는 같은 경로입니다.
클라이언트 SDK 와 서버의 캐시 때문에 변경된 리소스에 대한 권한 체크 결과가 즉시 반영되지 않을 수 있습니다. 그럴 경우 관리 탭의 캐시 삭제 버튼을 사용해서 명시적으로 캐시를 삭제하면 문제를 해결할 수 있습니다.