Skip to content

Commit 0e1b0ab

Browse files
authored
{fix} 데이터베이스 변경 및 로그 추가
{fix} 데이터베이스 변경 및 로그 추가
2 parents 7fe3b87 + 4d49a9d commit 0e1b0ab

11 files changed

Lines changed: 60 additions & 51 deletions

File tree

MathCaptain/weakness/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies {
3535
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
3636
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
3737
implementation 'commons-codec:commons-codec:1.5'
38+
runtimeOnly 'mysql:mysql-connector-java:8.0.33'
3839
implementation 'com.auth0:java-jwt:3.13.0'
3940
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
4041
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Chat/Chat.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/Login/LoginSuccessJWTProvideHandler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
5353
response.setCharacterEncoding("UTF-8");
5454
response.setStatus(HttpServletResponse.SC_OK);
5555

56-
log.info( "로그인에 성공합니다. email: {}" , email);
57-
log.info( "AccessToken 을 발급합니다. AccessToken: {}" ,accessToken);
58-
log.info( "RefreshToken 을 발급합니다. RefreshToken: {}" ,refreshToken);
56+
log.info( "✅ 로그인에 성공합니다. 📧email: {}" , email);
5957
}
6058

6159
private String extractEmail(Authentication authentication) {

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/domain/Group.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@Entity
1919
@Getter
2020
@Builder
21-
@Table(name = "GROUPS")
21+
@Table(name = "`GROUPS`")
2222
@NoArgsConstructor
2323
@AllArgsConstructor
2424
public class Group {

MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import jakarta.annotation.PostConstruct;
1717
import lombok.RequiredArgsConstructor;
1818
import lombok.extern.slf4j.Slf4j;
19+
import org.springframework.context.annotation.DependsOn;
1920
import org.springframework.security.crypto.password.PasswordEncoder;
2021
import org.springframework.stereotype.Component;
2122
import org.springframework.transaction.annotation.Transactional;
2223

2324
@Slf4j
2425
@Component
2526
@RequiredArgsConstructor
27+
@DependsOn("entityManagerFactory")
2628
public class TestInit {
2729

2830
private final UserRepository userRepository;

MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/Security/filter/JsonUsernamePasswordAuthenticationFilter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import jakarta.servlet.ServletException;
55
import jakarta.servlet.http.HttpServletRequest;
66
import jakarta.servlet.http.HttpServletResponse;
7+
import lombok.extern.slf4j.Slf4j;
78
import org.springframework.security.authentication.AuthenticationServiceException;
89
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
910
import org.springframework.security.core.Authentication;
@@ -16,6 +17,7 @@
1617
import java.nio.charset.StandardCharsets;
1718
import java.util.Map;
1819

20+
@Slf4j
1921
public class JsonUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
2022

2123
private static final String DEFAULT_LOGIN_REQUEST_URL = "/login";
@@ -37,6 +39,8 @@ public JsonUsernamePasswordAuthenticationFilter(ObjectMapper objectMapper) {
3739
@Override
3840
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
3941

42+
log.info("============= 🔐 로그인 요청에 대한 필터링 시작 =============");
43+
4044
if(request.getContentType() == null || !request.getContentType().startsWith(CONTENT_TYPE)) {
4145
throw new AuthenticationServiceException("Authentication Content-Type not supported: " + request.getContentType());
4246
}
@@ -48,8 +52,13 @@ public Authentication attemptAuthentication(HttpServletRequest request, HttpServ
4852
String username = usernamePasswordMap.get(USERNAME_KEY);
4953
String password = usernamePasswordMap.get(PASSWORD_KEY);
5054

55+
log.info("username: {}", username);
56+
log.info("password: {}", password);
57+
5158
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); //principal 과 credentials 전달
5259

60+
log.info("============= 🔐 로그인 요청에 대한 필터링 종료 =============");
61+
5362
return this.getAuthenticationManager().authenticate(authRequest);
5463
}
5564
}

MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/Security/filter/JwtAuthenticationProcessingFilter.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import MathCaptain.weakness.User.repository.UserRepository;
55
import MathCaptain.weakness.User.domain.Users;
66
import MathCaptain.weakness.global.Security.jwt.JwtService;
7+
import MathCaptain.weakness.global.exception.AuthorizationException;
78
import jakarta.servlet.FilterChain;
89
import jakarta.servlet.ServletException;
910
import jakarta.servlet.http.HttpServletRequest;
@@ -53,14 +54,15 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
5354
.filter(jwtService::isTokenValid)
5455
.orElse(null); // RefreshToken이 없거나 유효하지 않으면 null을 반환
5556

56-
log.info("refreshToken: {}", refreshToken != null);
57-
5857
if (refreshToken != null){
59-
log.info("AccessToken 재발급 요청");
58+
log.info("RefreshToken 존재");
59+
log.info("============= ❗️AccessToken 재발급 요청 =============");
6060
checkRefreshTokenAndReIssueAccessToken(response, refreshToken); // refreshToken으로 유저 정보를 찾아오고, 존재하면 AccessToken을 재발급
6161
return; // 인증을 처리하지 않게 하기 위해 return
6262
}
6363

64+
log.info("RefreshToken 존재하지 않음 OR 유효하지 않음");
65+
log.info("============= AccessToken 유효성 검사 =============");
6466
checkAccessTokenAndAuthentication(request, response, filterChain); // refreshToken이 없다면 AccessToken을 검사하는 로직 수행
6567
}
6668

@@ -78,21 +80,26 @@ private void checkAccessTokenAndAuthentication(HttpServletRequest request, HttpS
7880
private void saveAuthentication(Users users) {
7981
UserDetailsImpl userDetails = new UserDetailsImpl(users);
8082

83+
log.info("============= 인증 처리 절차 시작 =============");
84+
log.info("accessToken 유효성 검사 완료");
85+
8186
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, authoritiesMapper.mapAuthorities(userDetails.getAuthorities()));
8287
log.info("authentication : {}", authentication);
88+
log.info("============= 인증 처리 완료 =============");
8389
SecurityContext context = SecurityContextHolder.createEmptyContext();
8490
context.setAuthentication(authentication);
8591
SecurityContextHolder.setContext(context);
8692
}
8793

8894
private void checkRefreshTokenAndReIssueAccessToken(HttpServletResponse response, String refreshToken) {
95+
log.info("============= RefreshToken 유효성 검사 =============");
8996
// 해당하는 refreshToken이 DB에 존재하면, user에게 AccessToken 발급
9097
userRepository.findByRefreshToken(refreshToken).ifPresent(
9198
users -> {
9299
try {
93100
jwtService.sendAccessToken(response, jwtService.createAccessToken(users.getEmail()));
94101
} catch (IOException e) {
95-
throw new RuntimeException(e);
102+
throw new AuthorizationException("❌ AccessToken 재발급 실패");
96103
}
97104
}
98105
);

MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/Security/jwt/JwtServiceImpl.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import MathCaptain.weakness.Group.repository.RelationRepository;
44
import MathCaptain.weakness.User.domain.Users;
55
import MathCaptain.weakness.User.repository.UserRepository;
6+
import MathCaptain.weakness.global.exception.ResourceNotFoundException;
67
import com.auth0.jwt.JWT;
78
import com.auth0.jwt.algorithms.Algorithm;
89
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -49,16 +50,12 @@ public class JwtServiceImpl implements JwtService{
4950
private static final String BEARER = "Bearer ";
5051

5152
private final UserRepository usersRepository;
52-
private final ObjectMapper objectMapper;
53-
private final RelationRepository relationRepository;
54-
5553

5654
//== 메서드 ==//
5755

5856
// AccessToken 생성 (사용자의 email 기반)
5957
@Override
6058
public String createAccessToken(String email) {
61-
6259
return JWT.create()
6360
// 빌더를 통해 JWT의 Subject 설정 : AccessToken
6461
.withSubject(ACCESS_TOKEN_SUBJECT)
@@ -90,7 +87,7 @@ public void updateRefreshToken(String email, String refreshToken) {
9087
.ifPresentOrElse(
9188
// 존재하면 refreshToken 업데이트
9289
users -> users.updateRefreshToken(refreshToken),
93-
() -> new Exception("회원 조회 실패")
90+
() -> new ResourceNotFoundException("회원 조회 실패")
9491
);
9592
}
9693

@@ -109,6 +106,10 @@ public void destroyRefreshToken(String email) {
109106
// AccessToken과 RefreshToken을 클라이언트에게 전달
110107
@Override
111108
public void sendAccessAndRefreshToken(HttpServletResponse response, String accessToken, String refreshToken) {
109+
log.info("============= AccessToken과 RefreshToken 전송 =============");
110+
log.info("🔑AccessToken: {}", accessToken);
111+
log.info("🗝️RefreshToken: {}", refreshToken);
112+
112113
// 응답 메시지의 상태를 200 OK로 설정
113114
response.setStatus(HttpServletResponse.SC_OK);
114115

@@ -126,6 +127,9 @@ public void sendAccessAndRefreshToken(HttpServletResponse response, String acces
126127
// AccessToken을 클라리언트에게 전달
127128
@Override
128129
public void sendAccessToken(HttpServletResponse response, String accessToken) throws IOException {
130+
log.info("============= AccessToken 전송 =============");
131+
log.info("🔑AccessToken: {}", accessToken);
132+
129133
response.setStatus(HttpServletResponse.SC_OK);
130134

131135
setAccessTokenHeader(response, accessToken);
@@ -143,13 +147,16 @@ public void sendAccessToken(HttpServletResponse response, String accessToken) th
143147
public Optional<String> extractAccessToken(HttpServletRequest request) {
144148
String headerValue = request.getHeader(accessHeader);
145149

150+
log.info("============= 🔑AccessToken 추출 =============");
151+
146152
if (headerValue == null || headerValue.isBlank()) {
147153
log.warn("Authorization 헤더가 비어있거나 존재하지 않습니다.");
148154
return Optional.empty();
149155
}
150156

151157
// "Bearer " 접두사가 있는 경우 제거
152158
if (headerValue.startsWith(BEARER)) {
159+
log.info("Authorization 헤더에 'Bearer ' 접두사가 존재합니다. 원본 값: {}", headerValue);
153160
return Optional.of(headerValue.replace(BEARER, "").trim());
154161
}
155162

@@ -161,6 +168,7 @@ public Optional<String> extractAccessToken(HttpServletRequest request) {
161168
// 클라이언트에게서 전달받은 RefreshToken을 HTTP 헤더에서 추출
162169
@Override
163170
public Optional<String> extractRefreshToken(HttpServletRequest request) {
171+
log.info("============= 🗝️RefreshToken 추출 =============");
164172
return Optional.ofNullable(request.getHeader(refreshHeader)).filter(
165173
// BEARER 접두사로 시작하는 RefreshToken을 확인
166174
refreshToken -> refreshToken.startsWith(BEARER)
@@ -177,7 +185,7 @@ public Optional<String> extractEmail(String accessToken) {
177185
JWT.require(Algorithm.HMAC512(secret)).build().verify(accessToken).getClaim(USERNAME_CLAIM)
178186
.asString());
179187

180-
log.info("email: {}", email);
188+
log.info("✉️ email: {}", email);
181189
return email;
182190
} catch (Exception e) {
183191
log.error(e.getMessage());
@@ -201,11 +209,12 @@ public void setRefreshTokenHeader(HttpServletResponse response, String refreshTo
201209
@Override
202210
public boolean isTokenValid(String token) {
203211
try {
212+
log.info("============= 토큰 유효성 검사를 시작합니다. ================");
204213
log.info("검증 중인 토큰: {}", token);
205214
JWT.require(Algorithm.HMAC512(secret)).build().verify(token);
206215
return true;
207216
} catch (Exception e) {
208-
log.error("유효하지 않은 Token입니다", e.getMessage());
217+
log.error("🍪유효하지 않은 Token입니다", e.getMessage());
209218
return false;
210219
}
211220
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package MathCaptain.weakness.global.exception;
2+
3+
public class AuthorizationException extends RuntimeException {
4+
public AuthorizationException(String message) {
5+
super(message);
6+
}
7+
}

MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/exception/GlobalExceptionHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public ResponseEntity<ApiResponse<String>> handleException(Exception ex) {
5454
public ResponseEntity<ApiResponse<String>> handleRuntimeException(RuntimeException ex) {
5555
return ResponseEntity.status(500).body(ApiResponse.fail(ex.getMessage(), null));
5656
}
57+
58+
@ExceptionHandler(AuthorizationException.class)
59+
public ResponseEntity<ApiResponse<String>> handleAuthorizationException(AuthorizationException ex) {
60+
return ResponseEntity.status(403).body(ApiResponse.fail(ex.getMessage(), null));
61+
}
5762
}

0 commit comments

Comments
 (0)