반응형
snowman95
코딩수련장
snowman95
전체 방문자
오늘
어제
  • 분류 전체보기 (229)
    • 앱테크 (3)
    • 옵시디언 (5)
    • 드라마, 영화 (1)
    • 개발자 이야기 (23)
    • 프로젝트 (10)
      • 프로젝트 방법론 (7)
      • 프로젝트 기록 (2)
      • Github (1)
    • 개발 지식 (0)
      • 디자인 패턴 (0)
    • 프론트엔드 개발 (5)
      • 테크트리 (2)
      • React.js (19)
      • ReactNative (2)
      • Next.js (6)
      • GraphQL (6)
      • 패키지 매니저 (2)
      • 라이브러리 (3)
      • 상태관리 라이브러리 (4)
      • Web 지식 (3)
      • HTML CSS (26)
      • Javascript (16)
      • 도구 (Tool) (3)
      • 성능 최적화 (1)
      • 디자인시스템 (0)
    • Python (53)
      • 모음집 (1)
      • 문법 (12)
      • 라이브러리 (15)
      • 알고리즘 (10)
      • 백준 문제풀이 (9)
      • 코딩테스트 (2)
      • 도구 (Tool) (3)
    • C++ (20)
      • 알고리즘 (6)
      • 삼성SW기출 (6)
      • 삼성 A형 (6)
    • 데이터사이언스 (1)
    • 인프라 (9)
      • 하드웨어 지식 (4)
      • Ansible (2)
      • Database (2)
      • 쉘스크립트 (1)
    • 주식 (0)
    • 취업 준비 (4)
      • 취업 이야기 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 공간복잡도
  • 전공 요약 #네트워크
  • 삼성SDS
  • 전공 요약 #운영체제
  • 오블완
  • nextjs
  • 전공요약
  • 기계식키보드 #nuphy
  • 백준
  • C++
  • 전공 요약 #데이터베이스
  • 면접
  • 삼성SW역량테스트
  • A형
  • 나의 해방일지
  • GraphQL
  • 알고리즘
  • Next.js #graphql #tailwind.css
  • 티스토리챌린지
  • 언어

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
snowman95
프론트엔드 개발/Next.js

Next.js 에서 소셜 로그인 구현하기 (next-auth.js 사용)

Next.js 에서 소셜 로그인 구현하기 (next-auth.js 사용)
프론트엔드 개발/Next.js

Next.js 에서 소셜 로그인 구현하기 (next-auth.js 사용)

2023. 2. 18. 14:57
728x90
반응형

Next.js 에서 next-auth 라이브러리 사용하여 소셜 로그인을 구현하는 글 입니다.

소셜 로그인(카카오, 네이버) 과 커스텀 로그인 두가지 모두 구현해보겠습니다.

 

 

next-auth

next-auth 라이브러리는 쉽게 인증 로직을 구현하기 위한 Next.js 전용 라이브러리입니다.

모든 OAuth 서비스와 함께 작동하도록 설계되었으며 OAuth 1.0 , 1.0A , 2.0 및 OpenID Connect를 지원 하며 가장 널리 사용되는 로그인 서비스를 기본적으로 지원합니다.

OAuth 동작 과정에 대해서는 이곳을 참고하세요

 

물론 인증 로직을 직접 구현해도 되지만, 쉽고 빠르게 할 수 있는 라이브러리를 쓰면 정신 건강에 이롭습니다.

 

NextAuth.js

Authentication for Next.js

next-auth.js.org

 

현재는 Auth.js 라는 새로운 이름으로 변경되어 Next.js 뿐만 아니라 SolidStart, SvelteKit 에서도 지원하기 위해 개발 진행 중입니다.

Auth.js는 본 게시물 포스팅 시점 기준으로 0.4.0 버전 릴리즈 되었고, 공식 문서에 EXPERIEMNTAL 공지가 되어 있어서 아직은 next-auth  를 사용하는게 좋을 듯 합니다.

  • https://www.npmjs.com/package/next-auth ✅
  • https://www.npmjs.com/package/@auth/core 🚧👷‍♂️

 

과정 요약

얼마나 과정이 간단한 지 보십시오.

 

서버 (next.js api router 를 사용)

  • Provider의 개발자 포털에서 애플리케이션을 등록하고 리다이렉션 URI 설정 및 Key를 발급 받습니다.
    • 리다이렉션 URI 은 /api/auth/callback/[provider] 와 같은 형태가 되어야 합니다.
      • 로컬 예시 : http://localhost:3000/api/auth/callback/twitter
      • 프로덕션 예시 : https://next-auth-example.vercel.app/api/auth/callback/google
    • key는 .env 파일에 안전하게 보관합니다.
  • pages/api/auth/[...nextauth].ts 파일 생성하고 NextAuth 의 providers에 원하는 OAuth provider를 추가해줍니다.

 

클라이언트

  • _app.tsx 파일에서 리액트 앱 최상위 요소를 SessionProvider 로 감싸줍니다.
  • 로그인 페이지에서 signIn(), signOut() : 로그인, 로그아웃 실행 함수를 호출합니다.
  • 로그인 정보를 불러오고 싶다면 useSession() hook을 호출합니다.

참고로 로그인 시 토큰이 쿠키에 저장되기 때문에 쿠키가 만료되지 않으면 새로고침 시에도 로그인이 유지됩니다.

그리고 리액트 앱 최상위 요소를 SessionProvider 로 감싸주었기 때문에 DOM 어디서든 session 정보를 가져와서 사용 가능합니다.

 

 

🎉

이게 끝입니다! 얼마나 간단합니까?  👏👏👏  

이후로는 상세하게 과정 하나하나 살펴보겠습니다.

 

 

개발 환경

본 게시물 에서는 next 13 버전에서 pages 디렉토리 방식을 사용합니다.

"next": "13.1.3", 
"next-auth": "^4.19.2",

 

카카오 소셜 로그인

Kakao Developers 에 접속합니다.

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

회원가입 후 애플리케이션 등록을 해줍니다.

 

내 애플리케이션 - 앱설정 - 앱키 탭에 들어가서 REST API 키를 복사합니다.

 

내 애플리케이션 - 제품 설정 - 카카오 로그인 - 보안 탭에 들어가서 Client Secret 코드를 발급 받습니다.

그리고 Client Secret 코드를 복사합니다.

그리고 내 애플리케이션 - 제품 설정 - 카카오 로그인 탭에 들어가서 Redirect URI 등록 합니다.

  • http://localhost:3000/api/auth/callback/kakao

 

끝났습니다. 아까 복사한 키를 .env 파일에 넣어줍니다.

// .env
KAKAO_CLIENT_ID=RESTAPI키
KAKAO_CLIENT_SECRET=보안키

 

서버

  • providers 배열에 KakaoProvider 를 추가해줍니다.

 

클라이언트

  • 리액트 앱 최상위 요소를 SessionProvider 로 감싸줍니다.

  • 로그인 페이지에서는 signIn("kakao") 로 로그인, signOut() 으로 로그아웃 가능합니다.
  • useSession() 을 통해 로그인한 유저의 정보를 가져올 수 있습니다.

 

 

 

네이버 소셜 로그인

Naver Developers 에 접속합니다.

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

 

회원가입 후 애플리케이션 등록 해줍니다.

애플리케이션 등록시 필요한 유저 정보를 선택 해줍니다.

그리고 서비스 URL 과 네이버 로그인 Callback URL을 추가로 설정해줍니다.

 

내 애플리케이션 페이지에 들어가면 정보를 볼 수 있습니다.

거기서 Client ID 와 Client Secret 를 복사하여 .env 파일에 추가해줍니다.

// .env
NAVER_CLIENT_ID=클라이언트ID
NAVER_CLIENT_SECRET=클라이언트시크릿

 

서버

  • providers 배열에 KakaoProvider 를 추가해줍니다.

 

클라이언트

  • 리액트 앱 최상위 요소를 SessionProvider 로 감싸줍니다.
  • 로그인 페이지에서는 signIn("kakao") 로 로그인, signOut() 으로 로그아웃 가능합니다.
  • useSession() 을 통해 로그인한 유저의 정보를 가져올 수 있습니다.

 

 

커스텀  로그인

서버

  • providers 배열에 CredentialsProvider 를 추가해줍니다.
  • 설명은 코드의 주석 참고 바랍니다.

 

Provider 마다 제공하는 정보가 다르고 변수명이 달라서 그런지 next-auth 의 session 은 아래와 같이 3가지 공통 정보만 다룹니다.

그런데 실제론 저 셋 말고도 다른 정보를 세션이 넣어서 사용하고 싶을 수 있습니다. (아까 소셜 로그인에서도 마찬가지입니다.)

그래서 Session 타입을 재정의 해줘야 합니다.

types/next-auth.d.ts 파일을 만들어서 아래와 같이 원하는 형태로 재정의 해줄 수 있습니다.

 

마지막으로 로그인 폼을 만들어줍니다.

주목할 부분은 signIn("credentails") 의 두번째 매개변수(옵션) 안에 유저가 입력한 정보가 넘어간다는 것 입니다.

 

결과

로그인 전 화면

 

로그인 후 화면

 

/login 페이지 접근 제어

로그인 완료한 유저는 /login 페이지에 접근하면 안됩니다.

그래서 로그인 접근 제어 하는 기능도 마지막으로 추가해보겠습니다.

 

미들웨어를 사용하면 요청이 완료되기 전에 코드를 실행할 수 있으며 들어오는 요청에 따라 요청 또는 응답 헤더를 다시 작성, 리디렉션, 수정하거나 직접 응답하여 응답을 수정할 수 있습니다.

 

 

Advanced Features: Middleware | Next.js

Learn how to use Middleware to run code before a request is completed.

nextjs.org

 

middleware.ts 파일을 추가해줍니다. 그냥 / 경로에 추가해주면 됩니다. 🎉

 

반응형
저작자표시 비영리 동일조건 (새창열림)

'프론트엔드 개발 > Next.js' 카테고리의 다른 글

[프로젝트 기록] Next.js 의 SSG 는 너무 느려서 못써먹겠다.  (4) 2024.09.30
Next.js + React Native 크로스 플랫폼 개발을 위한 Solito, NativeWind 소개  (0) 2023.10.03
Next.js 13 버전에서 ReactQuery 사용시 서버 컴포넌트에서 클라이언트 컴포넌트로 pre-fetch 데이터 전달하는 방법  (4) 2023.02.05
웹 프레임워크 Next.js 는 무엇인가요? (프론트 면접 질문)  (0) 2023.02.05
Next 13 버전에서 App 디렉토리 사용방법 및 소개  (3) 2023.01.30
  • next-auth
  • 과정 요약
  • 개발 환경
  • 카카오 소셜 로그인
  • 서버
  • 클라이언트
  • 네이버 소셜 로그인
  • 서버
  • 클라이언트
  • 커스텀  로그인
  • 서버
  • 결과
  • 로그인 전 화면
  • 로그인 후 화면
  • /login 페이지 접근 제어
'프론트엔드 개발/Next.js' 카테고리의 다른 글
  • [프로젝트 기록] Next.js 의 SSG 는 너무 느려서 못써먹겠다.
  • Next.js + React Native 크로스 플랫폼 개발을 위한 Solito, NativeWind 소개
  • Next.js 13 버전에서 ReactQuery 사용시 서버 컴포넌트에서 클라이언트 컴포넌트로 pre-fetch 데이터 전달하는 방법
  • 웹 프레임워크 Next.js 는 무엇인가요? (프론트 면접 질문)
snowman95
snowman95
(17~19) Unity/Unreal Engine 게임 프로그래머 (20~21) System Administrator ___________ (22~) React 웹 프론트앤드 개발자 __________ 깃헙 : https://github.com/snowman95

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.