Next-auth 개념 & 기능
Next Auth: Next.js 기반의 앱에서 사용자 인증 작업을 쉽게 처리할 수 있는 라이브러리
사용자 로그인, 회원가입 및 다양한 인증 제공자(예: Google, Facebook, GitHub)와의 통합을 간편하게 구현할 수 있음
제공 기능
- 인증: 사용자 로그인 및 회원가입을 지원하며, 다양한 인증 제공자로 사용자를 인증
- 세션 관리: 사용자 세션을 쉽게 관리하고, 로그인 상태를 유지할 수 있음
- 인증 제공자 통합: 다양한 인증 제공자와의 통합을 지원하여 사용자가 원하는 방식으로 로그인
- JWT 토큰: JSON Web Token(JWT)을 사용하여 사용자 인증 정보를 안전하게 저장하고 전달
- 세션 저장소: 사용자 세션 데이터를 저장하기 위한 다양한 백엔드 데이터베이스를 지원
장점
- 빠른 구현
- 다양한 인증 제공자
- 보안
- 세션관리 용이성
- nextjs와의 통합 - ssr과의 호환성을 제공함
Next-auth 장점
- 간단한 설정: 직접 구현하는 것에 비해 인증 설정이 매우 간단합니다.
- 다양한 인증 공급자: Google, Facebook, Apple, Naver, Kakao 등 수십 개의 인증 공급자와 통합이 가능합니다.
- 안전한 보안: 보안 관련 작업(세션 관리, JWT 생성, CSRF 방어 등)을 자동으로 처리하여 보안이 강화됩니다.
- 확장성: 사용자의 데이터베이스와의 통합을 지원하여 확장성이 뛰어납니다.
- Next.js와의 통합: Next.js와 통합하여 SSR(Server Side Rendering) 및 CSR(Client Side Rendering)에서 원활하게 작동합니다.
예시 코드
서버 사이드 (/pages/api/auth/[…nextauth].js) 이 코드는 NextAuth의 API를 설정하는 부분으로, OAuth 제공자와 이메일 로그인 방식을 설정
import NextAuth from 'next-auth'
import GoogleProvider from 'next-auth/providers/google'
export default NextAuth({
providers: [
// OAuth 인증 제공자
GoogleProvider({
clientId: process.env.GOOGLE_ID, // 환경변수에서 Google 클라이언트 ID 가져오기
clientSecret: process.env.GOOGLE_SECRET // 환경변수에서 Google 비밀 키 가져오기
}),
// 이메일 로그인 제공자
EmailProvider({
server: process.env.MAIL_SERVER, // 이메일 서버 설정
from: 'NextAuth.js <no-reply@example.com>'
})
]
})
클라이언트 사이드 (/pages/index.js) 이 코드는 클라이언트에서 NextAuth의 세션을 확인하고, 로그인/로그아웃 버튼을 표시하는 예시, 세션관리
import { useSession, signIn, signOut } from 'next-auth/react'
export default function Component() {
const { data: session } = useSession()
if (session) {
return (
<>
Signed in as {session.user.email} <br />
<button onClick={() => signOut()}>Sign out</button>
</>
)
}
return (
<>
Not signed in <br />
<button onClick={() => signIn()}>Sign in</button>
</>
)
}
useSession: 현재 로그인 상태를 확인합니다. session 객체가 있으면 로그인한 상태로 표시됩니다. signIn: 로그인 버튼 클릭 시, signIn() 함수로 로그인 절차를 시작합니다. signOut: 로그아웃 버튼 클릭 시, signOut() 함수로 로그아웃 절차를 시작합니다.
Next-auth 사용자 인증 방식 (+ callback)
NextAuth.js는 주로 세션과 JWT를 함께 사용하여 인증 작업을 진행
개발자는 프로젝트의 요구 사항에 맞게 적절한 방식을 선택할 수 있습니다. Callback 사용:
NextAuth.js는 다양한 콜백 함수를 사용하여 사용자 인증 및 세션 관리를 조정할 수 있습니다.
/pages/api/auth/[…nextauth].js
callbacks: {
// 사용자 로그인 시 호출되는 콜백
async signIn({ user, account, profile, email, credentials }) {
return true; // 로그인 성공 시 true 반환
},
// 리디렉션 URL 설정 콜백
async redirect({ url, baseUrl }) {
return baseUrl; // 리디렉션할 기본 URL 반환
},
// 세션 관리 콜백
async session({ session, user, token }) {
return session; // 세션 반환
},
// JWT 생성 콜백
async jwt({ token, user, account, profile, isNewUser }) {
return token; // 생성된 JWT 반환
}
}
- signIn/signOut: 사용자가 로그인할 때 호출됩니다. 로그인 성공 여부를 결정하는 true 또는 false를 반환할 수 있습니다.
- redirect: 로그인 후 리디렉션할 URL을 설정합니다.
- session: 세션 객체를 반환하여 사용자의 세션 정보를 관리할 수 있습니다.
- jwt: JWT를 생성하는 콜백으로, 사용자의 정보를 포함하는 token을 반환합니다.
JWT와 Session 방식이란?
- JWT (JSON Web Tokens):
- JWT는 사용자 인증 및 권한 부여에 사용되는 두 가지 주요 방식 중 하나입니다.
- JWT는 Json Web Token의 약자로, Json 형식을 이용해 인증에 필요한 정보를 암호화한 웹 토큰입니다. JWT 토큰 예시:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKF2QfT4fwPEw2fx1M36p5rJ89Aaq34
이 토큰은 인증과 정보 교환을 위한 안전한 방법으로, 서버에서 클라이언트에게 전달된 후 클라이언트가 서버에 다시 요청할 때마다 사용됩니다.
- 세션 (Session):
- 세션은 웹 애플리케이션에서 사용자의 상태 정보를 저장하고 관리하는 방식입니다.
- 세션은 사용자가 웹 서비스와 상호작용할 때 생성되며, 사용자의 상태 정보를 서버 측에 저장하여 관리합니다. 세션 예시: 세션 데이터는 서버에 저장되며, 사용자 식별을 위한 고유 ID를 사용하여 서버에서 상태를 추적합니다.
Session vs JWT
구분 | Session | JWT |
---|---|---|
저장 위치 | 서버 측에서 사용자 데이터를 저장하며, 클라이언트는 세션 ID만을 가지고 있음 | 클라이언트 측에서 사용자 데이터를 포함하는 토큰을 저장 |
확장성 | 서버에서 세션을 관리하므로 서버 자원을 사용 | 클라이언트 측에서 토큰을 검증함으로써 서버 리소스를 덜 사용하고 확장성이 더 뛰어남 |
보안 | 서버에서 데이터를 안전하게 관리하므로 데이터 유출 가능성이 낮음 | 토큰은 안전하게 서명되어 있지만 클라이언트 측에 저장되므로 XSS 공격에 노출될 수 있음 |
사용 사례 | 로그인 상태 관리, 권한 부여, 사용자 데이터 관리 등에 적용 | 분산 시스템, API 인증, 단일 로그인 (SSO) 등에 적용 |