Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import java.nio.charset.StandardCharsets;

import static org.myteam.server.global.exception.ErrorCode.INTERNAL_SERVER_ERROR;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_PREFIX;
import static org.myteam.server.global.security.jwt.JwtProvider.*;
import static org.myteam.server.util.cookie.CookieUtil.createCookie;

/**
Expand All @@ -25,8 +25,6 @@
@RestController
public class ReIssueController {
private final ReIssueService reIssueService;
private static final String ACCESS_TOKEN_KEY = "Authorization";
private static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";
public final static String TOKEN_REISSUE_PATH = "/reissue";
public final static String LOGOUT_PATH = "/logout";

Expand All @@ -44,7 +42,7 @@ public ResponseEntity<?> reissue(HttpServletRequest request, HttpServletResponse
Tokens tokens = reIssueService.reissueTokens(request);

// Access Token 응답 헤더 추가
response.addHeader(ACCESS_TOKEN_KEY, TOKEN_PREFIX + tokens.getAccessToken());
response.addHeader(HEADER_AUTHORIZATION, TOKEN_PREFIX + tokens.getAccessToken());

// Refresh Token 쿠키 추가
response.addCookie(createCookie(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,15 @@
import java.util.UUID;

import static org.myteam.server.global.exception.ErrorCode.*;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_ACCESS;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_REFRESH;
import static org.myteam.server.util.cookie.CookieUtil.getCookie;
import static org.myteam.server.global.security.jwt.JwtProvider.*;
import static org.myteam.server.global.util.cookie.CookieUtil.getCookie;

@Slf4j
@Service
@RequiredArgsConstructor
public class ReIssueService {
private final JwtProvider jwtProvider;
private final RefreshJpaRepository refreshJpaRepository;
private static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";

/**
* Refresh Token 검증
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import static org.myteam.server.auth.controller.ReIssueController.TOKEN_REISSUE_PATH;
import static org.myteam.server.global.security.jwt.JwtProvider.HEADER_AUTHORIZATION;
import static org.myteam.server.global.security.jwt.JwtProvider.REFRESH_TOKEN_KEY;

@Slf4j
@Configuration
Expand Down Expand Up @@ -168,8 +170,8 @@ public CorsConfigurationSource configurationSource() {
configuration.addAllowedMethod("*");
configuration.addAllowedOrigin(frontUrl); // TODO_ 추후 변경 해야함 배포시
configuration.setAllowCredentials(true);
configuration.addExposedHeader("Authorization");
configuration.addExposedHeader("X-Refresh-Token");
configuration.addExposedHeader(HEADER_AUTHORIZATION);
configuration.addExposedHeader(REFRESH_TOKEN_KEY);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,12 @@

import static org.myteam.server.auth.controller.ReIssueController.LOGOUT_PATH;
import static org.myteam.server.auth.controller.ReIssueController.TOKEN_REISSUE_PATH;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_ACCESS;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_REFRESH;
import static org.myteam.server.global.security.jwt.JwtProvider.*;
import static org.myteam.server.member.domain.MemberStatus.*;
import static org.myteam.server.util.cookie.CookieUtil.createCookie;

@Slf4j
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private static final String ACCESS_TOKEN_KEY = "Authorization";
private static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";
private final AuthenticationManager authenticationManager;
private final JwtProvider jwtProvider;
private final RefreshJpaRepository refreshJpaRepository;
Expand Down Expand Up @@ -91,7 +88,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR
log.warn("PENDING 상태인 경우 로그인이 불가능합니다");
// X-Refresh-Token
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), publicId, auth.getAuthority(), status);
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
String cookieValue = URLEncoder.encode(TOKEN_PREFIX + refreshToken, StandardCharsets.UTF_8);

response.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, TOKEN_REISSUE_PATH, 5 * 60, true));
sendErrorResponse(response, HttpStatus.LOCKED, "PENDING 상태인 경우 로그인이 불가능합니다");
Expand All @@ -114,7 +111,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR
// X-Refresh-Token
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), publicId, role, status);
// URLEncoder.encode: 공백을 %2B 로 처리
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
String cookieValue = URLEncoder.encode(TOKEN_PREFIX + refreshToken, StandardCharsets.UTF_8);

log.debug("print accessToken: {}", accessToken);
log.debug("print refreshToken: {}", refreshToken);
Expand All @@ -123,7 +120,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR
//Refresh 토큰 저장
addRefreshEntity(publicId, refreshToken, Duration.ofHours(24));

response.addHeader(ACCESS_TOKEN_KEY, "Bearer " + accessToken);
response.addHeader(HEADER_AUTHORIZATION, TOKEN_PREFIX + accessToken);
response.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, TOKEN_REISSUE_PATH, 24 * 60 * 60, true));
response.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, LOGOUT_PATH, 24 * 60 * 60, true));
response.setStatus(HttpStatus.OK.value());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,12 @@
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import static org.myteam.server.global.exception.ErrorCode.*;
import static org.myteam.server.global.security.jwt.JwtProvider.HEADER_AUTHORIZATION;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_ACCESS;

@Slf4j
@RequiredArgsConstructor
public class TokenAuthenticationFilter extends OncePerRequestFilter {
private final static String HEADER_AUTHORIZATION = "Authorization";
private final JwtProvider jwtProvider;

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
import java.util.UUID;

import static org.myteam.server.global.exception.ErrorCode.*;
import static org.myteam.server.global.security.jwt.JwtProvider.REFRESH_TOKEN_KEY;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_REFRESH;
import static org.springframework.http.HttpMethod.POST;

public class LogoutSuccessHandler implements org.springframework.security.web.authentication.logout.LogoutSuccessHandler {
private static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";
private Logger logger = LoggerFactory.getLogger(this.getClass());
final JwtProvider jwtProvider;
final RefreshJpaRepository refreshJpaRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class JwtProvider {
public final static String TOKEN_CATEGORY_ACCESS = "access"; // 어세스 토큰 카테고리
public final static String TOKEN_CATEGORY_REFRESH = "refresh"; // 리프레시 토큰 카테고리
public final static String HEADER_AUTHORIZATION = "Authorization";
public static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";
public final static String TOKEN_PREFIX = "Bearer ";
private final JwtProperties jwtProperties;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.myteam.server.util.cookie;
package org.myteam.server.global.util.cookie;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.myteam.server.util.date;
package org.myteam.server.global.util.date;

import java.sql.Date;
import java.sql.Time;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.myteam.server.util.file;
package org.myteam.server.global.util.file;

import org.springframework.http.MediaType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.myteam.server.auth.service.ReIssueService;
import org.myteam.server.global.security.dto.CustomUserDetails;
import org.myteam.server.global.security.jwt.JwtProvider;
import org.myteam.server.global.web.response.ResponseDto;
Expand All @@ -23,10 +24,9 @@

import static org.myteam.server.auth.controller.ReIssueController.LOGOUT_PATH;
import static org.myteam.server.auth.controller.ReIssueController.TOKEN_REISSUE_PATH;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_ACCESS;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_CATEGORY_REFRESH;
import static org.myteam.server.global.security.jwt.JwtProvider.*;
import static org.myteam.server.global.web.response.ResponseStatus.SUCCESS;
import static org.myteam.server.util.cookie.CookieUtil.createCookie;
import static org.myteam.server.global.util.cookie.CookieUtil.createCookie;

@Slf4j
@RestController
Expand All @@ -35,9 +35,7 @@
public class MyInfoController {
private final MemberService memberService;
private final JwtProvider jwtProvider;

private static final String ACCESS_TOKEN_KEY = "Authorization";
private static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";
private final ReIssueService reIssueService;

@PostMapping("/create")
public ResponseEntity<?> create(@RequestBody @Valid MemberSaveRequest memberSaveRequest,
Expand All @@ -50,12 +48,14 @@ public ResponseEntity<?> create(@RequestBody @Valid MemberSaveRequest memberSave
// Authorization
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofMinutes(10), response.getPublicId(), response.getRole().name(), response.getStatus().name());
// X-Refresh-Token
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofHours(24), response.getPublicId(), response.getRole().name(), response.getStatus().name());
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofDays(1), response.getPublicId(), response.getRole().name(), response.getStatus().name());
// URLEncoder.encode: 공백을 %2B 로 처리
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
String cookieValue = URLEncoder.encode(TOKEN_PREFIX + refreshToken, StandardCharsets.UTF_8);

reIssueService.addRefreshEntity(response.getPublicId(), refreshToken, Duration.ofDays(1));

// 응답 헤더 설정
httpServletResponse.addHeader(ACCESS_TOKEN_KEY, "Bearer " + accessToken);
httpServletResponse.addHeader(HEADER_AUTHORIZATION, TOKEN_PREFIX + accessToken);
httpServletResponse.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, TOKEN_REISSUE_PATH, 24 * 60 * 60, true));
httpServletResponse.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, LOGOUT_PATH, 24 * 60 * 60, true));
return new ResponseEntity<>(new ResponseDto<>(SUCCESS.name(), "회원가입 성공", response), HttpStatus.CREATED);
Expand All @@ -76,8 +76,8 @@ public ResponseEntity<?> update(@RequestBody @Valid MemberUpdateRequest memberUp
BindingResult bindingResult,
@AuthenticationPrincipal CustomUserDetails userDetails) {
log.info("MyInfoController update 메서드 실행 : {}", memberUpdateRequest.toString());
String email = memberService.getCurrentLoginUserEmail(userDetails.getPublicId()); // 현재 로그인한 사용자 이메일
MemberResponse response = memberService.update(email, memberUpdateRequest);
String loginUserEmail = memberService.getCurrentLoginUserEmail(userDetails.getPublicId()); // 현재 로그인한 사용자 이메일
MemberResponse response = memberService.update(loginUserEmail, memberUpdateRequest);
return new ResponseEntity<>(new ResponseDto<>(SUCCESS.name(), "회원정보 수정 성공", response), HttpStatus.OK);
}

Expand All @@ -96,9 +96,9 @@ public ResponseEntity<?> delete(@RequestBody @Valid MemberDeleteRequest memberDe
BindingResult bindingResult,
@AuthenticationPrincipal CustomUserDetails userDetails) {
log.info("MyInfoController delete 메서드 실행");
String email = memberService.getCurrentLoginUserEmail(userDetails.getPublicId()); // 현재 로그인한 사용자 이메일
String loginUserEmail = memberService.getCurrentLoginUserEmail(userDetails.getPublicId()); // 현재 로그인한 사용자 이메일

memberService.delete(email, memberDeleteRequest.getPassword());
memberService.delete(memberDeleteRequest.getEmail(), loginUserEmail, memberDeleteRequest.getPassword());

return new ResponseEntity<>(new ResponseDto<>(SUCCESS.name(), "회원 삭제 성공", null), HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.myteam.server.util.validator;
package org.myteam.server.member.domain.validator;

import java.util.regex.Pattern;

public class UserValidator {
public class MemberValidator {
private static final String TEL_PATTERN = "^010[0-9]{8}$";

public static String validateTel(String tel) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/myteam/server/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.myteam.server.global.domain.Base;
import org.myteam.server.member.domain.GenderType;
import org.myteam.server.member.domain.MemberRole;
import org.myteam.server.member.domain.MemberStatus;
Expand All @@ -26,7 +27,7 @@
@Getter
@Table(name = "p_members")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
public class Member extends Base {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import static org.myteam.server.global.domain.PlayHiveValidator.validate;
import static org.myteam.server.global.exception.ErrorCode.*;
import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_PREFIX;

@Slf4j
@Service
Expand Down Expand Up @@ -220,7 +221,7 @@ public String getCurrentLoginUserEmail(UUID publicId) {
* @return
*/
public MemberResponse getAuthenticatedMember(String authorizationHeader) {
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
if (authorizationHeader == null || !authorizationHeader.startsWith(TOKEN_PREFIX)) {
throw new PlayHiveException(NO_PERMISSION);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@
public class CustomOauth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
@Value("${FRONT_URL:http://localhost:3000}")
private String frontUrl;
private static final String ACCESS_TOKEN_KEY = "Authorization";
private static final String REFRESH_TOKEN_KEY = "X-Refresh-Token";
private final JwtProvider jwtProvider;
private final MemberJpaRepository memberJpaRepository;

Expand Down Expand Up @@ -68,7 +66,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
// sendErrorResponse(response, HttpStatus.FORBIDDEN, "PENDING 상태인 경우 로그인이 불가능합니다");
// X-Refresh-Token
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofDays(7), member.getPublicId(), member.getRole().name(), member.getStatus().name());
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
String cookieValue = URLEncoder.encode(TOKEN_PREFIX + refreshToken, StandardCharsets.UTF_8);

response.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, TOKEN_REISSUE_PATH, 5 * 60, true));
response.sendRedirect(frontUrl + "?status=" + status);
Expand All @@ -89,10 +87,10 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
String accessToken = jwtProvider.generateToken(TOKEN_CATEGORY_ACCESS, Duration.ofHours(1), member.getPublicId(), member.getRole().name(), member.getStatus().name());
// X-Refresh-Token
String refreshToken = jwtProvider.generateToken(TOKEN_CATEGORY_REFRESH, Duration.ofDays(7), member.getPublicId(), member.getRole().name(), member.getStatus().name());
String cookieValue = URLEncoder.encode("Bearer " + refreshToken, StandardCharsets.UTF_8);
String cookieValue = URLEncoder.encode(TOKEN_PREFIX + refreshToken, StandardCharsets.UTF_8);

// redirect 순간 Header 값 날아감
// response.addHeader(ACCESS_TOKEN_KEY, "Bearer " + accessToken);
// response.addHeader(ACCESS_TOKEN_KEY, TOKEN_PREFIX + accessToken);
response.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, TOKEN_REISSUE_PATH, 24 * 60 * 60, true));
response.addCookie(createCookie(REFRESH_TOKEN_KEY, cookieValue, LOGOUT_PATH, 24 * 60 * 60, true));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.apache.commons.lang3.StringUtils;
import org.myteam.server.member.domain.GenderType;
import org.myteam.server.util.validator.UserValidator;
import org.myteam.server.member.domain.validator.MemberValidator;

import java.time.LocalDate;
import java.util.Collections;
Expand Down Expand Up @@ -85,7 +85,7 @@ public String getTel() {
.replace("-", "") // 하이픈 제거
.replace(" ", ""); // 공백 제거

return UserValidator.validateTel(phoneNumber);
return MemberValidator.validateTel(phoneNumber);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.myteam.server.member.domain.GenderType;
import org.myteam.server.util.validator.UserValidator;
import org.myteam.server.member.domain.validator.MemberValidator;

import java.time.LocalDate;
import java.util.Map;
Expand Down Expand Up @@ -49,7 +49,7 @@ public String getNickname() {
@Override
public String getTel() {
String phoneNumber = StringUtils.defaultString((String) attribute.get("mobile"), "").replace("-", "");
return UserValidator.validateTel(phoneNumber);
return MemberValidator.validateTel(phoneNumber);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static org.myteam.server.global.security.jwt.JwtProvider.TOKEN_PREFIX;

/**
* 기능 미구현 상태. 추후 구현 계획이 확실해 지면 그 때 추가 계발 계획 예정
*/
Expand Down Expand Up @@ -41,8 +43,8 @@ public ResponseEntity<String> logout(
// Authorization 헤더에서 값 추출
String authorizationHeader = httpServletRequest.getHeader("Authorization");

if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
String accessToken = authorizationHeader.replace("Bearer ", "");
if (authorizationHeader != null && authorizationHeader.startsWith(TOKEN_PREFIX)) {
String accessToken = authorizationHeader.replace(TOKEN_PREFIX, "");
oAuth2UnlinkHelper.revokeToken(OAuth2ServiceProvider.NAVER, accessToken);
} else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
Expand Down
Loading