Skip to content

feat(auth): 이메일 인증 및 리프레시 토큰 Redis 관리 구현 (#14, #15) - #28

Merged
crolvlee merged 10 commits into
developfrom
feat/14-refreshtoken
Jun 22, 2026
Merged

feat(auth): 이메일 인증 및 리프레시 토큰 Redis 관리 구현 (#14, #15)#28
crolvlee merged 10 commits into
developfrom
feat/14-refreshtoken

Conversation

@crolvlee

@crolvlee crolvlee commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

변경 내용

  • POST /api/v1/auth/email/send — Gmail SMTP로 이메일 인증 코드(6자리) 발송, Redis에 5분 TTL로 저장
  • POST /api/v1/auth/email/verify — 인증 코드 검증 후 완료 플래그를 Redis에 10분 TTL로 저장
  • POST /api/v1/auth/signup — 이메일 인증 완료 여부 체크 추가 (미완료 시 403)
  • POST /api/v1/auth/refresh — 리프레시 토큰 갱신 구현, Token Rotation 적용 (액세스 + 리프레시 모두 재발급)
  • POST /api/v1/auth/login — 로그인 시 리프레시 토큰을 Redis에 저장 (refresh:{email}, TTL 7일)
  • POST /api/v1/auth/logout — Redis에서 리프레시 토큰 삭제로 실제 무효화 구현
  • application-local.properties 제거, backend/.env · frontend/.env 방식으로 환경변수 통일
  • origin/develop 머지 및 application.properties 충돌 해결 (AI agent 설정 추가)

연결 이슈

closes #14
closes #15

테스트

  • 단위 테스트 통과 (EmailVerificationServiceTest, AuthServiceTest)
  • 통합 테스트 통과 (AuthControllerTest, AuthHttpIntegrationTest) — 총 30개
  • 로컬 동작 확인 (이메일 발송·인증·회원가입·로그인·토큰 갱신·로그아웃)
  • API 응답 형식 확인 (docs/08_API_SPEC.md)

리뷰 포인트

  • /auth/refresh 응답에 accessToken + refreshToken 둘 다 포함됩니다 (Token Rotation). 프론트에서 두 토큰을 모두 교체해야 합니다.
  • 로컬 실행 시 Redis가 필요합니다 (redis-server 또는 docker run -p 6379:6379 redis).
  • backend/.envMAIL_USERNAME, MAIL_PASSWORD, REDIS_HOST, REDIS_PORT 추가가 필요합니다.

Summary by CodeRabbit

Release Notes

  • New Features
    • Added email verification as a mandatory signup prerequisite (code send/verify).
    • Implemented refresh token rotation: refresh now returns both a new access token and a new refresh token.
  • Bug Fixes
    • Improved error handling for invalid/expired refresh tokens and invalid verification codes.
  • Documentation
    • Updated API, security policy, and architecture docs to reflect email verification, token rotation, Redis TTL/key behavior, and local Redis/mail setup.
    • Updated environment examples for backend and frontend configuration.

@crolvlee crolvlee changed the title Feat/14 refreshtoken feat(auth): 이메일 인증 및 리프레시 토큰 Redis 관리 구현 (#14, #15) Jun 22, 2026
@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9f1169a0-fdb2-46cb-9c72-69eddb6d3005

📥 Commits

Reviewing files that changed from the base of the PR and between 8a19c54 and c15bd64.

📒 Files selected for processing (4)
  • backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailSendRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailVerifyRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshRequest.java
🚧 Files skipped from review as they are similar to previous changes (4)
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailVerifyRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailSendRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java

📝 Walkthrough

Walkthrough

Adds Redis-backed email verification (Gmail SMTP, 6-digit code, 5-min TTL) as a mandatory signup prerequisite. Implements Token Rotation for refresh tokens stored in Redis with TTL. Updates /logout to invalidate the Redis refresh entry using the authenticated principal's email. Wires four new auth DTO classes, two new service classes, updated SecurityConfig allowlist, and comprehensive test coverage.

Changes

Email Verification and Token Rotation Auth Flow

Layer / File(s) Summary
Dependencies, config, and env setup
backend/pom.xml, backend/src/main/resources/application.properties, backend/src/test/resources/application-test.properties, AGENTS.md, CLAUDE.md, backend/.env.example, frontend/.env.example
Adds spring-dotenv, Redis, and mail Maven starters; wires Redis and SMTP properties via env-var placeholders; adds mail properties to the test profile; clears .env.example files; and updates dev-setup docs with Redis as a local prerequisite.
Auth DTOs and ErrorCode constants
backend/src/main/java/com/ssafy/salmanhae/common/exception/ErrorCode.java, backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailSendRequest.java, backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailVerifyRequest.java, backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshRequest.java, backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshResponse.java
Adds EmailSendRequest, EmailVerifyRequest, RefreshRequest, RefreshResponse Lombok DTOs with validation constraints and reorders ErrorCode enum to include INVALID_VERIFICATION_CODE in the correct position.
EmailVerificationService: send and verify code
backend/src/main/java/com/ssafy/salmanhae/service/auth/EmailVerificationService.java
New service generates a 6-digit SecureRandom code, stores it in Redis under email:verify:{email} with 5-min TTL, emails it via JavaMailSender; verifyCode validates, deletes the verify key, and writes email:verified:{email} with 10-min TTL.
AuthService: Redis-backed signup gate, login, refresh, and logout
backend/src/main/java/com/ssafy/salmanhae/service/auth/AuthService.java
signup now requires a Redis email:verified: marker; login stores the refresh token in Redis with TTL; new refresh method validates the JWT, compares against the Redis-stored token, and rotates both tokens; logout deletes the Redis refresh entry.
AuthController endpoints and SecurityConfig allowlist
backend/src/main/java/com/ssafy/salmanhae/config/SecurityConfig.java, backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java
Adds /refresh, /email/send, /email/verify POST handlers; updates /logout to extract @AuthenticationPrincipal; expands SecurityConfig permitAll list to include the two new email endpoints.
Service and controller tests
backend/src/test/java/com/ssafy/salmanhae/service/auth/AuthServiceTest.java, backend/src/test/java/com/ssafy/salmanhae/service/auth/EmailVerificationServiceTest.java, backend/src/test/java/com/ssafy/salmanhae/controller/auth/AuthControllerTest.java, backend/src/test/java/com/ssafy/salmanhae/controller/auth/AuthHttpIntegrationTest.java
Adds AuthServiceTest (login Redis persistence, token rotation, error cases, logout), EmailVerificationServiceTest (sendCode/verifyCode paths), and updates both controller tests with @MockBean Redis/mail stubs plus new email-verification and refresh endpoint test cases.
Architecture, ADR, API spec, and security policy docs
docs/02_ARCHITECTURE.md, docs/03_ADR.md, docs/08_API_SPEC.md, docs/10_SECURITY_POLICY.md
Updates architecture with Redis key/TTL details; updates ADR-005 refresh strategy and adds ADR-011 for Redis auth storage; expands API spec with email verification endpoints and token rotation response shape; rewrites security policy to cover the full signup/login/refresh/logout and Redis key structure.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant AuthController
  participant EmailVerificationService
  participant AuthService
  participant Redis
  participant JavaMailSender

  rect rgba(70, 130, 180, 0.5)
    note over Client,JavaMailSender: Email Verification (pre-signup)
    Client->>AuthController: POST /auth/email/send {email}
    AuthController->>EmailVerificationService: sendCode(email)
    EmailVerificationService->>Redis: SET email:verify:{email} code EX 300
    EmailVerificationService->>JavaMailSender: send(SimpleMailMessage)

    Client->>AuthController: POST /auth/email/verify {email, code}
    AuthController->>EmailVerificationService: verifyCode(email, code)
    EmailVerificationService->>Redis: GET email:verify:{email}
    EmailVerificationService->>Redis: DEL email:verify:{email}
    EmailVerificationService->>Redis: SET email:verified:{email} "true" EX 600
  end

  rect rgba(60, 179, 113, 0.5)
    note over Client,Redis: Signup gated by verified flag
    Client->>AuthController: POST /auth/signup {email, password}
    AuthController->>AuthService: signup(request)
    AuthService->>Redis: GET email:verified:{email}
    AuthService-->>Client: 200 OK or 403 EMAIL_NOT_VERIFIED
  end

  rect rgba(210, 105, 30, 0.5)
    note over Client,Redis: Login and Token Rotation
    Client->>AuthController: POST /auth/login
    AuthController->>AuthService: login(request)
    AuthService->>Redis: SET refresh:{email} refreshToken EX ttl
    AuthService-->>Client: {accessToken, refreshToken}

    Client->>AuthController: POST /auth/refresh {refreshToken}
    AuthController->>AuthService: refresh(refreshToken)
    AuthService->>Redis: GET refresh:{email}
    AuthService->>Redis: SET refresh:{email} newRefreshToken EX ttl
    AuthService-->>Client: {accessToken, refreshToken}

    Client->>AuthController: POST /auth/logout
    AuthController->>AuthService: logout(email)
    AuthService->>Redis: DEL refresh:{email}
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • ssafy-salman/salmanhae#13: This PR directly extends the JWT auth foundation laid in #13 by modifying the same SecurityConfig, AuthController, and AuthService files to add Redis-backed refresh token rotation and email verification.
  • ssafy-salman/salmanhae#10: Both PRs modify ErrorCode.java#10 introduces the enum constants that this PR reorders to accommodate INVALID_VERIFICATION_CODE.
  • ssafy-salman/salmanhae#12: Both PRs modify frontend/.env.example#12 adds VITE_NAVER_MAP_CLIENT_ID and VITE_API_BASE_URL entries that this PR removes/clears.

Poem

🐇 Hippity-hop, the rabbit checks mail,
A six-digit code on a Redis trail!
Five minutes to verify, ten to confirm,
Tokens rotate like leaves in a storm.
No stale refresh lives long in this warren —
Redis guards the burrow, secrets are sworn. 🔐

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately describes the main changes: email verification and refresh token Redis management, with linked issue numbers.
Description check ✅ Passed The PR description includes all required sections: detailed changes, linked issue references, comprehensive test results, and clear review points for the team.
Linked Issues check ✅ Passed The PR successfully addresses both #14 (refresh token + logout) and #15 (duplicate email handling) by implementing token management via Redis and email verification checks.
Out of Scope Changes check ✅ Passed Changes are focused on authentication features (#14, #15). Updates to configuration files, documentation, and architecture (AGENTS.md, CLAUDE.md, docs/) are supporting changes for the email verification and token management implementation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/14-refreshtoken

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
backend/src/main/java/com/ssafy/salmanhae/service/auth/AuthService.java (1)

34-45: ⚠️ Potential issue | 🟠 Major

Add missing duplicate email check to signup method.

The signup method checks email verification status but does not verify whether the email is already registered. This allows duplicate email registration attempts to fail at the database layer instead of returning a proper API error response with EMAIL_ALREADY_EXISTS.

Add a check using the existing userDao.findByEmail() method and throw ApiException(ErrorCode.EMAIL_ALREADY_EXISTS) if the email is already registered:

Proposed fix
 public void signup(String email, String password, String nickname) {
     if (!Boolean.TRUE.toString().equals(redisTemplate.opsForValue().get("email:verified:" + email))) {
         throw new ApiException(ErrorCode.EMAIL_NOT_VERIFIED);
     }
+    if (userDao.findByEmail(email) != null) {
+        throw new ApiException(ErrorCode.EMAIL_ALREADY_EXISTS);
+    }

     User user = User.builder()
             .email(email)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/src/main/java/com/ssafy/salmanhae/service/auth/AuthService.java`
around lines 34 - 45, The signup method needs to check for duplicate email
registration before creating a new user. After the existing email verification
check, add a duplicate email check by calling userDao.findByEmail() with the
email parameter and throw ApiException(ErrorCode.EMAIL_ALREADY_EXISTS) if it
returns a non-null result. Place this check before the User object construction
so duplicate emails are caught early and return the proper API error response
instead of failing at the database layer.
🧹 Nitpick comments (3)
backend/src/main/java/com/ssafy/salmanhae/service/auth/EmailVerificationService.java (1)

28-38: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Consider rate limiting and error handling for email dispatch.

The sendCode method lacks rate limiting, allowing potential abuse where an attacker could trigger excessive email sends to any address. Additionally, mailSender.send() can throw MailException which propagates as an unhandled 500 error.

Consider:

  1. Adding per-email rate limiting (e.g., check Redis for recent sends before allowing another)
  2. Wrapping mail send in try-catch to provide a cleaner error response
♻️ Example rate limiting approach
+    private static final String RATE_LIMIT_PREFIX = "email:rate:";
+
     public void sendCode(String email) {
+        String rateLimitKey = RATE_LIMIT_PREFIX + email;
+        if (Boolean.TRUE.equals(redisTemplate.hasKey(rateLimitKey))) {
+            throw new ApiException(ErrorCode.TOO_MANY_REQUESTS);
+        }
+
         String code = String.format("%06d", new SecureRandom().nextInt(1_000_000));
         redisTemplate.opsForValue().set(VERIFY_PREFIX + email, code, Duration.ofMinutes(5));
+        redisTemplate.opsForValue().set(rateLimitKey, "1", Duration.ofMinutes(1));
 
         SimpleMailMessage message = new SimpleMailMessage();
         // ...
-        mailSender.send(message);
+        try {
+            mailSender.send(message);
+        } catch (MailException e) {
+            redisTemplate.delete(VERIFY_PREFIX + email);
+            throw new ApiException(ErrorCode.EMAIL_SEND_FAILED);
+        }
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@backend/src/main/java/com/ssafy/salmanhae/service/auth/EmailVerificationService.java`
around lines 28 - 38, The sendCode method needs two improvements: First, add
rate limiting by checking Redis before sending a new code to prevent abuse by
checking if a recent send exists within a time window (e.g., 1 minute) using the
VERIFY_PREFIX pattern and returning early if found. Second, wrap the
mailSender.send() call in a try-catch block to handle MailException gracefully
and prevent unhandled 500 errors, allowing you to log the error and throw or
return a more appropriate response to the caller.
backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java (1)

36-39: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Add null guard for defensive safety.

While @AuthenticationPrincipal should always resolve to a non-null user on authenticated endpoints, adding a null check prevents a potential NPE if the filter chain ever misbehaves.

🛡️ Optional defensive check
 `@PostMapping`("/logout")
 public ResponseEntity<ApiResponse<Void>> logout(`@AuthenticationPrincipal` User user) {
+    if (user == null) {
+        throw new ApiException(ErrorCode.UNAUTHORIZED);
+    }
     authService.logout(user.getEmail());
     return ResponseEntity.ok(ApiResponse.ok());
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java`
around lines 36 - 39, The logout method in AuthController lacks a null guard for
the user parameter, which could lead to a potential NPE if the authentication
filter chain misbehaves. Add a null check at the beginning of the logout method
to verify that the user parameter is not null before calling
authService.logout(user.getEmail()), and return an appropriate error response if
the user is null.
backend/src/main/resources/application.properties (1)

4-33: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Expand the required-env note.

The Required: comment only lists the Supabase DB trio, but jwt.secret and the mail credentials below also have no fallback. Please either enumerate the full env contract here or point readers to the backend .env example.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/src/main/resources/application.properties` around lines 4 - 33, The
Required comment at the beginning of the file only lists the Supabase database
environment variables (SUPABASE_DB_URL, SUPABASE_DB_USERNAME,
SUPABASE_DB_PASSWORD) but omits other mandatory environment variables that lack
fallback values. Update the comment to either enumerate all required environment
variables including JWT_SECRET, MAIL_USERNAME, and MAIL_PASSWORD, or
alternatively update it to reference a .env.example file in the backend
directory that documents the complete environment configuration contract for
developers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/src/main/java/com/ssafy/salmanhae/common/exception/ErrorCode.java`:
- Around line 8-15: The ErrorCode enum contains a duplicate constant declaration
of PROPERTY_NOT_FOUND appearing twice in the enum body. Remove the duplicate
PROPERTY_NOT_FOUND constant (the second occurrence at line 15) to ensure all
enum constant names are unique, which is required by Java language
specification. Since both declarations are identical with the same HttpStatus
and message, keeping only one will resolve the compilation failure.

In
`@backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailSendRequest.java`:
- Around line 5-7: The email field in the EmailSendRequest class lacks
validation annotations, allowing null, blank, or invalid email formats to bypass
validation at the DTO boundary. Add appropriate validation annotations to the
email field (such as `@NotBlank` to ensure the field is not empty and `@Email` to
validate the email format) to ensure request validation happens early and
returns clean 4xx responses instead of allowing invalid data to reach the
service layer.

In
`@backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailVerifyRequest.java`:
- Around line 5-9: The EmailVerifyRequest class lacks field validation
constraints, allowing malformed payloads with blank or invalid email and code
values to be accepted. Add validation annotations to the email field (such as
`@NotBlank` and `@Email` to ensure non-empty valid email format) and to the code
field (such as `@NotBlank` to ensure non-empty code). These annotations will cause
Spring to validate the request at binding time and automatically return 4xx
validation errors for invalid payloads before they reach service logic.

In
`@backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshRequest.java`:
- Around line 5-7: The RefreshRequest class currently has no validation
constraints on the refreshToken field, allowing empty or blank values to pass
through to the controller. Add the `@NotBlank` validation annotation to the
refreshToken field in the RefreshRequest DTO so that Spring will automatically
validate the input at the request level and return a 4xx error response for
empty or blank refresh tokens before they reach the controller business logic.

In `@backend/src/test/java/com/ssafy/salmanhae/service/auth/AuthServiceTest.java`:
- Line 95: In the AuthServiceTest class, the line with
when(jwtUtil.getEmail(REFRESH_TOKEN)).thenThrow(ExpiredJwtException.class) is
attempting to throw the exception class directly, but ExpiredJwtException
requires constructor parameters (Header, Claims, String) and has no no-arg
constructor. Replace the class reference with an explicit instance of
ExpiredJwtException by creating a new instance with the required parameters and
pass that instance to thenThrow() instead of the class.

In
`@backend/src/test/java/com/ssafy/salmanhae/service/auth/EmailVerificationServiceTest.java`:
- Around line 48-53: In the sendCode_savesCodeToRedisAndSendsEmail test method,
replace the anyString() argument in the verify(valueOps).set() call with an
ArgumentCaptor to capture the actual verification code value, then add an
assertion to verify that the captured code matches the regex pattern for exactly
6 digits (^\d{6}$). This ensures the sendCode method generates codes in the
correct format rather than accepting any arbitrary string.

In `@docs/10_SECURITY_POLICY.md`:
- Around line 15-29: The markdown file contains fenced code blocks without
language tags, which violates the markdownlint MD040 rule. Add language
identifiers to all bare code fences throughout the file - specifically at the
blocks starting around lines 15, 33, 43, 53, and 64. For each fenced code block
marked with just ```, add an appropriate language tag such as ```text or ```http
immediately after the opening backticks to indicate the code language and ensure
the documentation passes linting validation.

---

Outside diff comments:
In `@backend/src/main/java/com/ssafy/salmanhae/service/auth/AuthService.java`:
- Around line 34-45: The signup method needs to check for duplicate email
registration before creating a new user. After the existing email verification
check, add a duplicate email check by calling userDao.findByEmail() with the
email parameter and throw ApiException(ErrorCode.EMAIL_ALREADY_EXISTS) if it
returns a non-null result. Place this check before the User object construction
so duplicate emails are caught early and return the proper API error response
instead of failing at the database layer.

---

Nitpick comments:
In
`@backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java`:
- Around line 36-39: The logout method in AuthController lacks a null guard for
the user parameter, which could lead to a potential NPE if the authentication
filter chain misbehaves. Add a null check at the beginning of the logout method
to verify that the user parameter is not null before calling
authService.logout(user.getEmail()), and return an appropriate error response if
the user is null.

In
`@backend/src/main/java/com/ssafy/salmanhae/service/auth/EmailVerificationService.java`:
- Around line 28-38: The sendCode method needs two improvements: First, add rate
limiting by checking Redis before sending a new code to prevent abuse by
checking if a recent send exists within a time window (e.g., 1 minute) using the
VERIFY_PREFIX pattern and returning early if found. Second, wrap the
mailSender.send() call in a try-catch block to handle MailException gracefully
and prevent unhandled 500 errors, allowing you to log the error and throw or
return a more appropriate response to the caller.

In `@backend/src/main/resources/application.properties`:
- Around line 4-33: The Required comment at the beginning of the file only lists
the Supabase database environment variables (SUPABASE_DB_URL,
SUPABASE_DB_USERNAME, SUPABASE_DB_PASSWORD) but omits other mandatory
environment variables that lack fallback values. Update the comment to either
enumerate all required environment variables including JWT_SECRET,
MAIL_USERNAME, and MAIL_PASSWORD, or alternatively update it to reference a
.env.example file in the backend directory that documents the complete
environment configuration contract for developers.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 63741900-6eb0-4dcc-8267-48df7affe477

📥 Commits

Reviewing files that changed from the base of the PR and between f0a7eb0 and 2c804b8.

📒 Files selected for processing (24)
  • AGENTS.md
  • CLAUDE.md
  • backend/.env.example
  • backend/pom.xml
  • backend/src/main/java/com/ssafy/salmanhae/common/exception/ErrorCode.java
  • backend/src/main/java/com/ssafy/salmanhae/config/SecurityConfig.java
  • backend/src/main/java/com/ssafy/salmanhae/controller/auth/AuthController.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailSendRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/EmailVerifyRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshRequest.java
  • backend/src/main/java/com/ssafy/salmanhae/model/dto/auth/RefreshResponse.java
  • backend/src/main/java/com/ssafy/salmanhae/service/auth/AuthService.java
  • backend/src/main/java/com/ssafy/salmanhae/service/auth/EmailVerificationService.java
  • backend/src/main/resources/application.properties
  • backend/src/test/java/com/ssafy/salmanhae/controller/auth/AuthControllerTest.java
  • backend/src/test/java/com/ssafy/salmanhae/controller/auth/AuthHttpIntegrationTest.java
  • backend/src/test/java/com/ssafy/salmanhae/service/auth/AuthServiceTest.java
  • backend/src/test/java/com/ssafy/salmanhae/service/auth/EmailVerificationServiceTest.java
  • backend/src/test/resources/application-test.properties
  • docs/02_ARCHITECTURE.md
  • docs/03_ADR.md
  • docs/08_API_SPEC.md
  • docs/10_SECURITY_POLICY.md
  • frontend/.env.example
💤 Files with no reviewable changes (2)
  • backend/.env.example
  • frontend/.env.example

Comment thread backend/src/main/java/com/ssafy/salmanhae/common/exception/ErrorCode.java Outdated
Comment thread docs/10_SECURITY_POLICY.md
@crolvlee
crolvlee merged commit a739415 into develop Jun 22, 2026
1 check passed
@HOKAGO-MEMORIES
HOKAGO-MEMORIES deleted the feat/14-refreshtoken branch June 25, 2026 07:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT][F-6] 중복 이메일 관련 처리 [FEAT][F-6] 리프레시 토큰 및 로그아웃

1 participant