G
Google OAuth 2.0
Google Cloud Console에서 OAuth 2.0 클라이언트 ID를 발급합니다.
1
Google Cloud Console 접속
https://console.cloud.google.com/ 에 로그인하고, 우상단에서 프로젝트를 새로 만들거나 기존 프로젝트를 선택합니다.
2
OAuth 동의 화면 구성
좌측 메뉴 APIs & Services → OAuth consent screen . External 선택 → 앱 이름 nurimap, 지원 이메일, 도메인 nurimap.com 입력. 범위는 email, profile, openid 3가지.
3
OAuth 2.0 클라이언트 ID 생성
APIs & Services → Credentials → + CREATE CREDENTIALS → OAuth client ID . Application type = Web application , 이름 nurimap-web.
4
JavaScript origins · Redirect URIs 등록
Authorized JavaScript origins
https://app.nurimap.com
https://nurimap.com
Authorized redirect URIs
https://app.nurimap.com/auth/oauth/callback/google
5
Client ID · Secret 복사
생성 후 표시되는 Client ID (...apps.googleusercontent.com)와 Client secret 을 안전한 곳에 보관합니다. 환경변수 GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET 에 사용.
6
게시 상태 변경 (운영 전)
개발 중에는 Testing 상태로 등록된 테스트 사용자만 가능. 실서비스 시 Publish App 버튼으로 Production 전환. Sensitive scope을 안 쓰면 검수 없이 즉시 가능.
K
Kakao 로그인
Kakao Developers에서 애플리케이션을 등록하고 카카오 로그인을 활성화합니다.
1
Kakao Developers 접속
https://developers.kakao.com/ 로그인 → 내 애플리케이션 → 애플리케이션 추가하기 . 앱 이름 nurimap, 회사명 입력 후 저장.
2
앱 키 확인
앱 요약 페이지의 REST API 키 가 OAuth Client ID 역할입니다. 네이티브 앱 키 / JavaScript 키 / Admin 키 는 다른 용도라 혼동 주의.
3
플랫폼 등록 — Web
앱 설정 → 플랫폼 → Web 플랫폼 등록 . 사이트 도메인:
https://app.nurimap.com
https://nurimap.com
4
카카오 로그인 활성화 + Redirect URI
제품 설정 → 카카오 로그인 → 활성화 ON . 그 아래 Redirect URI 등록:
https://app.nurimap.com/auth/oauth/callback/kakao
5
동의 항목 설정
카카오 로그인 → 동의 항목 에서 필요 정보 ON:
닉네임 — 필수 동의
카카오계정(이메일) — 필수 동의 (서비스 식별용)
프로필 사진 — 선택 동의
6
Client Secret 발급 (권장)
보안 탭에서 Client Secret 코드를 생성하고 사용함 상태로. 환경변수 KAKAO_REST_API_KEY / KAKAO_CLIENT_SECRET 에 저장.
N
Naver 아이디로 로그인
네이버 개발자센터에서 "네이버 아이디로 로그인" API를 등록합니다.
1
네이버 개발자센터 접속
https://developers.naver.com/ 로그인 → Application → 애플리케이션 등록 .
2
사용 API 선택
사용 API에서
네이버 아이디로 로그인 추가. 제공 정보:
회원이름 — 필수
이메일 주소 — 필수 (서비스 식별용)
프로필 사진 — 선택
3
서비스 환경 등록 — PC웹
환경 = PC웹 . 서비스 URL / Callback URL:
서비스 URL
https://app.nurimap.com
Callback URL
https://app.nurimap.com/auth/oauth/callback/naver
4
Client ID · Secret 확인
등록 완료 후 애플리케이션 상세에서 Client ID ·Client Secret 확인. 환경변수 NAVER_CLIENT_ID / NAVER_CLIENT_SECRET 에 저장.
5
검수 신청 (운영 전)
개발 단계에서는 등록된 테스트 계정만 사용 가능. 실서비스 오픈 전 검수 요청 으로 일반 사용자 로그인 허용. 보통 1~3 영업일 소요.
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 등)에 위 환경변수를 매핑하면 연동 끝.