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.prod의 GOOGLE_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/ 로그인 → 상단
내 애플리케이션 → + 애플리케이션 추가하기 .
→ 저장.
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: 미인증 앱이 운영 환경 사용. 비즈 앱 전환 또는 동의 항목 점검.
N
Naver 아이디로 로그인
네이버 개발자센터에서 "네이버 아이디로 로그인" API를 등록합니다. 카카오와 달리 검수 절차가 있으나, 기본 정보(이메일·별명·프로필사진)만 받으면 사업자등록증 없이 통과 가능합니다.
완료 시 받을 것 — Client ID(20자) + Client Secret(20자). 환경변수 NAVER_CLIENT_ID / NAVER_CLIENT_SECRET 에 저장.
1
네이버 개발자센터 + 애플리케이션 등록
https://developers.naver.com/ 로그인 → 상단 Application → 애플리케이션 등록 . 최초 등록 시 약관 동의 + 휴대전화 본인 인증 1회 필요.
2
애플리케이션 기본 정보 입력
애플리케이션 이름 : nurimap
사용 API : 네이버 아이디로 로그인 선택
3
제공정보 선택
"네이버 아이디로 로그인" 선택 시 나타나는 제공정보에서 다음 체크:
이메일 주소 — 필수 (서비스 식별·발송)
별명 — 선택 (사용자 표시명)
프로필 사진 — 선택 (아바타)
위 3개는 검수 무난 통과. "회원이름(실명)", "휴대전화번호" 등은 별도 사유 소명 필요.
4
서비스 환경 등록 — PC웹
"환경 추가" 또는 "로그인 오픈 API 서비스 환경" 영역에서 PC웹 선택. 환경별 입력 필드:
서비스 URL
https://app.nurimap.com
네이버 아이디로 로그인 Callback URL
https://app.nurimap.com/auth/oauth/callback/naver
로컬 개발용 으로 별도 환경 추가하거나 같은 환경에 다음을 추가:
http://localhost:8080/auth/oauth/callback/naver
http://localhost:3000/auth/oauth/callback/naver
5
Client ID · Client Secret 확인
등록 완료 → 좌측 내 애플리케이션 메뉴 아래 등록한 앱 이름 클릭 → 상세 페이지에서 Client ID (20자)·Client Secret (20자) 확인. Secret은 "보기" 버튼으로만 표시 되니 한 번에 안전한 곳에 보관.
6
개발 단계 사용 — 테스트 가능
등록 직후부터 등록자(본인) 네이버 계정 으로 즉시 로그인 테스트 가능. 검수 전엔 본인 외 사용자 로그인 불가.
7
검수 요청 (운영 오픈 전)
내 애플리케이션 상세 페이지 →
검수 요청 버튼:
서비스 설명, 회원가입 절차 화면 캡처 첨부
이메일 외 추가 정보 받는다면 사유 명시
결과는 이메일 통보. 보통
1~3 영업일 . 통과 후 모든 네이버 사용자 로그인 가능.
8
.env에 키 저장
# .env.dev / .env.prod 양쪽에 동일하게
NAVER_CLIENT_ID =xxxxxxxxxxxxxxxxxxxx
NAVER_CLIENT_SECRET =xxxxxxxxxxxxxxxxxxxx
참고 — 사업자등록증은 필수 아님. 개인 개발자로 등록·검수 통과 가능. 이메일·별명·프로필사진만 받는 경우 검수 무난.
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:ses 의 SesV2Client 사용. 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 등)에 위 환경변수를 매핑하면 연동 끝.