NextAuth에서 session 업데이트

힘센캥거루
2025년 1월 13일(수정됨)
3
87

로그인 구현까지는 글이 많아서 어렵지 않았으나 session 정보를 업데이트에 대한 것은 적었다.

그래서 한번 적어보는 session 정보 업데이트.

이번에도 둘러볼 것은 역시나 NextAuth 공식문서이다.

NextAuth에서 session 업데이트-1

session 정보 업데이트 순서는 아래와 같다.

  1. useSession의 update로 세션 업데이트 및 트리거 발생

  2. authConfig에서 update 트리거에 따른 jwt 재설정

  3. 업데이트 후 페이지 새로고침

그럼 코드를 먼저 보자.

1. Session 업데이트

일단 공식 문서에 있는 예제는 아래와 같다.

import { useSession } from "next-auth/react";

export default function Page() {
  const { data: session, status, update } = useSession();

  if (status === "authenticated") {
    return (
      <>
        <p>Signed in as {session.user.name}</p>
        // 업데이트 값을 서버 측으로 전송
        <button onClick={() => update({ name: "John Doe" })}>Edit name</button>
        // 서버측에서 이미 값을 업데이트 했다고 하고 가정. 트리거만 실행 // 모든
        `useSession().data` 가 업데이트.
        <button onClick={() => update()}>Edit name</button>
      </>
    );
  }

  return <a href="/api/auth/signin">Sign in</a>;
}

그냥 간단하게 하고 싶다면 update에 파라미터로 객체를 넣어주면 된다.

내 홈페이지에도 한번 적용해 보았다.

필요없는 코드들은 간략하게 줄이고 주석을 달아 넣어보았다.

"use client";

import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";

export default function Profile() {
  const router = useRouter();
  const { update } = useSession();

  async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();

    // 폼 데이터를 만들고 데이터 주입
    const formData = new FormData();
    formData.append("nickName", value);

    // api fetch를 통해 백앤드 업데이트
    const res = await fetch("/api/editProfile", {
      method: "POST",
      body: formData,
    });
    const resJson = await res.json();

    // 성공할 경우 update로 session 업데이트 및 트리거 실행
    if (resJson.success === "success") {
      // 데이터를 객체 구조로 만들고 업데이트 함.
      const updateObj: Record<string, string | boolean> = {};
      userInputTable.forEach((each: userInputTableObj) => {
        updateObj[each.name] = each.value as string;
      });

      // 업데이트 기다린 후 새록침 하려고 await
      await update(updateObj);

      // 세선 업데이트로 navbar 업데이트를 위한 새로고침
      router.refresh();
    }
  }
  return (
    <form onSubmit={(e) => handleSubmit(e)}>
      <input
        // userInput.value는 대충 useState로 설정한것
        value={userInput.value}
        onChange={(e) => handleChange(e)}
      />
        <button type="submit">가입</button>
    </form>
  );
}

핵심은 update로 객체로 session 정보를 업데이트 하는 것이다.

이제 업데이트 된 session으로 토큰을 갱신하자.

2. AuthOptions

공식문서에는 대충 아래처럼 되어 있다.

NextAuth의 파라미터 중 callbacks로 jwt 옵션을 준다.

update 트리거 발생하고 session.name이 있다면 토큰을 업데이트 한다.

...
export default NextAuth({
  // 중략 ...
  callbacks: {
    jwt({ token, trigger, session }) {
        // 세션은 임의의 객체일 수 있으므로 검증이 필요함.
      if (trigger === "update" && session?.name) {
        token.name = session.name
      }
      return token
    }
  }
})

이건 뭐 거의 바꿀게 없어서 그대로 적용했다.

이렇게 하고나면 세션이 업데이트는 끝이다.

3. 테스트하기

NextAuth에서 session 업데이트-2

이제 로그인 후 프로필 닉네임을 변경하면서 테스트해보자.

닉네임을 바꿔가며 SSR로 구현했던 navbar의 프로필이 잘 변경되는지 확인해보았다.

잘 되는것 같다.

4. 후기

NextAuth에서 session 업데이트-3

생각보다 세션 업데이트는 쉽게 구현되었다.

검색도 많이했지만, 결국에는 돌고 돌아 공식문서였다.

뭔가 잘 안되면 먼저 공식문서를 꼼꼼히 읽어보길 권해본다.

관련 글

Next.js 풀스택 블로그 개발기
Next.js 풀스택 블로그 개발기
웹개발을 처음 접한지 1년정도 되었을 때, 나만의 블로그를 갖고싶다는 생각을 하게 되었다.그래서 6개월 정도 여기에만 매달려서 만들어보게 되었다.프론트 앤드에서의 기능은 아래 김도형님의 블로그를 참고하는 것으로 충분할 듯하다.나도 mdx를 이용해 블로그를 만드는데는 채...
Caddy를 이용한 Nextjs 무중단 배포(로컬서버)
Caddy를 이용한 Nextjs 무중단 배포(로컬서버)
홈페이지에 뭔가 자꾸 얹고 싶은 욕심이 들 때 마다 빌드를 했더니, 그 사이에 가끔 접속하는 사람이 종종 있긴 한것 같다.그러다 보니 서치콘솔에서 점수가 점점 하락하는 현상이 발생했다.이대로는 안될 것 같아 무중단 배포를 하는 방법을 생각해 보게 되었다.1. 대표적인 ...
구글 검색 색인 자동화 - Web Search Indexing API
구글 검색 색인 자동화 - Web Search Indexing API
지난번 IndexNow에 이어, 구글도 자동화를 해보기로 했다.찾아보니 구글은 API로 Web Search Indexing이라는 걸 지원하고 있었다.1. 허용범위공식적으로 해당 API가 지원하는 범위는 채용공고와 스트리밍 영상 서비스이다.실시간이 중요한 내용에 대해 색...
검색 색인 생성 자동화 - IndexNow
검색 색인 생성 자동화 - IndexNow
Bing에 검색등록을 하다가 알게 되었는데, Bing에서는 IndexNow라는 기능을 제공한다.핵심은 API 키를 이용해서 글을 쓰자마자 바로 색인 요청을 날릴 수 있다는 것.아래와 같은 요청을 fetch로 만들고, 글쓰기에 연동해 놓으면 글을 DB에 저장함과 동시에 ...
Nextjs, React 서버 해킹당한 경험 - React2Shell
Nextjs, React 서버 해킹당한 경험 - React2Shell
맨 처음 보안 이슈를 접했던건 12월 5일 새벽이었다.리액트에서 인증 없이 원격 코드 실행이 가능하다는 것.해당 뉴스를 접하고 다른 사람에게 알렸지만, 나는 괜찮으려니 싶어 아무 생각없이 넘겼다.1. 해킹 흔적 발견그런데 블로그 코드를 업데이트 하려고 접속했더니 터미널...
블로그에 다국어 기능 추가하기(NextJS, next-intl, Vercel AI SDK)
블로그에 다국어 기능 추가하기(NextJS, next-intl, Vercel AI SDK)
최근 블로그에 다국어 기능이 필요하다는 생각이 들었다.그래서 next-intl을 이용해 다국어 서비스를 구현해보기로 했다.1.i18n먼저 다국어 서비스를 할 때는 지켜야 할 원칙들이 있다.이걸 internationalization이라고 하는데, 무척 길기에 첫글자 i와...

댓글을 불러오는 중...