Credentials Provider
Credentials Provider는 사용자 이름과 비밀번호, 도메인, 2단계 인증, 하드웨어 장치(예: YubiKey U2F/FIDO)와 같은 임의의 자격 증명을 사용하여 로그인을 처리할 수 있게 해줍니다.
이 기능은 기존 시스템에 대해 사용자를 인증해야 하는 경우를 지원하기 위해 설계되었습니다. 따라서 이 방식으로 인증된 사용자는 데이터베이스에 저장되지 않습니다.
리소스
설정
/auth.ts
import NextAuth from "next-auth"
import Credentials from "next-auth/providers/credentials"
export const { signIn, signOut, auth } = NextAuth({
providers: [
Credentials({
credentials: {
username: { label: "Username" },
password: { label: "Password", type: "password" },
},
async authorize({ request }) {
const response = await fetch(request)
if (!response.ok) return null
return (await response.json()) ?? null
},
}),
],
})
커스텀 에러 메시지
authorize
함수에서 커스텀 에러를 던져 사용자에게 커스텀 에러 메시지를 반환할 수 있습니다.
@/auth.ts
import NextAuth, { CredentialsSignin } from "next-auth"
import Credentials from "next-auth/providers/credentials"
class InvalidLoginError extends CredentialsSignin {
code = "Invalid identifier or password"
}
export const { handlers, auth } = NextAuth({
providers: [
Credentials({
credentials: {
username: { label: "Username" },
password: { label: "Password", type: "password" },
},
async authorize(credentials) {
throw new InvalidLoginError()
},
}),
],
})
로그인 시도가 실패한 후 사용자가 리다이렉트되는 로그인 페이지의 쿼리 파라미터에서 이 커스텀 에러 코드를 확인할 수 있습니다. 예를 들어 https://app.company.com/auth/signin?error=CredentialsSignin&code=Invalid+identifier+or+password
와 같은 형태로 나타납니다.
⚠️
OAuth 프로바이더들은 다음과 같은 기능을 구축하기 위해 상당한 비용, 시간, 엔지니어링 노력을 투자합니다:
- 남용 탐지 (봇 방어, 요청 제한)
- 비밀번호 관리 (비밀번호 재설정, 크리덴셜 스터핑 방지, 주기적 변경)
- 데이터 보안 (암호화/솔팅, 강도 검증)
그 외에도 인증 솔루션을 위해 다양한 기능을 제공합니다. 이러한 검증된 솔루션을 활용하는 것이 처음부터 다시 구축하는 것보다 여러분의 애플리케이션에 더 유리할 수 있습니다.
그럼에도 불구하고 비밀번호 기반 인증을 구축하고 싶다면, Auth.js는 이를 완전히 제어할 수 있는 기능을 제공합니다.