이 문서는 BlueTalk 위젯/채팅을 웹 사이트에 붙일 때,
site_key / user_id / nickname / user_key를 어떻게 설계·사용하는지에 대한 가이드입니다.
BlueTalk는 다음 4가지 정보를 기반으로 인증을 수행합니다.
$member['mb_id'],
다른 서비스라면 자체 회원 PK/아이디 등을 사용할 수 있습니다.
결국, 클라이언트에서 JS SDK 초기화를 수행할 때
site_key + user_id + user_key + nickname 네 가지를 함께 전달하게 됩니다.
BlueTalk 서버(DB)에는 sites 테이블이 있으며,
여기에 각 사이트 도메인과 site_key, 옵션들이 저장됩니다.
example.comaaa.example.com과 같이 매칭할 수 있습니다.
site_123456
소켓 연결 시 클라이언트에서 전송한 site와
실제 접속 도메인(Origin / Referer)을 이용하여
sites 테이블에서 해당 사이트를 조회하고,
▷ 존재하지 않으면 연결을 거부 ▷ 존재하면 추가 인증을 진행합니다.
user_key는 다음과 같은 원칙을 따르는 값입니다.
가장 중요한 점은 user_key가 항상 서버에서만 생성되고,
클라이언트 단에서 임의로 바꿀 수 없어야 한다는 점입니다.
// config 또는 별도 설정 파일에 비밀키를 보관합니다.
$blt_site_key = '발급받은_site_key';
$blt_secret = '서버_내부_비밀문자열_또는_ENV값';
// 로그인 여부에 따라 user_id / nickname 정리
if ($is_member) {
$user_id = $member['mb_id']; // 예: 'testuser'
$nickname = get_text($member['mb_nick']);
} else {
$user_id = 'guest';
$nickname = '손님';
}
// user_key 생성 (예시: SHA-256)
$payload = $user_id.'|'.$blt_site_key.'|'.$blt_secret;
$user_key = hash('sha256', $payload);
위 예시는 가장 단순한 형태이며, 필요하다면 가입일, 만료시간, 기타 정보를 추가하여 payload를 구성할 수 있습니다.
// 예: config.js
const BLT_SITE_KEY = process.env.BLT_SITE_KEY;
const BLT_SECRET = process.env.BLT_SECRET;
// 예: Express 라우터
const crypto = require('crypto');
app.get('/', (req, res) => {
const isLogin = !!req.session.user;
const userId = isLogin ? req.session.user.id : 'guest';
const nickname = isLogin ? req.session.user.nick : '손님';
const payload = userId + '|' + BLT_SITE_KEY + '|' + BLT_SECRET;
const userKey = crypto
.createHash('sha256')
.update(payload)
.digest('hex');
res.render('index', {
bltSiteKey: BLT_SITE_KEY,
userId,
nickname,
userKey,
});
});
위 예시는 세션에서 req.session.user를 참조하는 형태이며,
실제 서비스의 로그인 구조에 맞게 userId / nickname을 가져오면 됩니다.
import os
import hashlib
BLT_SITE_KEY = os.getenv("BLT_SITE_KEY", "발급받은_site_key")
BLT_SECRET = os.getenv("BLT_SECRET", "서버_비밀문자열")
def make_user_key(user_id: str) -> str:
payload = f"{user_id}|{BLT_SITE_KEY}|{BLT_SECRET}"
return hashlib.sha256(payload.encode("utf-8")).hexdigest()
# 예: FastAPI 엔드포인트 내부
user_id = "guest"
nickname = "손님"
# 로그인 시:
# user_id = request.session["user"]["id"]
# nickname = request.session["user"]["nick"]
user_key = make_user_key(user_id)
실제 서비스의 세션/인증 구조에 맞추어 user_id와 nickname을 가져온 뒤,
위와 같이 user_key를 생성하여 템플릿에 넘기면 됩니다.
위에서 만든 site_key, user_id, nickname, user_key는
HTML 템플릿 속 JS SDK 초기화에 그대로 전달하면 됩니다.
<script src="https://bluetalk.kr/talk/bluetalk.js"></script>
<div id="bluetalk"></div>
<script>
window.SITE_KEY = "";
window.GLOBAL_USER_ID = "";
window.GLOBAL_USER_KEY = "";
window.GLOBAL_NICKNAME = "";
const bt = new BlueTalk({
mode: 'global',
targetId: 'bluetalk'
});
bt.init();
</script>
실제로는 사이트 구조에 맞게 별도 JS 파일로 분리하거나, 템플릿 상단/하단에 공통 스크립트를 두는 방식으로 관리하면 됩니다.
site_key는 BlueTalk에서 발급하는 사이트 식별키입니다.user_id는 사이트 내에서 사용자를 구분할 수 있는 값입니다.nickname은 채팅에 표시할 이름입니다.user_key는 서버에서만 생성하는 서명/토큰 값입니다.BlueTalk 인증 구조는 서비스 특성에 맞게 확장할 수 있으며, 기본 원칙(서버에서 서명 생성, 도메인 + site_key 매칭, 게스트 정책 등)을 유지하는 선에서 자유롭게 응용 가능합니다.
여기서는 개념적인 인증 구조와 간단한 예시 코드만 다루었습니다.
실제 연동 예제(PHP/Node/Python, 그누보드/아미나)는 예제 · 자료실 게시판에서 단계적으로 제공할 예정입니다.