SKILL 40 min

DB + 회원가입 — 구글/카카오 OAuth

이 레슨이 끝나면

  • /v3-database로 User 모델 + 기본 사용자 테이블이 DB에 생성된다
  • /v3-auth로 구글 OAuth 또는 카카오 OAuth (또는 둘 다) 회원가입·로그인이 동작한다
  • 본인 PC localhost에서 실제로 구글로 로그인해 본다
  • 왜 이메일/비밀번호 직접 만들기를 피해야 하는지 안다
  • OAuth client ID/secret을 .env에 안전하게 보관할 수 있다

왜 OAuth인가? — 이메일/비밀번호 직접 만들기를 피하는 이유

이메일·비밀번호 회원가입을 직접 만들면 본인이 책임져야 할 일이 많아져요:

  • 비밀번호를 안전하게 암호화해서 저장 (해싱)
  • 비밀번호 분실 시 재설정 이메일 발송 흐름
  • 이메일 인증 (실제 본인 이메일이 맞는지)
  • brute force 공격 방어 (rate limiting)
  • 사용자가 비밀번호 잊어버렸을 때 CS 응대
  • 비밀번호 유출 시 본인이 모든 책임

반면 구글/카카오 OAuth는 이 모든 걸 구글·카카오에 위탁해요. 본인은 "이 사람이 구글에 로그인됐다"는 사실만 받아서 본인 DB에 사용자로 저장하면 끝. 보안·UX·구현 시간 모두에서 압도적으로 유리해요.

한 줄 결론

첫 출시는 구글 OAuth만 또는 구글 + 카카오로. 한국 타겟이면 카카오 우선, 글로벌 또는 비즈니스 타겟이면 구글 우선. 이메일·비밀번호는 절대 첫 버전에 넣지 마세요. 출시 후 사용자 피드백 기반으로 필요 시 추가.

🎨 생성 (Codex CLI) — 이메일/비밀번호 vs OAuth 비교 다이어그램. 좌: 본인이 책임질 6가지 / 우: OAuth는 구글·카카오에 위탁.

전체 흐름 — 4단계

단계 하는 일 시간
1 /v3-database로 User 모델 생성 (Claude가 알아서) 10분
2 구글 OAuth 앱 만들기 (Google Cloud Console) 15분
3 (선택) 카카오 OAuth 앱 만들기 (Kakao Developers) 15분
4 /v3-auth로 OAuth 연동 (Claude가 알아서) + 본인 로그인 테스트 20분

단계 1 — /v3-database로 User 모델

Claude Code 채팅에 한 줄.

/v3-database

스킬이 본인에게 묻는 것 + 추천 답:

  • "User 모델 만들까요?" → 네
  • "필드는 어떤 게 필요한가요?" → 기본만(name, email, provider, uid). 추가 필드는 나중에.
  • "마이그레이션 실행할까요?" → 네

스킬이 자동으로 다음을 해 줘요:

  • db/migrate/create_users.rb 마이그레이션 파일 생성
  • app/models/user.rb User 모델 클래스 생성
  • bin/rails db:migrate 실행 → DB에 users 테이블 생성
  • 기본 테스트 fixtures 추가 (test/fixtures/users.yml)
📷 캡쳐 — Claude Code에 /v3-database 진행 중 + 마이그레이션 파일 생성 + db:migrate 실행 결과.

단계 2A — 구글 OAuth 앱 만들기

구글 OAuth를 쓰려면 Google Cloud Console에서 OAuth 앱을 등록해야 해요. 처음이면 좀 복잡해 보이지만 한 번만 하면 끝.

  1. 브라우저에서 console.cloud.google.com 접속 + 로그인.
  2. 좌상단 프로젝트 선택 드롭다운 → "새 프로젝트" → 이름(예: "my-cafe-app") → 만들기.
  3. 프로젝트 선택 후 좌측 메뉴 → "API 및 서비스 → 사용자 인증 정보".
  4. 상단 "+ 사용자 인증 정보 만들기" → "OAuth 클라이언트 ID".
  5. 처음이면 "OAuth 동의 화면" 먼저 설정하라는 메시지 → 클릭 → "외부" 선택 → 앱 이름·이메일·연락처 입력 → 저장.
  6. 다시 "OAuth 클라이언트 ID 만들기" → 애플리케이션 유형 "웹 애플리케이션" → 이름 입력.
  7. "승인된 리디렉션 URI"에 다음 추가:
    http://localhost:3000/auth/google_oauth2/callback
  8. "만들기" 클릭 → 다이얼로그에 클라이언트 ID클라이언트 보안 비밀번호(secret)가 표시됨. 둘 다 복사해서 안전한 곳에.
📷 캡쳐 — Google Cloud Console OAuth 클라이언트 ID 생성 화면 + 리디렉션 URI 입력 + 발급된 client ID/secret.
client ID와 secret은 외부 노출 절대 금지.

단계 2B — .env에 구글 키 저장

Antigravity 좌측 트리에서 .env 파일 열기. 다음 두 줄 추가 (값은 방금 발급받은 것으로 교체):

GOOGLE_CLIENT_ID=123456789-abcdef.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-abcdefghijklmnop

저장 후 변경 사항 git status 확인. .env는 git이 자동으로 무시하므로 빠져 있어야 정상.

단계 3 — (선택) 카카오 OAuth 앱 만들기

한국 사용자 타겟이면 카카오도 같이 추가하는 걸 권장. 비슷한 흐름이에요.

  1. developers.kakao.com 접속 → 카카오 계정으로 로그인.
  2. 상단 "내 애플리케이션" → "애플리케이션 추가하기" → 앱 이름·사업자명 입력 → 저장.
  3. 앱 클릭 → 좌측 "앱 키" 메뉴 → REST API 키 복사 (이게 client ID 역할).
  4. 좌측 "제품 설정 → 카카오 로그인" → "활성화" 토글 ON.
  5. 같은 페이지에서 "Redirect URI" 등록:
    http://localhost:3000/auth/kakao/callback
  6. 좌측 "제품 설정 → 카카오 로그인 → 동의 항목" → 닉네임·이메일 등 필요한 정보 ON.
  7. 좌측 "보안" → "Client Secret 코드" 생성 → 복사.
📷 캡쳐 — Kakao Developers 앱 키 페이지 (REST API 키) + Redirect URI 등록 + Client Secret 발급.

.env에 추가:

KAKAO_CLIENT_ID=여기에_REST_API_키
KAKAO_CLIENT_SECRET=여기에_Client_Secret

단계 4 — /v3-auth로 OAuth 연동

Claude Code에 한 줄.

/v3-auth

스킬이 본인에게 묻는 것 + 추천 답:

  • "어떤 OAuth 제공자를 쓸까요?" → "구글 + 카카오" 또는 "구글만"
  • "User 모델에 추가 컬럼 필요할까요? (provider, uid)" → 네 (4-8 단계 1에서 안 만들었으면)
  • "세션 저장 방식은?" → 기본(쿠키 + DB) OK
  • "로그인 후 어디로 redirect?" → /dashboard 또는 본인 메인 페이지

스킬이 자동으로 해 주는 일:

  • omniauth-google-oauth2, omniauth-kakao gem 추가
  • config/initializers/omniauth.rb 설정 (.env 값 사용)
  • routes에 OAuth 콜백 경로 추가
  • SessionsController 생성 + 콜백 처리 로직
  • 로그인/로그아웃 헬퍼 메서드
  • 로그인 페이지 view (간단한 "Google로 로그인" 버튼)
  • 기본 통합 테스트
📷 캡쳐 — /v3-auth 스킬 진행 화면 + 생성된 파일 목록 + 통합 테스트 통과 메시지.

단계 5 — 본인이 직접 로그인 테스트

터미널에서 서버 띄우기.

bin/dev

브라우저 새 탭 → http://localhost:3000/login (또는 스킬이 알려준 경로). "Google로 로그인" 버튼 → 본인 구글 계정 선택 → 권한 동의 → 본인 서비스로 돌아옴 → 로그인 성공!

Rails 콘솔로 진짜 DB에 본인이 저장됐는지 확인.

bin/rails console
> User.last
# => #<User id: 1, email: "본인@gmail.com", provider: "google_oauth2", ...>
> exit
📷 캡쳐 — localhost:3000/login → "Google로 로그인" 버튼 → 구글 권한 화면 → 로그인 성공 시퀀스.
본인이 본인 서비스에 로그인된 첫 순간.

자주 발생하는 문제 + 해결

"redirect_uri_mismatch" 에러

Google Cloud Console에 등록한 리디렉션 URI와 실제 요청 URI가 다를 때. 정확히 http://localhost:3000/auth/google_oauth2/callback인지 확인. 마지막 슬래시 유무, http vs https, 포트 번호 모두 정확해야 함.

"invalid_client" 에러

.env의 client ID/secret 값이 잘못 복붙됐을 가능성. 양 끝 공백 확인. 따옴표 빠뜨리거나 추가하지 않기 (.env에서는 따옴표 없이 그대로). 서버 재시작 필수 (.env 변경 후 Ctrl+C → bin/dev 다시).

"카카오 로그인 화면이 안 떠요"

카카오는 "카카오 로그인" 활성화 토글이 OFF면 동작 안 함. Kakao Developers → 본인 앱 → 카카오 로그인 → 활성화 ON 확인. 그리고 동의 항목에 닉네임·이메일이 ON 되어 있어야 함.

"로그인 후 빈 화면"

로그인은 됐지만 redirect 경로가 없거나 잘못. SessionsController의 callback 메서드에서 redirect_to root_path 같은 명시적 경로 추가. Claude에게 "로그인 후 / 으로 가게 해줘" 부탁.

"개발자 모드라서 다른 사람은 로그인 못 해요"

Google OAuth 동의 화면이 "테스트" 모드면 본인 + 등록된 테스트 사용자만 로그인 가능. 본인 출시 전까지는 OK. 출시 시 "프로덕션" 모드 전환 필요. (4-13 또는 Ch.5에서 다룸.)

"이미 로그인된 상태에서 다시 로그인 화면 가고 싶어요"

로그아웃 링크 + 시크릿 창에서 테스트가 가장 빠름. 또는 Rails 콘솔에서 session.delete(:user_id).

완료 후 git commit + 보안 점검

git add .
git commit -m "DB + OAuth (Google/Kakao) 회원가입 완료"

보안 점검 권장: 04-security-agent에 "OAuth 구현 점검" 티켓 만들어서 배정. 자동으로 client secret 노출, redirect URI 화이트리스트, CSRF 토큰 등을 검토해 줘요.

자가 진단 — 통과 기준

  • User 모델 + users 테이블이 생성됨 (bin/rails db:migrate:status로 확인)
  • Google Cloud Console에 OAuth 앱 등록됨 + .env에 GOOGLE_CLIENT_ID/SECRET 저장됨
  • (선택) Kakao Developers에 앱 등록됨 + .env에 KAKAO_CLIENT_ID/SECRET 저장됨
  • localhost:3000에서 본인 구글 계정으로 로그인 성공
  • Rails 콘솔에서 User.last 결과로 본인 정보 확인됨
  • git commit 한 줄로 OAuth 완료 시점 세이브

다음 단계 → 4-9 localhost 띄우기 + 화면 확인

이번 lesson에서 잠깐 bin/dev로 localhost를 띄웠지만, 다음 레슨에서 localhost가 어떻게 작동하는지 본격 정리해요. 포트 충돌, live reload(코드 수정 시 자동 새로고침), 브라우저 디버깅, 모바일 화면 미리보기까지.

실습하기

로그인하면 스킬을 실습할 수 있습니다