next.js를 사용하며 로그인 유지에 어려움을 겪고 있던 중에 next-auth라는 로그인 기능을 편리하게 해주는 라이브러리를 알게 되었다.
next-auth를 사용하면 백엔드로직까지 구현할 수 있어서 편한 것 같다.
여기에 미들웨어를 사용하면 좀 더 편리하게 관리할 수 있어 보이는데 현재 필요한 로그인 자체 기능만 임시로 구현해보겠다.
npm install next-auth
yarn add next-auth
// pages/api/auth/[...nextauth].ts
import NextAuth from "next-auth";
import KakaoProvider from "next-auth/providers/kakao";
export default NextAuth({
session: {
strategy: "jwt",
},
jwt: {
secret: "secret",
},
providers: [
KakaoProvider({
clientId: process.env.KAKAO_CLIENT_ID!,
clientSecret: process.env.KAKAO_CLIENT_SECRET!,
}),
],
pages: {
signIn: "/",
},
// 토큰이나 세션 활용하여 사용자 제어 시 사용하는 로직
callbacks: {
async jwt({ token, account }) {
// Persist the OAuth access_token to the token right after signin
if (account) {
token.accessToken = account.access_token;
}
return token;
},
async session({ session, token, user }) {
// Send properties to the client, like an access_token from a provider.
session.accessToken = token.accessToken;
return session;
},
},
});
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>
</>
)
}
세션 정보를 활용해서 프로필 사진과 이름이 헤더에서 보이도록 만들었다.
{!session ? (
<>
<button
onClick={() => signIn("kakao")}
>
로그인
</button>
</>
) : (
<>
<Image
src={session.user?.image}
alt="카카오프로필"
width={40}
height={40}
/>
{session.user?.name}님
<button
onClick={() => signOut()}
>
로그아웃
</button>
</>
)}