OAuth 2.0이란?
OAuth 2.0은 사용자 인증을 위한 개방형 표준 프로토콜로, 사용자가 다른 웹사이트에 자신의 정보를 제공할 때 비밀번호와 같은 민감한 정보를 직접 전달하지 않고도 안전하게 인증할 수 있는 방법이다.
예를 들어,
1. 당신이 새로운 서비스에 가입하려고 할 때
2. "Google로 계속하기" 버튼을 클릭하면
3. Google 로그인 창이 뜨고
4. 승인하면 새로운 서비스는 당신의 Google 계정 정보 중 필요한 부분만 안전하게 전달받아 사용
이러한 과정이 바로 OAuth 2.0 프로토콜을 통해 이루어진다.
왜 소셜 로그인인가?
- 사용자 측면
- 새로운 계정 생성 불필요
- 비밀번호 기억/관리 부담 감소
- 신뢰할 수 있는 플랫폼을 통한 안전한 인증
- 개발자 측면
- 보안 인증 로직 구현 부담 감소
- 신뢰할 수 있는 사용자 정보 획득
- 사용자 DB 관리 부담 감소
Google과 Kakao OAuth를 선택한 이유
- Google OAuth
- 전 세계적으로 가장 널리 사용되는 소셜 로그인 서비스
- OAuth 2.0의 표준적인 구현을 제공
- 상세한 개발 문서와 안정적인 서비스 제공
- 무료로 시작할 수 있는 충분한 API 쿼터
- Kakao OAuth
- 국내 사용자들에게 친숙한 플랫폼
- 간편한 개발자 센터와 문서 제공
- 한글 문서와 기술 지원
- 무료 API 제공과 높은 쿼터 제한
이러한 두 플랫폼의 구현을 통해 국내외 사용자들을 모두 고려한 소셜 로그인 시스템을 구축할 수 있다.
의존성 설치
# 주요 의존성 설치
npm install express dotenv passport passport-google-oauth20 passport-kakao express-session
# 개발 의존성 설치
npm install --save-dev nodemon
각 패키지의 역할
- express: 웹 서버 프레임워크
- dotenv: 환경 변수 관리
- passport: 인증 미들웨어
- passport-google-oauth20: Google OAuth 2.0 인증 전략
- passport-kakao: Kakao OAuth 인증 전략
- express-session: 세션 관리
- nodemon: 개발 시 자동 서버 재시작 도구
OAuth 인증 정보 설정
Google OAuth 설정
- [Google Cloud Console](https://console.cloud.google.com/) 접속
- 새 프로젝트 생성
- "API 및 서비스" → "사용자 인증 정보" 메뉴로 이동
- "OAuth 동의 화면" 구성
- 애플리케이션 이름 설정
- 사용자 지원 이메일 입력
- 개발자 연락처 정보 입력
- "사용자 인증 정보" → "사용자 인증 정보 만들기" → "OAuth 클라이언트 ID" 선택
- 애플리케이션 유형: "웹 애플리케이션" 선택
- 승인된 리디렉션 URI 추가: `엔드포인트 입력`
Kakao OAuth 설정
- [Kakao Developers](https://developers.kakao.com/) 접속
- 애플리케이션 추가
- "플랫폼" 설정에서 Web 플랫폼 등록
- 사이트 도메인: `도메인 서버 입력` - "카카오 로그인" 설정
- 활성화 설정: ON
- Redirect URI 등록: `엔드포인트 입력`
- REST API 키(클라이언트 ID) 확인
OAuth 인증 로직 구현
Passport 전략 설정
// Google 전략
passport.use(
new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/google/callback"
},
async (accessToken, refreshToken, profile, done) => {
// profile에서 필요한 정보 추출 후 사용자 객체 생성
return done(null, user);
})
);
// Kakao 전략
passport.use(
new KakaoStrategy({
clientID: process.env.KAKAO_CLIENT_ID,
callbackURL: "http://localhost:3000/auth/kakao/callback"
},
async (accessToken, refreshToken, profile, done) => {
// profile에서 필요한 정보 추출 후 사용자 객체 생성
return done(null, user);
})
);
인증 라우트
// 로그인 시작
router.get("/google",
passport.authenticate("google", { scope: ["profile", "email"] })
);
router.get("/kakao",
passport.authenticate("kakao")
);
// 인증 콜백
router.get("/google/callback",
passport.authenticate("google", {
successRedirect: "/",
failureRedirect: "/"
})
);
router.get("/kakao/callback",
passport.authenticate("kakao", {
successRedirect: "/",
failureRedirect: "/"
})
);
// 프로필 조회 (보호된 라우트)
router.get("/profile", isAuthenticated, (req, res) => {
// 사용자 정보 표시
});
인증 흐름
- 사용자가 로그인 버튼 클릭
- OAuth 제공자 로그인 페이지로 이동
- 로그인 성공 시 콜백 URL로 리다이렉트
- 사용자 정보를 세션에 저장
- 메인 페이지('/')로 리다이렉트
프로젝트 회고
이번 토이 프로젝트를 통해 OAuth 2.0 기반의 소셜 로그인 구현 과정을 살펴보았다.
기술적 성과
- Passport.js를 활용한 인증 시스템 구현
- Google과 Kakao OAuth 전략의 성공적인 통합
- 세션 기반 사용자 인증 관리 구현
학습 포인트
- OAuth 2.0 프로토콜의 동작 방식 이해
- 소셜 로그인의 보안적 이점 파악
- 미들웨어를 활용한 모듈화된 코드 구조 설계
현재 OAuth를 활용한 소셜 로그인 구현은 현대 웹 서비스에서 필수적인 기능이 되었다. 이 프로젝트를 통해 구현한 기본적인 소셜 로그인 시스템은 향후 다양한 프로젝트에서 활용할 수 있는 좋은 시작점이 될 것이라 생각한다.
[Git 주소] https://github.com/HolySSA/oauth-login-toy
GitHub - HolySSA/oauth-login-toy
Contribute to HolySSA/oauth-login-toy development by creating an account on GitHub.
github.com
[Passport.js 공식 문서] http://www.passportjs.org/
Passport.js
Simple, unobtrusive authentication for Node.js
www.passportjs.org
[Google OAuth 2.0 가이드] https://developers.google.com/identity/protocols/oauth2
OAuth 2.0을 사용하여 Google API에 액세스하기 | Authorization | Google for Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 OAuth 2.0을 사용하여 Google API에 액세스하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
developers.google.com
[Kakao 로그인 가이드] https://developers.kakao.com/docs/latest/ko/kakaologin/common
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com

'Side Projects' 카테고리의 다른 글
Node.js로 구현하는 AI 챗봇 비교 분석: Gemini vs Grok vs OpenAI (0) | 2025.03.05 |
---|---|
체스말 이동하기 로직 (0) | 2025.02.21 |
채팅 시스템 성능 향상시키기 (0) | 2025.02.18 |
Git Actions? (0) | 2025.02.16 |
DI(의존성 주입)? (0) | 2025.01.12 |