사용자 관리
Connect Base 사용자 관리 심화 가이드입니다.
역할 및 권한
기본 역할
| 역할 | 설명 | 권한 |
|---|---|---|
| owner | 앱 소유자 | 모든 권한 |
| admin | 관리자 | 대부분 권한 (앱 삭제 제외) |
| member | 일반 멤버 | 기본 CRUD |
| guest | 게스트 | 읽기만 |
커스텀 역할
콘솔에서 커스텀 역할 생성:
json
{
"name": "moderator",
"permissions": [
"users:read",
"users:update",
"content:read",
"content:update",
"content:delete"
]
}권한 체크
SDK에서 확인
typescript
const me = await cb.auth.getMe()
// 권한은 custom_data 에 저장합니다
const permissions = (me.custom_data?.permissions ?? []) as string[]
if (permissions.includes('users:delete')) {
// 삭제 버튼 표시
}API에서 확인
서버리스 함수에서 권한 확인:
javascript
export async function handler(event, context) {
const user = context.user
if (!user.permissions.includes('admin:access')) {
return {
statusCode: 403,
body: JSON.stringify({ error: 'Forbidden' })
}
}
// 관리자 기능 실행
}세션 관리
토큰 구조
Access Token (1시간)
├── userId
├── appId
├── role
├── permissions
└── exp
Refresh Token (7일)
├── userId
├── appId
└── exp토큰 갱신 / 세션 만료 처리
📌 토큰 콜백은 SDK 초기화 시 옵션으로 등록합니다.
cb.auth.onXxx(...)같은 메서드는 존재하지 않습니다.
typescript
import ConnectBase from 'connectbase-client'
const cb = new ConnectBase({
publicKey: 'cb_pk_...',
// access_token / refresh_token 이 갱신될 때마다 호출
onTokenRefresh: ({ accessToken, refreshToken }) => {
localStorage.setItem('cb_access_token', accessToken)
localStorage.setItem('cb_refresh_token', refreshToken)
},
// 401 등 인증 실패 시 호출
onAuthError: (error) => {
console.error('인증 실패:', error)
},
// refresh_token 까지 만료되어 재로그인이 필요할 때 호출
onTokenExpired: () => {
localStorage.removeItem('cb_access_token')
localStorage.removeItem('cb_refresh_token')
window.location.href = '/login'
}
})소셜 로그인
지원 프로바이더
- Naver
- GitHub
- Discord
설정
콘솔 > 설정 > 인증에서 각 프로바이더 설정:
- Client ID 입력
- Client Secret 입력
- Redirect URL 설정
사용
typescript
// 리다이렉트 방식 로그인 (권장) — 모든 환경에서 안정적
await cb.oauth.signIn('google', 'https://myapp.com/callback')
// 콜백 페이지에서 결과 처리
const result = cb.oauth.getCallbackResult()
// 팝업 방식 로그인 (COOP 정책 제한 주의)
const result = await cb.oauth.signInWithPopup('google', 'https://myapp.com/callback')모범 사례
1. 최소 권한 원칙
필요한 최소한의 권한만 부여:
typescript
// ❌ 나쁜 예: 모든 권한
{ role: 'admin' }
// ✅ 좋은 예: 필요한 권한만
{
role: 'custom',
permissions: ['products:read', 'products:update']
}2. 정기적 세션 검증
typescript
// 주기적으로 세션 유효성 확인
setInterval(async () => {
try {
await cb.auth.getMe()
} catch {
// 세션 만료, 재로그인 요청
showLoginModal()
}
}, 5 * 60 * 1000) // 5분마다3. 감사 로그
중요 작업은 로깅:
typescript
async function deleteUser(userId: string) {
await cb.database.createData('tbl_audit_logs', {
data: {
action: 'user_deleted',
targetId: userId,
performedBy: currentUser.id,
timestamp: new Date().toISOString()
}
})
await cb.database.deleteData('tbl_users', userId)
}