본문으로 건너뛰기

사용자 관리

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'
  }
})

소셜 로그인

지원 프로바이더

  • Google
  • Naver
  • GitHub
  • Discord

설정

콘솔 > 설정 > 인증에서 각 프로바이더 설정:

  1. Client ID 입력
  2. Client Secret 입력
  3. 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)
}