Documentation Index
Fetch the complete documentation index at: https://docs.openapi.pluuug.com/llms.txt
Use this file to discover all available pages before exploring further.
์ธ์ฆ ๋ฐฉ์ ์๋ด
ํ๋ฌ๊ทธ ์คํ API๋ API Key + Signature ๊ธฐ๋ฐ์ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ API ์์ฒญ ์ ๋ ๊ฐ์ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฐ๋์ ํค๋์ ํฌํจํด์ผ ํฉ๋๋ค.
๐งพ ์ธ์ฆ ํค๋ ๊ตฌ์ฑ
๋ชจ๋ API ์์ฒญ ์ ์๋ ํค๋๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
X-API-KEY: ๋ฐ๊ธ๋ฐ์ API Key
X-Signature: ์์ฒญ ๋ณธ๋ฌธ์ ๋ํ HMAC ์๋ช
๊ฐ
X-Signature๊ฐ ์๋ ์์ฒญ์ ์ธ์ฆ๋์ง ์์ผ๋ฉฐ, ์๋ฒ์์ ๊ฑฐ๋ถ๋ฉ๋๋ค.๐ Signature ์๋ช
๋ฐฉ์
Signature๋ API Key ๋ฐ๊ธ ์ ํจ๊ป ์ ๊ณต๋ Secret Key๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ: HMAC-SHA256
- ์๋ช
๋์: ์์ฒญ ๋ณธ๋ฌธ (
request.body)
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ Signature๊ฐ ์ ํจํ์ง ๊ฒ์ฆํฉ๋๋ค.
Signature๋ ์์ฒญ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ์๋ณ์กฐ ๋ฐฉ์ง ๋ชฉ์ ์ด ์์ต๋๋ค.
๐ก ์ธ์ด๋ณ ์๋ช
์์
API ์์ฒญ ์ request.body๋ฅผ ๊ธฐ์ค์ผ๋ก HMAC-SHA256 ์๋ช
์ ์์ฑํฉ๋๋ค.
์์ฒญ ๋ณธ๋ฌธ์ด ์์ ๊ฒฝ์ฐ, ์๋์ผ๋ก ๋น ๋ฌธ์์ด("")์ ์๋ช
๋์์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
public class HmacSignature {
public static void main(String[] args) throws Exception {
String secretKey = "your-secret-key";
String body = getBody(); // ์์ฒญ ๋ณธ๋ฌธ์ด ์์ผ๋ฉด JSON ๋ฌธ์์ด, ์์ผ๋ฉด ""
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] hash = sha256_HMAC.doFinal(body.getBytes(StandardCharsets.UTF_8));
String signature = bytesToHex(hash);
System.out.println(signature);
}
private static String getBody() {
// ๋ณธ๋ฌธ์ด ์์ ๊ฒฝ์ฐ ์ง๋ ฌํ๋ ๋ฌธ์์ด ๋ฐํ
// ์์ผ๋ฉด return "";
return "{\"name\":\"pluuug\",\"type\":\"openapi\"}";
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
import json, hmac, hashlib
payload = {"name": "pluuug", "type": "openapi"} # ๋ณธ๋ฌธ์ด ์์ผ๋ฉด None
body = json.dumps(payload, separators=(",", ":")) if payload else ""
secret_key = "your-secret-key"
signature = hmac.new(secret_key.encode(), body.encode(), hashlib.sha256).hexdigest()
print(signature)
JavaScript - ๋ธ๋ผ์ฐ์ (ES2020+)
const payload = { name: "pluuug", type: "openapi" }; // ์์ผ๋ฉด null
const body = payload ? JSON.stringify(payload) : "";
async function generateSignature(secretKey, body) {
const encoder = new TextEncoder();
const key = await crypto.subtle.importKey(
"raw",
encoder.encode(secretKey),
{ name: "HMAC", hash: "SHA-256" },
false,
["sign"]
);
const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(body));
return [...new Uint8Array(signature)]
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
generateSignature("your-secret-key", body).then(console.log);
const crypto = require("crypto");
const payload = { name: "pluuug", type: "openapi" }; // ์์ผ๋ฉด null
const body = payload ? JSON.stringify(payload) : "";
const secretKey = "your-secret-key";
const signature = crypto
.createHmac("sha256", secretKey)
.update(body)
.digest("hex");
console.log(signature);
$payload = ['name' => 'pluuug', 'type' => 'openapi']; // ์์ผ๋ฉด null
$body = $payload
? json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
: "";
$secretKey = 'your-secret-key';
$signature = hash_hmac('sha256', $body, $secretKey);
echo $signature;
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
)
func main() {
payload := map[string]string{
"name": "pluuug",
"type": "openapi",
}
var bodyBytes []byte
if payload != nil {
bodyBytes, _ = json.Marshal(payload)
} else {
bodyBytes = []byte("")
}
secretKey := []byte("your-secret-key")
h := hmac.New(sha256.New, secretKey)
h.Write(bodyBytes)
signature := hex.EncodeToString(h.Sum(nil))
fmt.Println(signature)
}