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만 또는 구글 + 카카오로. 한국 타겟이면 카카오 우선, 글로벌 또는 비즈니스 타겟이면 구글 우선. 이메일·비밀번호는 절대 첫 버전에 넣지 마세요. 출시 후 사용자 피드백 기반으로 필요 시 추가.
전체 흐름 — 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.rbUser 모델 클래스 생성bin/rails db:migrate실행 → DB에 users 테이블 생성- 기본 테스트 fixtures 추가 (
test/fixtures/users.yml)
단계 2A — 구글 OAuth 앱 만들기
구글 OAuth를 쓰려면 Google Cloud Console에서 OAuth 앱을 등록해야 해요. 처음이면 좀 복잡해 보이지만 한 번만 하면 끝.
- 브라우저에서 console.cloud.google.com 접속 + 로그인.
- 좌상단 프로젝트 선택 드롭다운 → "새 프로젝트" → 이름(예: "my-cafe-app") → 만들기.
- 프로젝트 선택 후 좌측 메뉴 → "API 및 서비스 → 사용자 인증 정보".
- 상단 "+ 사용자 인증 정보 만들기" → "OAuth 클라이언트 ID".
- 처음이면 "OAuth 동의 화면" 먼저 설정하라는 메시지 → 클릭 → "외부" 선택 → 앱 이름·이메일·연락처 입력 → 저장.
- 다시 "OAuth 클라이언트 ID 만들기" → 애플리케이션 유형 "웹 애플리케이션" → 이름 입력.
- "승인된 리디렉션 URI"에 다음 추가:
http://localhost:3000/auth/google_oauth2/callback
- "만들기" 클릭 → 다이얼로그에 클라이언트 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 앱 만들기
한국 사용자 타겟이면 카카오도 같이 추가하는 걸 권장. 비슷한 흐름이에요.
- developers.kakao.com 접속 → 카카오 계정으로 로그인.
- 상단 "내 애플리케이션" → "애플리케이션 추가하기" → 앱 이름·사업자명 입력 → 저장.
- 앱 클릭 → 좌측 "앱 키" 메뉴 → REST API 키 복사 (이게 client ID 역할).
- 좌측 "제품 설정 → 카카오 로그인" → "활성화" 토글 ON.
- 같은 페이지에서 "Redirect URI" 등록:
http://localhost:3000/auth/kakao/callback
- 좌측 "제품 설정 → 카카오 로그인 → 동의 항목" → 닉네임·이메일 등 필요한 정보 ON.
- 좌측 "보안" → "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-kakaogem 추가config/initializers/omniauth.rb설정 (.env 값 사용)- routes에 OAuth 콜백 경로 추가
SessionsController생성 + 콜백 처리 로직- 로그인/로그아웃 헬퍼 메서드
- 로그인 페이지 view (간단한 "Google로 로그인" 버튼)
- 기본 통합 테스트
단계 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
자주 발생하는 문제 + 해결
"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(코드 수정 시 자동 새로고침), 브라우저 디버깅, 모바일 화면 미리보기까지.
실습하기
로그인하면 스킬을 실습할 수 있습니다