인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

Next + React Query로 SNS 서비스 만들기

로그아웃 & 로그인 여부에 따라 화면 다르게 하기

Next-Auth 관련해서 질문이 있습니다.

작성

·

36

0

백엔드 취준생인데 프론트를 좀 할 일이 있어서 강의 듣고 있는데 Next-Auth 부분이 이해가 쉽지 않네요... 몇 가지 질문 드리고자 합니다.

1. session 객체에 어떤게 담기는건지 잘 모르겠습니다.

export default async function Home() {
    const session = await auth()
    if (session?.user) {
        redirect('/home')
        return null
    }
    return (
        <Main/>
    );
}
export const {
    handlers: { GET, POST },
    auth,
    signIn,
} = NextAuth({
    // 개발자가 직접 만든 화면에서 로그인 하도록 진행
    pages: {
        signIn: '/i/flow/login', // 로그인
        newUser: '/i/flow/signup' // 회원가입
    },
    providers: [
        CredentialsProvider({
            async authorize(credentials) {
                const authResponse = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/login`, {
                    method: 'POST',
                    headers: {
                        "Content-Type": "application/json",
                    },
                    body: JSON.stringify({
                        id: credentials.usename,
                        password: credentials.password,
                    })
                })

                if (!authResponse.ok) {
                    return null
                }

                const user = await authResponse.json()

                return {
                    email: user.id,
                    name: user.nickname,
                    image: user.image,
                    ...user
                }
            }
        })
    ],
})

Home 에서 auth() 를 통해 불러온 session 객체에 CredentialsProvider 가 리턴한 객체가 담기는건가요?

그런데 그렇다고 하기엔 객체에 user 라는 속성이 없어서 아닌 것 같기도 해서 아닌 거 같다는 생각도 듭니다.

export default function Login() {
    const router = useRouter()
    const { data: session } = useSession();

    if (session?.user) {
        router.replace('/home')
        return null
    }

    router.replace("/i/flow/login")
    return (
        <Main />
    )
}

마찬가지로 여기서도 session 에 어떤게 담기는지 잘 모르겠습니다 ㅠㅠ auth() 로 리턴한 세션과 같은 객체가 담기는 것 같긴 한데 도대체 session 에 뭐가 담기는지 파악이 쉽지 않네요 ㅋㅋㅋ

그래서 session 객체의 user 를 클릭해서 들어가보니 다음과 같은 interface 가 나오네요.

export interface DefaultSession {
  user?: User
  expires: ISODateString
}

auth/core 에 있는 인터페이스인 것 같은데 이 인터페이스가 어느 시점에 등장(?) 하는 건지 잘 모르겠습니다.


2. 지금 진행하는 로그인 방식은 백엔드에 로그인 관련 API 가 있다고 가정하고 진행하는 것으로 저는 이해를 했는데요

export const handlers = [
    http.post(`${baseUrl}/api/login`, () => {
        console.log('로그인');
        return HttpResponse.json(User[1], {
            headers: {
                'Set-Cookie': 'connect.sid=msw-cookie;HttpOnly;Path=/'
            },
        })
    }),
    http.post(`${baseUrl}/api/logout`, () => {
        console.log('로그아웃');
        return new HttpResponse(null, {
            headers: {
                'Set-Cookie': 'connect.sid=;HttpOnly;Path=/;Max-Age=0'
            }
        })
    }),
    http.post(`${baseUrl}/api/users`, async ({ request }) => {
        console.log('회원가입');
        // return HttpResponse.text(JSON.stringify('user_exists'), {
        //     status: 403
        // })
        return HttpResponse.text(JSON.stringify('ok'), {
            headers: {
                'Set-Cookie': 'connect.sid=msw-cookie;HttpOnly;Path=/'
            },
        });
    })
];

이게 지금 api 를 mocking 한 건데 여기에 요청을 보내고 있으니까요.

그러면 이 API 에서 리턴한 유저(User[1]) 가 세션에 담기는 것인지 궁금하네요. (이것도 1번 질문하고 좀 연관이 되네요) 그러면 만약에 백엔드 API 가 로그인 성공했을 때 http body 에 별도의 객체를 리턴하지 않으면 어떻게 되나? 이런 궁금증도 생깁니다.

3. 그리고 로그아웃을 할 때는 왜 로그아웃 API 에 따로 요청을 보내지 않고 signOut 함수만 사용하는지 궁금합니다. 이것만 사용해도 쿠키가 삭제가 돼서 그런 것인가요? 그러면 백엔드 서버에 별도의 로그아웃 API 를 만들지 않아도 되는 것인지 궁금합니다.

장문의 질문글이 된 거 같은데, 뭔가 Next-Auth 를 처음 접하다보니 사용법이 좀 익숙치가 않네요.

AI 에 물어보거나 구글링을 해 봐도 좀 파악이 쉽지 않아 여기에 질문 남겨봅니다.

감사합니다.

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

  1. https://inf.run/nmqGv 여기 링크에서 커스텀 데이터 넣기를 보시면 됩니다. 그게 session 데이터가 됩니다.

  2. 백엔드 서버는 로그인 시 db의 유저/패스워드 정보가 일치하는지 확인 용도 정도로만 사용합니다. 물론 거기에서 받아온 데이터 중 일부가 session과 관련있지만 전체가 세션이 되는 건 아닙니다.

  3. 백엔드는 쿠키 유무로 로그인 여부를 판단하기 때문에 프론트 서버에서 쿠키를 지우면 로그아웃이 된걸로 판단합니다.

늦은 시간에 빠른 답변 감사드립니다!

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

질문하기