Ch.26 인증과 보안 기초 — 로그인 구현
OAuth와 소셜 로그인
구글로 로그인 버튼 하나로 회원가입 끝?
이메일 인증, 비밀번호 해싱, 비번 찾기... 직접 만들면 한 달이 걸립니다. 하지만 소셜 로그인을 쓰면 하루면 됩니다.
소셜 로그인은 내부적으로 어떻게 동작할까?
OAuth 2.0 — 외부 서비스(구글, 카카오)에 인증을 위임하는 표준 프로토콜입니다.
핵심 내용
OAuth는 대리 인증입니다 구글이 대신 신원을 확인해줍니다
1. 로그인 클릭: 사용자가 "구글로 로그인" 버튼 클릭
2. 구글 이동: 구글 로그인 페이지로 리다이렉트
3. 인증 완료: 구글에서 이메일/비번 확인 후 코드 발급
4. 콜백: 코드를 가지고 우리 앱으로 돌아옴
5. 토큰 교환: 서버가 코드로 액세스 토큰을 받아옴
[사용자] → "구글로 로그인" 클릭
↓
[우리 앱] → 구글 인증 서버로 리다이렉트
↓
[구글] → 사용자 로그인 확인 → authorization code 발급
↓
[우리 앱 서버] → code로 access_token 요청
↓
[구글] → access_token + 사용자 정보 반환
↓
[우리 앱] → 세션 생성, 로그인 완료!핵심: 우리 앱은 사용자의 비밀번호를 절대 모릅니다. 구글이 "이 사람 맞아요"라고 확인해주는 것뿐입니다.
Supabase Auth로 5줄이면 소셜 로그인 완성
// Supabase 소셜 로그인 — 단 5줄
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
// 구글 로그인
async function signInWithGoogle() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: "google",
options: {
redirectTo: "https://myapp.com/auth/callback",
},
});
}
// 카카오 로그인 — provider만 바꾸면 됨
async function signInWithKakao() {
await supabase.auth.signInWithOAuth({
provider: "kakao",
});
}// 현재 로그인 사용자 정보 가져오기
const { data: { user } } = await supabase.auth.getUser();
console.log(user?.email); // "user@gmail.com"
console.log(user?.id); // "uuid-1234-5678"
// 로그아웃
await supabase.auth.signOut();바이브 코더 팁: Supabase 대시보드 → Authentication → Providers에서 구글/카카오를 활성화하고 Client ID만 넣으면 준비 완료입니다.
로그인 안 한 사용자는 자동으로 로그인 페이지로 보냅니다
// middleware.ts — Next.js 미들웨어
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { createClient } from "@/lib/supabase/middleware";
export async function middleware(request: NextRequest) {
const { supabase, response } = createClient(request);
const { data: { session } } = await supabase.auth.getSession();
// 로그인 안 했으면 → /login으로 리다이렉트
if (!session && request.nextUrl.pathname.startsWith("/dashboard")) {
return NextResponse.redirect(new URL("/login", request.url));
}
return response;
}
export const config = {
matcher: ["/dashboard/:path*", "/settings/:path*"],
};핵심: 클라이언트에서만 인증을 체크하면 우회 가능합니다. 반드시 서버(미들웨어)에서도 인증을 확인하세요.
OAuth 2.0에서 우리 앱이 구글로부터 먼저 받는 것은?
OAuth 소셜 로그인을 사용하면 우리 앱 서버에 사용자의 구글 비밀번호가 저장된다.
보호된 라우트에서 인증을 확인하기 가장 안전한 위치는?
핵심 용어
미들웨어 방식
요청이 페이지에 도달하기 전에 인증 확인. 가장 안전
컴포넌트 방식
페이지 컴포넌트 내에서 useSession 체크. 간단하지만 깜빡임 가능
서버 컴포넌트 방식
서버에서 세션 확인 후 렌더링. Next.js App Router에 적합
정리 노트
OAuth & 소셜 로그인 핵심 정리
OAuth 기본
- OAuth
- 제3자 서비스(Google, GitHub 등)에 인증을 위임하는 표준 프로토콜
- 소셜 로그인
- 사용자가 별도 회원가입 없이 기존 계정으로 로그인
- 장점
- 비밀번호 관리 부담 없이 보안성 높은 인증 구현 가능
보호된 라우트
- 미들웨어
- 요청이 페이지에 도달하기 전에 인증 여부를 확인하는 가장 안전한 방법
- 리다이렉트
- 미인증 사용자를 로그인 페이지로 자동 이동
보호된 라우트는 클라이언트가 아닌 서버 미들웨어에서 체크하는 것이 가장 안전합니다.
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작