[사프] 카카오 Auth 적용

세나정·2025년 1월 7일
0

[PROJECT 3] Wedvice

목록 보기
2/2

이번엔 로그인 페이지에 들어갈 Kakao Auth 기능을 구현해 볼 것이다!

백엔드분이 카카오 Develeoper 계정을 통해 여러가지 API 관련 값들을 보내주었고 나는 프론트엔드에서 로그인 버튼을 생성한 뒤에 해당 주소로 통신만 하면 되는 간단한 문제이다!

(나는 Next 프레임 워크를 사용해 개발 중이기 때문에 타 블로그의 React와는 살짝 다른 부분이 존재할 수 있음)

자세한 설명은 아래 링크를 참고 :)
https://developers.kakao.com/docs/latest/ko/kakaologin/common

카카오 로그인 프로세스

상세 과정

키값 저장

  1. 백엔드분이 카카오 developers에서 애플리케이션을 생성했으면 해당 앱에 대한 여러 키가 생성되고 그 키를 전달받으면 된다.

또한, 위 뿐만이 아니라 카카오 로그인 탭에서 Redirect URI를 작성 해줘야함

위 정보는 내가 카카오 아이디를 입력 후 정상적으로 로그인 됐으면 '확인하고 계속하기' 버튼을 눌렀을 때 Redirect 되는 URI로 알고 있으면 될듯

  1. .env 파일에 관리

해당 정보는 보안과 관련 깊기때문에 절대 git에 올려선 안 됨
.env 파일에 관리하면 됨

이렇게 전달받은 여러 키값들을 env 파일에 저장을 했으면

로그인 버튼 구현

나는 아래처럼 window를 활용하여 로그인 핸들러를 작성한 후,
카카오가 제공하는 이미지 버튼에 onClick함수로 등록하여 이동할 수 있도록 했음

여기에서 KAKAO_AUTH_URL에 담긴 정보들은 우리가 env에 저장한 정보임을 다 알 것임!

'use client';

import React from 'react';

const Login = () => {
  const KAKAO_AUTH_URL = `${process.env.NEXT_PUBLIC_KAKAO_AUTH_URL}?client_id=${process.env.NEXT_PUBLIC_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_REDIRECT_URI}&response_type=code`;

  const loginHandler = () => {
    window.location.href = KAKAO_AUTH_URL;
  };

  return (
    <img
      src="/kakao_login_medium_wide.png"
      className="block hover:cursor-pointer"
      onClick={loginHandler}
    />
  );
};

export default Login;

로그인 화면에 삽입

이제 Login 컴포넌트를 작성했으니 (사실 LoginButton이라고 짓는 게 맞긴 함)

해당 버튼을 애플리케이션의 로그인 페이지 삽입 한 후에 클릭해보면

우리가 설정했던 RedirectURI로 인가코드가 들어 오는 것을 확인 가능
우리가 설정한 값 뒤에 code= ~ 머시기

그러면 이제 code를 파싱하는 로직을 만들어서 router이동과 db에 해당 인가코드값을 저장해주면 됨

'use client';

import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import axios from 'axios';

const Redirection = () => {
  const router = useRouter();
  const code = new URLSearchParams(window.location.search).get('code');
  const [accessTokenFetching, setAccessTokenFetching] = useState(false);

  console.log('code:', code);

  // Access Token 받아오기
  const getAccessToken = async () => {
    if (accessTokenFetching) return; // Return early if fetching

    console.log('getAccessToken 호출');

    try {
      setAccessTokenFetching(true); // Set fetching to true

      const res = await axios
        .post(
          'https://kauth.kakao.com/oauth/token',
          {
            authorizationCode: code,
          },
          {
            headers: {
              'Content-Type': 'application/json',
            },
          },
        )
        .then((res) => {
          const accessToken = res.data.accessToken;
          console.log('accessToken:', accessToken);

          localStorage.setItem('userName', res.data.user_name);

          setAccessTokenFetching(false); // Reset fetching to false
          // router.push('/Home');
        });
    } catch (error) {
      console.error('Error:', error);
      setAccessTokenFetching(false); // Reset fetching even in case of error
    }
  };

  useEffect(() => {
    if (code) {
      getAccessToken();
    }
  }, [code]);

  return <div>Loading...</div>;
};

export default Redirection;

그렇게 되면 위 페이지가 잠깐 나오고 우리가 설정한 Router 값으로 이동을 하면 끝!

중요.

여기에서 Redirect URI에 한 값은 우리가 로그인 성공했을 때 이동하는 페이지, 그렇기 때문에 우리는 라우팅이 되어있어야 해당 페이지로 이동을 할 수가 있음!

요약

되게 좋은 이미지가 있길래 참고하면 좋을 것 같다.

(출처 : https://data-jj.tistory.com/53)

  1. 로그인 버튼을 통해 인가코드 요청
  2. 날라온 인가코드를 백엔드에 전달
  3. 백엔드에서 토큰을 얻기위한 통신 진행
  4. 받아온 토큰을 활용하여 리다이렉트 및 프론트에서 로그인 적용

인가코드를 받아오고 그 인가코드를 백엔드에 전달을 해서 백엔드에서 카카오 API와 통신을하여 토큰을 받아야함

이러한 과정없이 프론트엔드에서만 통신을 하게 된다면 고소까지 갈 수 있는 큰 문제가 됨

결론적으로, 프론트엔드에서는 인가코드를 받아 전달만 하면 되고
받아온 토큰을 활용하여 페이지에 적용하면 되는 것

적용

  1. Redirection될 라우터를 생성해놓고 (Next)

  1. 토큰값을 받았을 때

리다이렉션될 페이지를 지정하여 이동

현재 내 프로젝트에는 백엔드의 작업 미완료로 인해 클라이언트에서 토큰까지 발급 받는 상황!

다음에 백엔드가 마무리 되어서 조건 렌더링을 통해 제대로된 로그인, 홈화면을 구현할 수 있었으면 좋겠다

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글