OAuth 크리덴셜 발급 가이드

실제 운영 환경에서 소셜 로그인(Google·Kakao·Naver)을 활성화하려면 각 제공자 콘솔에서 OAuth 앱을 등록하고 Client ID·Secret을 발급받아야 합니다. 본 가이드는 nurimap의 실 서비스 도메인 app.nurimap.com 기준입니다.

각 제공자의 콘솔 UI는 수시로 바뀝니다. 메뉴 명칭이 다르면 본 문서의 핵심 값(서비스 도메인·콜백 URL·동의 항목)을 기준으로 등록하세요.
G

Google OAuth 2.0

Google Cloud Console에서 OAuth 2.0 클라이언트 ID를 발급합니다. 2024년 말 콘솔이 Google Auth Platform 으로 재구성되어 메뉴가 4개로 분리됐습니다(브랜딩·대상·데이터 액세스·클라이언트).

완료 시 받을 것 — Client ID(...apps.googleusercontent.com) + Client Secret(GOCSPX-...). 두 값을 .env.dev/.env.prodGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET에 저장.
1
프로젝트 생성
https://console.cloud.google.com/ 로그인 → 상단 좌측 프로젝트 드롭다운 → 새 프로젝트 → 이름 nurimap → 만들기 → 생성 후 nurimap 프로젝트 선택.
2
Google Auth Platform 시작
좌측 메뉴 → Google Auth Platform → 개요(Overview)시작하기(GET STARTED) 마법사:
  • 앱 이름 nurimap
  • 사용자 지원 이메일: 본인 Google 계정
  • 사용자 유형: 외부(External)
  • 연락처: 본인 메일
  • 약관 동의 → 만들기
3
브랜딩 보완 + 로고 업로드
좌측 메뉴 → 브랜딩(Branding):
  • 애플리케이션 홈페이지: https://nurimap.com
  • 개인정보처리방침: https://nurimap.com/legal/privacy
  • 서비스 약관: https://nurimap.com/legal/terms
  • 승인된 도메인: + 도메인 추가nurimap.com
  • 앱 로고: nurimap-logo-120.png 업로드 (120×120, 7.4KB)
저장
4
데이터 액세스 — 스코프
좌측 메뉴 → 데이터 액세스(Data Access)범위 추가/삭제 → 다음 3개 체크:
  • .../auth/userinfo.email — 이메일
  • .../auth/userinfo.profile — 이름·프로필 사진
  • openid — OpenID 식별자
→ 업데이트 → 저장. 비민감(Non-sensitive) 스코프라 Google 검수 불필요.
5
대상 — 테스트 사용자 추가
좌측 메뉴 → 대상(Audience)테스트 사용자 → + 사용자 추가 → 본인 Gmail 입력. 테스트 단계에선 이 목록 계정만 로그인 가능.
6
OAuth 2.0 클라이언트 생성
좌측 메뉴 → 클라이언트(Clients)+ 클라이언트 만들기:
  • 유형: 웹 애플리케이션
  • 이름: nurimap-web
승인된 JavaScript 출처
https://app.nurimap.com
https://nurimap.com
http://localhost:8080
http://localhost:3000
승인된 리디렉션 URI
https://app.nurimap.com/auth/oauth/callback/google
http://localhost:8080/auth/oauth/callback/google
http://localhost:3000/auth/oauth/callback/google
만들기. 생성 직후 Client ID + Client Secret 모달이 뜸. Secret은 이 화면 떠나면 다시 못 보니 즉시 안전한 곳에 보관(1Password 등). JSON 다운로드 옵션도 활용.
7
.env에 키 저장
로컬 Mac과 운영 Lightsail 양쪽에 동일한 Client ID/Secret을 넣습니다(한 클라이언트가 양 환경 처리). 환경별 차이는 콜백 base URL 하나뿐:
# .env.dev
GOOGLE_CLIENT_ID=123456789-xxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxx
OAUTH_REDIRECT_BASE=http://localhost:8080/auth/oauth/callback

# .env.prod
GOOGLE_CLIENT_ID=123456789-xxx.apps.googleusercontent.com # 같은 값
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxx # 같은 값
OAUTH_REDIRECT_BASE=https://app.nurimap.com/auth/oauth/callback # 환경 차이
chmod 600 .env.dev .env.prod 으로 권한 잠금. .gitignore 에 등록되어 있는지 확인.
운영 전환(Publish App) — 테스트 단계에선 등록한 테스트 사용자만 가능. 실서비스 시 대상 페이지에서 앱 게시(PUBLISH APP) 버튼 클릭 → 즉시 Production. email/profile/openid 비민감 스코프만 쓰니 Google 검수 없이 진행됩니다. Redirect URI 변경은 5분~수 시간 전파 대기.
K

Kakao 로그인

Kakao Developers에서 애플리케이션을 등록하고 카카오 로그인을 활성화합니다. 2025년 7월 + 2026년 두 차례 콘솔 개편으로 Redirect URI · Client Secret이 "플랫폼 키 → REST API 키" 안으로 이동했습니다. 옛 "플랫폼/Web 사이트 도메인" 메뉴는 없어졌습니다.

완료 시 받을 것 — REST API 키(32자) + Client Secret(32자). 환경변수 KAKAO_REST_API_KEY / KAKAO_CLIENT_SECRET 에 저장.
1
애플리케이션 추가
https://developers.kakao.com/ 로그인 → 상단 내 애플리케이션 → + 애플리케이션 추가하기.
  • 앱 아이콘: nurimap-logo-256.png (128px 이상 필수)
  • 앱 이름: nurimap
  • 회사명: 본인 이름 또는 회사명
  • 카테고리: 생활 또는 유틸리티
→ 저장.
2
REST API 키 · Redirect URI · Client Secret
생성된 앱 클릭 → 좌측 앱 → 플랫폼 키 → REST API 키. 이 한 화면에서 세 가지를 모두 처리:
  • REST API 키 값 복사 → KAKAO_REST_API_KEY
  • 리다이렉트 URI 영역 → 추가:
https://app.nurimap.com/auth/oauth/callback/kakao
http://localhost:8080/auth/oauth/callback/kakao
http://localhost:3000/auth/oauth/callback/kakao
  • 클라이언트 시크릿 영역 → "사용함" 확인(새 앱은 자동 활성화) → Secret 코드 복사 → KAKAO_CLIENT_SECRET
3
카카오 로그인 활성화
좌측 카카오 로그인 → 사용 설정 → 활성화 토글 ON.
4
OpenID Connect 활성화 (권장)
좌측 카카오 로그인 → OpenID Connect → 활성화 토글 ON. OIDC를 켜면 ID Token(JWT) 함께 발급 → Spring Security OAuth2 Client 표준 호환.
5
동의항목 설정
좌측 카카오 로그인 → 동의항목:
  • 닉네임 — 필수 동의
  • 카카오계정(이메일) — 필수 동의 ← 비즈 앱 전환 필요
  • 프로필 사진 — 선택 동의
6
비즈 앱 전환 (이메일 필수 동의 위해)
좌측 앱 → 비즈니스 → 비즈 앱 전환:
  • 개인 개발자: 약관 동의 → 즉시 전환. 사업자등록증 불필요.
  • 사업자: 사업자 정보 + 사업자등록증 첨부 → 검수.
전환 후 5번으로 돌아가 이메일을 필수 동의로 변경.
7
.env에 키 저장
# .env.dev / .env.prod 양쪽에 동일하게
KAKAO_REST_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
KAKAO_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
흔한 오류KOE006: Redirect URI 불일치. 코드의 redirect_uri와 콘솔 등록값을 글자 단위로 비교. KOE101: 미인증 앱이 운영 환경 사용. 비즈 앱 전환 또는 동의 항목 점검.
S

이메일 발송 — AWS SES (Lightsail)

가입 인증·비밀번호 재설정 메일은 AWS SES로 발송합니다. Lightsail 인스턴스에서 SES API/SMTP를 호출하는 구성입니다.

1
발송 도메인 등록
SES 콘솔(서울 리전 ap-northeast-2) → Verified identities → Create identity → Domain, nurimap.com 입력. DKIM 자동 생성 옵션 켜기.
2
DNS 레코드 추가 (Cloudflare)
SES가 표시하는 DKIM CNAME 3개 + SPF TXT(v=spf1 include:amazonses.com ~all) + DMARC TXT(v=DMARC1; p=none; rua=mailto:...)를 Cloudflare DNS에 등록. 인증 완료까지 5~30분.
3
Sandbox → Production 신청
신규 계정은 Sandbox(인증된 수신자만, 일 200건). 콘솔에서 Request production access → 사용 사례·예상 발송량 작성. 보통 1~2영업일 승인.
4
발송 전용 IAM 사용자 생성
IAM → 사용자 추가 nurimap-prod-mailer. 정책 최소 권한: ses:SendEmail, ses:SendRawEmail만 허용. 액세스 키 발급 후 Lightsail의 .env에 저장.
5
백엔드에서 호출
Spring Boot는 software.amazon.awssdk:sesSesV2Client 사용. From no-reply@nurimap.com. 환경변수로부터 자격증명 자동 로드(DefaultCredentialsProvider).
무료 한도(2026): 신규 계정 월 3,000건 12개월. 이후 $0.10/1,000건. 가입·재설정 메일 용도로 충분히 여유.
S

키 관리 — Lightsail 환경 권장

OAuth Client Secret · SES 액세스 키 같은 비밀값을 어디에 두느냐. Lightsail은 EC2와 달리 인스턴스 IAM 역할 직접 부착이 불가해 IAM 사용자(액세스 키)로 인증합니다.

EC2처럼 Instance Profile 자동 자격증명을 못 쓰므로, 최소 권한 IAM 사용자 + 분기 키 회전이 1차 방어선입니다.

단계별 권장 — 가장 단순한 것부터

단계방식월 비용적용 시점
MVP Lightsail 인스턴스의 .env 파일 (chmod 600) + Docker env_file 무료 지금 — 가장 단순
성장기 AWS SSM Parameter Store SecureString 사실상 무료 (KMS 호출만) 다중 인스턴스 · 자동 배포 도입 시
운영 본격화 AWS Secrets Manager (자동 회전 지원) ~$3 (시크릿 6~7개) 회전 자동화 · 감사 로그 필요 시

권장 시작 구성 (MVP)

# Lightsail 인스턴스 (Ubuntu + Docker Compose)
/home/nurimap/envi2/
├── .env ← chmod 600, owner=nurimap
│ ├── GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET
│ ├── KAKAO_REST_API_KEY / KAKAO_CLIENT_SECRET
│ ├── NAVER_CLIENT_ID / NAVER_CLIENT_SECRET
│ ├── AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY # nurimap-prod-mailer
│ ├── AWS_REGION=ap-northeast-2
│ └── MAIL_FROM=no-reply@nurimap.com
└── docker-compose.yml # services.api.env_file: .env
운영 수칙: .env는 반드시 .gitignore에 등록(Git 커밋 금지). 액세스 키는 분기마다 회전. IAM 정책은 ARN별·액션별 최소 권한. 노출 의심 시 즉시 비활성화 후 신규 발급.
$

환경변수 정리

최종적으로 백엔드에 설정할 환경변수입니다. .env 또는 시크릿 매니저에 보관하세요.

# Google OAuth 2.0
GOOGLE_CLIENT_ID=123456789-xxxxxxxxxxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxx

# Kakao 로그인
KAKAO_REST_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
KAKAO_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# Naver 아이디로 로그인
NAVER_CLIENT_ID=xxxxxxxxxxxxxxxxxxxx
NAVER_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxx

# 공통 — OAuth 콜백 베이스
OAUTH_REDIRECT_BASE=https://app.nurimap.com/auth/oauth/callback

# AWS — SES 발송 전용 IAM 사용자 (nurimap-prod-mailer)
AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AWS_REGION=ap-northeast-2
MAIL_FROM=no-reply@nurimap.com
보안 — 절대 하지 말 것: Client Secret을 프론트엔드 코드·HTML·Git 저장소에 넣지 마세요. 서버 사이드 환경변수 또는 시크릿 매니저(AWS Secrets Manager, Cloudflare Secrets 등)에만 저장. 프론트는 Client ID와 콜백 URL만 알면 됩니다.

발급 완료 후 → 백엔드 OAuth 라이브러리(Spring Security OAuth2 Client 등)에 위 환경변수를 매핑하면 연동 끝.