Compare commits

...

2 Commits

Author SHA1 Message Date
ttipo afed0d087a env 예제 수정 2026-06-22 12:35:11 +09:00
ttipo 944b8efbce feat: 이메일 인증·비밀번호 재설정 링크를 운영 환경에서도 로그 출력
SMTP 미구현 상태에서 운영 환경의 isProd 분기가 인증/재설정 링크를 가려 사실상 인증 불가였던 제한 해제.
개발·운영 공통으로 전체 링크를 로그로 남긴다. 실 메일러 도입 시 토큰 노출 방지를 위해 반드시 제거 필요(주석 경고 명시).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 12:34:53 +09:00
2 changed files with 7 additions and 24 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ BACKEND_DIR=backend
# ==========================================
# 포트
# ==========================================
FRONTEND_PORT=5173
FRONTEND_PORT=80
BACKEND_PORT=3000
WEBSOCKET_PORT=3001
DB_PORT=5432
+6 -23
View File
@@ -1,25 +1,16 @@
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
// 메일 발송 서비스 (플레이스홀더) —
// 현재는 실제 SMTP 전송 대신 백엔드 로그로 대체한다.
// 추후 nodemailer 등 도입 시 이 서비스 내부 구현만 교체하면 호출부는 그대로 유지된다.
// 현재는 실제 SMTP 전송 대신 백엔드 로그로 대체한다(개발/운영 공통).
// 실 메일러(nodemailer 등) 도입 전까지는 인증/재설정 링크를 로그에서 확인한다.
// ⚠️ 보안: 링크에는 원문 토큰이 포함된다. 실 메일러 도입 시 반드시 이 로그 출력을 제거하고
// 실제 이메일 전송으로 교체할 것(운영 로그에 토큰을 남기지 않기 위함).
@Injectable()
export class MailService {
private readonly logger = new Logger(MailService.name);
constructor(private readonly config: ConfigService) {}
// 가입 인증 메일 — 개발 환경에서만 인증 링크(원문 토큰 포함)를 로그로 출력한다.
// 운영 환경에서는 토큰이 로그에 남지 않도록 수신자만 기록한다(실 메일러로 교체 전제).
// 가입 인증 메일 — 실 메일러 전까지 인증 링크(원문 토큰 포함)를 로그로 출력한다(개발/운영 공통).
sendVerificationEmail(to: string, name: string, verifyUrl: string): void {
const isProd = this.config.get<string>('NODE_ENV') === 'production';
if (isProd) {
this.logger.log(
`[메일 발송 - 가입 인증] 수신자=${to} (인증 링크는 보안상 로그에 남기지 않음 — 실 메일러 필요)`,
);
return;
}
this.logger.log(
[
'',
@@ -34,16 +25,8 @@ export class MailService {
);
}
// 비밀번호 재설정 메일 — 개발 환경에서만 재설정 링크(원문 토큰 포함)를 로그로 출력한다.
// 운영 환경에서는 토큰이 로그에 남지 않도록 수신자만 기록한다(실 메일러로 교체 전제).
// 비밀번호 재설정 메일 — 실 메일러 전까지 재설정 링크(원문 토큰 포함)를 로그로 출력한다(개발/운영 공통).
sendPasswordResetEmail(to: string, name: string, resetUrl: string): void {
const isProd = this.config.get<string>('NODE_ENV') === 'production';
if (isProd) {
this.logger.log(
`[메일 발송 - 비밀번호 재설정] 수신자=${to} (재설정 링크는 보안상 로그에 남기지 않음 — 실 메일러 필요)`,
);
return;
}
this.logger.log(
[
'',