원격 구성
업데이트를 배포하지 않고도 밸런스, 가격, 기능 플래그를 변경할 수 있습니다. 모든 응답은 서명되고, 기기에서 검증되며, 오프라인 플레이를 위해 캐시됩니다.
코드 주석과 API 이름은 SDK와 일치하도록 영어로 유지합니다.
값 유형#
원격 구성 페이지에서 키를 만듭니다. 값은 텍스트로 저장되며, 지정한 유형에 따라 SDK가 값을 읽는 방법이 정해집니다:
| 유형 | 예 | 한도 |
|---|---|---|
string | Welcome back! | 최대 10,000자 |
number | 25 | 유한한 모든 숫자 |
boolean | false | true 또는 false |
json | {"sale": 0.2} | 최대 50,000바이트 |
값 읽기#
getter는 실패하지 않습니다. 키가 없거나 변환할 수 없으면 지정한 대체값을 반환합니다.
int damage = Majacloud.RemoteConfig.GetInt("enemy_damage", 25);
float speed = Majacloud.RemoteConfig.GetFloat("player_speed", 4.5f);
bool maintenance = Majacloud.RemoteConfig.GetBool("maintenance_mode", false);
string welcome = Majacloud.RemoteConfig.GetString("welcome_message", "Hi!");
ShopConfig shop = Majacloud.RemoteConfig.GetJson<ShopConfig>("shop");var damage := Majacloud.remote_config.get_int("enemy_damage", 25)
var speed := Majacloud.remote_config.get_float("player_speed", 4.5)
var maintenance := Majacloud.remote_config.get_bool("maintenance_mode", false)
var welcome := Majacloud.remote_config.get_string("welcome_message", "Hi!")
var shop = Majacloud.remote_config.get_json("shop", {})const damage = mc.remoteConfig.getInt('enemy_damage', 25);
const speed = mc.remoteConfig.getNumber('player_speed', 4.5);
const maintenance = mc.remoteConfig.getBool('maintenance_mode', false);
const welcome = mc.remoteConfig.getString('welcome_message', 'Hi!');
const shop = mc.remoteConfig.getJson('shop', {});가져오기와 업데이트#
Unity와 Godot는 게임이 시작될 때 구성을 가져오며, 웹에서는 직접 fetch()를 호출해야 합니다. 이후 요청에는 ETag가 전송되므로, 구성이 바뀌지 않았다면 아주 작은 304 응답 하나로 끝납니다.
Majacloud.RemoteConfig.ConfigUpdated += config => ApplyBalance();
var fetch = await Majacloud.RemoteConfig.FetchAsync(); // 304 when nothing changed
if (fetch.Ok) Debug.Log("Config v" + fetch.Value.Version + (fetch.Value.Changed ? " (new)" : ""));Majacloud.remote_config.updated.connect(apply_balance)
var fetch := await Majacloud.remote_config.fetch() # 304 when nothing changed
if fetch.ok:
print("Config v", fetch.value.version, " changed: ", fetch.value.changed)mc.remoteConfig.on('updated', () => applyBalance());
const fetch = await mc.remoteConfig.fetch(); // 304 when nothing changed
if (fetch.ok) console.log('Config v' + fetch.value.version, fetch.value.changed);curl -i https://majacloud.majanite.com/v1/config -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"
# Next time, send the ETag: 304 Not Modified when nothing changed
curl -i https://majacloud.majanite.com/v1/config -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H 'If-None-Match: "<etag>"'오프라인과 캐싱#
마지막으로 검증된 구성은 기기에 캐시되어 시작 시 로드되므로, getter는 오프라인 상태나 첫 가져오기가 끝나기 전에도 작동합니다. 네트워크 문제로 가져오기가 실패하면 캐시된 사본을 유지하며, 캐시된 것보다 오래된 구성은 거부됩니다.
서명 검증#
data는 base64url 페이로드, checksum은 그 SHA-256 값, signature는 storage/keys/의 개인 키로 data에 대해 생성한 RSA-SHA256 서명입니다. SDK는 구성을 사용하기 전에 이 세 가지와 함께 프로젝트 ID와 버전을 확인합니다.
| SDK | 공개 키를 가져오는 곳 |
|---|---|
| Unity | Tools ▸ Majacloud ▸ Setup ▸ Test connection |
| Godot | Project ▸ Tools ▸ Majacloud: Test connection |
| Web | configPublicKey 옵션(API 키 페이지의 PEM) |
| REST | GET /v1/project → config_public_key_pem |
storage/keys/를 백업에 포함하세요. 게임이 이 공개 키를 고정하기 때문입니다.OpenSSL로 응답을 직접 검증할 수 있습니다:
# Verify a config response yourself (what every SDK does before using it)
curl -s https://majacloud.majanite.com/v1/project -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" | jq -r .project.config_public_key_pem > public.pem
curl -s https://majacloud.majanite.com/v1/config -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" > response.json
jq -j .data response.json > data.txt
jq -r .signature response.json | base64 --decode > signature.bin
openssl dgst -sha256 -verify public.pem -signature signature.bin data.txt # Verified OK
jq -r .data response.json | tr '_-' '/+' | base64 --decode 2>/dev/null | jq . # the payload기록과 복원#
모든 변경 사항은 버전으로 관리됩니다. 대시보드는 플랜에 따라 7~365일간 기록을 보관하며, 클릭 한 번으로 이전 값을 복원할 수 있습니다.