From 8ddc110e9be42f4eb9e979f5fb7c8d7f10a8bf77 Mon Sep 17 00:00:00 2001 From: fad Date: Sun, 4 Jan 2026 20:44:44 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20JWT=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=BF=A0=ED=82=A4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/jwt/JwtAuthenticationFilter.java | 13 ++++++++----- .../common/security/jwt/JwtTokenProvider.java | 14 +++++++++++++- .../domain/member/controller/MemberController.java | 3 +++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java index c4705d86..3aa69c38 100644 --- a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java @@ -9,8 +9,6 @@ import org.ject.support.common.exception.GlobalErrorCode; import org.ject.support.common.exception.GlobalException; import org.ject.support.common.security.CustomUserDetails; -import org.ject.support.domain.auth.exception.AuthErrorCode; -import org.ject.support.domain.auth.exception.AuthException; import org.ject.support.domain.member.Role; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -64,9 +62,14 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse jwtTokenProvider.resolveVerificationToken(request); if (verificationToken != null) { - if (!jwtTokenProvider.validateToken(verificationToken)) { - // verification token은 실패 시 에러가 맞음 - throw new AuthException(AuthErrorCode.INVALID_TOKEN); + if (jwtTokenProvider.validateToken(verificationToken)) { + // 토큰이 유효한 경우, 인증 정보를 SecurityContext에 설정 + Authentication auth = jwtTokenProvider.getAuthenticationByToken(accessToken); + SecurityContextHolder.getContext().setAuthentication(auth); + } else { + clearAuthCookie(response, "Authentication auth = jwtTokenProvider.getAuthenticationByToken(accessToken);\n" + + " SecurityContextHolder.getContext().setAuthentication(auth);"); + SecurityContextHolder.clearContext(); } String email = jwtTokenProvider.extractEmailFromVerificationToken(verificationToken); diff --git a/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java b/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java index 06e54037..392f9ecf 100644 --- a/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java +++ b/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java @@ -10,6 +10,7 @@ import jakarta.annotation.PostConstruct; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.ject.support.common.exception.GlobalException; @@ -205,7 +206,18 @@ public String createVerificationToken(String email) { .signWith(secretKey) .compact(); } - + + /** + * 인증번호 검증 쿠키 삭제 + */ + public void deleteVerificationCookie(HttpServletResponse response) { + Cookie cookie = new Cookie("verificationToken", null); + cookie.setPath("/"); + cookie.setHttpOnly(true); + cookie.setMaxAge(0); + response.addCookie(cookie); + } + /** * 인증번호 검증 토큰에서 이메일 추출 */ diff --git a/src/main/java/org/ject/support/domain/member/controller/MemberController.java b/src/main/java/org/ject/support/domain/member/controller/MemberController.java index 5f8c21d5..89bbec49 100644 --- a/src/main/java/org/ject/support/domain/member/controller/MemberController.java +++ b/src/main/java/org/ject/support/domain/member/controller/MemberController.java @@ -50,6 +50,9 @@ public boolean registerTempMember(HttpServletRequest request, HttpServletRespons Authentication authentication = memberService.registerTempMember(registerRequest, email); customSuccessHandler.onAuthenticationSuccess(request, response, authentication); + // verification 토큰은 더 이상 필요 없으므로 삭제 + jwtTokenProvider.deleteVerificationCookie(response); + return true; } From d689717ced00f22be7969bf670325befdd07fdcd Mon Sep 17 00:00:00 2001 From: fad Date: Sun, 4 Jan 2026 20:50:59 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20JWT=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=BF=A0=ED=82=A4=EC=97=90=20=EB=B3=B4?= =?UTF-8?q?=EC=95=88=20=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/ject/support/common/security/jwt/JwtTokenProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java b/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java index 392f9ecf..478bf68c 100644 --- a/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java +++ b/src/main/java/org/ject/support/common/security/jwt/JwtTokenProvider.java @@ -214,6 +214,7 @@ public void deleteVerificationCookie(HttpServletResponse response) { Cookie cookie = new Cookie("verificationToken", null); cookie.setPath("/"); cookie.setHttpOnly(true); + cookie.setSecure(true); cookie.setMaxAge(0); response.addCookie(cookie); } From 73d25a3c562b1a141b59d2e7a23ed0e9e2e4a856 Mon Sep 17 00:00:00 2001 From: fad Date: Sun, 4 Jan 2026 21:07:28 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20JWT=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/security/jwt/JwtAuthenticationFilter.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java index 3aa69c38..14d14b54 100644 --- a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java @@ -63,12 +63,11 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse if (verificationToken != null) { if (jwtTokenProvider.validateToken(verificationToken)) { - // 토큰이 유효한 경우, 인증 정보를 SecurityContext에 설정 - Authentication auth = jwtTokenProvider.getAuthenticationByToken(accessToken); + String email = jwtTokenProvider.extractEmailFromVerificationToken(verificationToken); + Authentication auth = createVerificationAuthentication(email); SecurityContextHolder.getContext().setAuthentication(auth); } else { - clearAuthCookie(response, "Authentication auth = jwtTokenProvider.getAuthenticationByToken(accessToken);\n" + - " SecurityContextHolder.getContext().setAuthentication(auth);"); + clearAuthCookie(response, "verificationToken"); SecurityContextHolder.clearContext(); } From a436a08b7b7e14afbf64788cdd215c8b76793e0a Mon Sep 17 00:00:00 2001 From: fad Date: Sun, 4 Jan 2026 21:25:33 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20JWT=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/common/security/jwt/JwtAuthenticationFilter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java index 14d14b54..4a62e4a5 100644 --- a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java @@ -70,11 +70,6 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse clearAuthCookie(response, "verificationToken"); SecurityContextHolder.clearContext(); } - - String email = jwtTokenProvider.extractEmailFromVerificationToken(verificationToken); - - Authentication auth = createVerificationAuthentication(email); - SecurityContextHolder.getContext().setAuthentication(auth); } chain.doFilter(request, response); From 9a60b2436f0ff04f66dc874a963547b78d82540f Mon Sep 17 00:00:00 2001 From: fad Date: Mon, 5 Jan 2026 01:41:09 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20JWT=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=97=90=EC=84=9C=20=EC=95=A1=EC=84=B8?= =?UTF-8?q?=EC=8A=A4=20=ED=86=A0=ED=81=B0=20=EB=B0=8F=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=ED=86=A0=ED=81=B0=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/common/security/jwt/JwtAuthenticationFilter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java index 4a62e4a5..134607ef 100644 --- a/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/org/ject/support/common/security/jwt/JwtAuthenticationFilter.java @@ -49,6 +49,9 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse if (jwtTokenProvider.validateToken(accessToken)) { Authentication auth = jwtTokenProvider.getAuthenticationByToken(accessToken); SecurityContextHolder.getContext().setAuthentication(auth); + + chain.doFilter(request, response); + return; } else { clearAuthCookie(response, "accessToken"); SecurityContextHolder.clearContext(); @@ -64,6 +67,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse if (verificationToken != null) { if (jwtTokenProvider.validateToken(verificationToken)) { String email = jwtTokenProvider.extractEmailFromVerificationToken(verificationToken); + Authentication auth = createVerificationAuthentication(email); SecurityContextHolder.getContext().setAuthentication(auth); } else {