TypeScript
Better Auth는 타입 안전하도록 설계되었습니다. 클라이언트와 서버 모두 TypeScript로 구축되어 타입을 쉽게 추론할 수 있습니다.
TypeScript 설정
Strict 모드
Better Auth는 TypeScript의 strict 모드와 함께 작동하도록 설계되었습니다. TypeScript 설정 파일에서 strict 모드를 활성화하는 것을 권장합니다:
{
"compilerOptions": {
"strict": true
}
}strict를 true로 설정할 수 없는 경우, strictNullChecks를 활성화할 수 있습니다:
{
"compilerOptions": {
"strictNullChecks": true,
}
}컴파일러가 직렬화할 최대 길이를 초과하는 TypeScript 추론 문제가 발생하는 경우,
위의 지침을 따르고 있는지 확인하고, declaration과 composite가 모두 활성화되어 있지 않은지 확인하세요.
타입 추론하기
클라이언트 SDK와 서버 모두 $Infer 속성을 사용하여 추론할 수 있는 타입을 제공합니다. 플러그인은 User와 Session 같은 기본 타입을 확장할 수 있으며, $Infer를 사용하여 이러한 타입을 추론할 수 있습니다. 또한 플러그인은 $Infer를 통해 추론할 수 있는 추가 타입을 제공할 수 있습니다.
import { createAuthClient } from "better-auth/client"
const authClient = createAuthClient()
export type Session = typeof authClient.$Infer.SessionSession 타입은 session과 user 속성을 모두 포함합니다. user 속성은 user 객체 타입을 나타내고, session 속성은 session 객체 타입을 나타냅니다.
서버 측에서도 타입을 추론할 수 있습니다.
import { betterAuth } from "better-auth"
import Database from "better-sqlite3"
export const auth = betterAuth({
database: new Database("database.db")
})
type Session = typeof auth.$Infer.Session추가 필드
Better Auth를 사용하면 user와 session 객체에 추가 필드를 추가할 수 있습니다. 모든 추가 필드는 적절히 추론되며 서버와 클라이언트 측에서 사용할 수 있습니다.
import { betterAuth } from "better-auth"
import Database from "better-sqlite3"
export const auth = betterAuth({
database: new Database("database.db"),
user: {
additionalFields: {
role: {
type: "string",
input: false
}
}
}
})
type Session = typeof auth.$Infer.Session위 예제에서 user 객체에 role 필드를 추가했습니다. 이 필드는 이제 Session 타입에서 사용할 수 있습니다.
input 속성
추가 필드 설정의 input 속성은 해당 필드가 사용자 입력에 포함되어야 하는지를 결정합니다. 이 속성은 기본적으로 true이며, 필드가 등록과 같은 작업 중에 사용자 입력의 일부가 됨을 의미합니다.
필드가 사용자 입력의 일부가 되지 않도록 하려면 명시적으로 input: false를 설정해야 합니다:
additionalFields: {
role: {
type: "string",
input: false
}
}input이 false로 설정되면 필드가 사용자 입력에서 제외되어 사용자가 해당 필드의 값을 전달할 수 없게 됩니다.
기본적으로 추가 필드는 사용자 입력에 포함되며, 신중하게 처리하지 않으면 보안 취약점으로 이어질 수 있습니다. role과 같이 사용자가 설정해서는 안 되는 필드의 경우, 설정에서 input: false를 설정하는 것이 중요합니다.
클라이언트에서 추가 필드 추론하기
클라이언트 측에서 추가 필드의 적절한 타입 추론을 보장하려면 클라이언트에 이러한 필드에 대해 알려야 합니다. 프로젝트 구조에 따라 이를 달성하는 두 가지 접근 방식이 있습니다:
- Monorepo 또는 단일 프로젝트 설정의 경우
서버와 클라이언트 코드가 같은 프로젝트에 있는 경우, inferAdditionalFields 플러그인을 사용하여 서버 설정에서 추가 필드를 자동으로 추론할 수 있습니다.
import { inferAdditionalFields } from "better-auth/client/plugins";
import { createAuthClient } from "better-auth/react";
import type { auth } from "./auth";
export const authClient = createAuthClient({
plugins: [inferAdditionalFields<typeof auth>()],
});- 별도의 클라이언트-서버 프로젝트의 경우
클라이언트와 서버가 별도의 프로젝트에 있는 경우, auth 클라이언트를 생성할 때 추가 필드를 수동으로 지정해야 합니다.
import { inferAdditionalFields } from "better-auth/client/plugins";
export const authClient = createAuthClient({
plugins: [inferAdditionalFields({
user: {
role: {
type: "string"
}
}
})],
});