① 프론트엔드 ➡︎ 카카오 서버
프론트엔드에서 카카오 인증 서버에게 인가 코드
를 받아온다.
② 프론트엔드 ➡︎ 백엔드
카카오 인증 서버에서 받아온 인가 코드
를 백엔드로 전송한다.
③ 백엔드 ➡︎ 카카오 서버
전송 받은 인가 코드를 카카오 인증 서버에 전송 후 토큰을 요청하여 토큰을 받아온다. 받은 토큰을 이용하여 서버 전용 토큰
을 발행한다.
④ 백엔드 ➡︎ 프론트엔드
발행한 토큰
을 프론트엔드로 전송한다.
클라이언트와 서버 사이의 복잡한 인증 플로우를 간소화 시켜준다.
① next-auth ➡︎ 카카오 서버
next-auth에서 카카오에 인가를 요청
하고 사용자는 카카오 로그인 페이지에서 계정 정보를 입력해 로그인한다.
② 콜백 URL 리다이렉트
로그인에 성공하면 카카오는 next-auth의 콜백 URL로 리다이렉트한다.
③ 액세스 토큰 및 사용자 정보 요청
next-auth는 이 콜백 요청을 받아 카카오에게 액세스 토큰
을 요청한다. 액세스 토큰을 받아와서 next-auth가 카카오에게 사용자 정보를 요청하고, 카카오는 사용자 정보를 next-auth에게 전달한다.
④ 세션 저장
next-auth는 받아온 사용자 정보를 세션에 저장
하고, 세션 쿠키를 사용자의 브라우저에 저장한다.
로컬에서 개발 중이기 때문에 http://localhost:3000을 등록해준다.
프로그램을 등록하고 난 후에는 앱 키가 뜨는데 여기서 REST API 키를 복사해온다. 복사해온 키는 환경변수 KAKAO_CLIENT_ID에 저장해준다.
npm install next-auth
pages 폴더에 api를 생성한 경우의 코드를 사용했으나, 13버전부터는 app 라우터에 api를 생성할 수 있다. 13버전부터도 pages/api로 이용 가능하나, app 라우터로 api 로직을 작성하는 코드 중 편한 것을 고르면 된다.
import NextAuth from "next-auth/next";
import KaKaoProvider from "next-auth/providers/kakao"
export const authOptions = {
providers: [
KaKaoProvider({
clientId: process.env.KAKAO_CLIENT_ID,
clientSecret: process.env.KAKAO_CLIENT_SECRET,
}),
],
callbacks: {
async session(session) {
return session;
},
},
secret : process.env.NEXTAUTH_SECRET,
}
export default NextAuth(authOptions)
import NextAuth from "next-auth/next";
import KaKaoProvider from "next-auth/providers/kakao";
export const authOptions = {
providers: [
KaKaoProvider({
clientId: process.env.KAKAO_CLIENT_ID,
clientSecret: process.env.KAKAO_CLIENT_SECRET,
}),
],
callbacks: {
async session(session) {
return session;
},
},
secret : process.env.NEXTAUTH_SECRET,
}
const handler = NextAuth(authOptions)
export { handler as GET, handler as POST}
app 라우터에 api를 생성하면 모든 경로는 폴더로 생성해주고 파일은
route.js
로 만들어야 인식이 가능하다.
import { signIn } from "next-auth/react";
<button className="kakaoLogin" onClick={()=>{
signIn("kakao", {
redirect: true,
callbackUrl: '/',
})
}}/>
카카오 로그인 버튼을 눌렀을 때, 카카오로 로그인되는 버튼 코드으로 로그인을 하고 나면 '/' 경로로 리다이렉트 된다.
sessionProvider는 next-auth 라이브러리에서 제공하는 컴포넌트로, 앱의 모든 컴포넌트에서 세션 정보에 접근할 수 있게 해준다. 또한 직접 쿠키나 로컬 스토리지를 사용하여 세션 정보를 저장, 관리할 필요 없으며 보안적으로 안전하고 사용하기가 쉽다.
'use client'
import { SessionProvider } from "next-auth/react";
import React from "react";
export default function AuthSession(props) {
const { session, children } = props;
return <SessionProvider session={session}>{children}</SessionProvider>;
}
import AuthSession from "./provider/sessionProvider";
export default function RootLayout({ children }) {
return (
<html lang="en">
<body className={inter.className}>
<AuthSession>
{children}
</AuthSession>
</body>
</html>
);
}
import { signOut } from "next-auth/react";
<button className="kakaoLogout" onClick={()=>{
signOut({
redirect: true,
callbackUrl: '/',
})
}}/>