Skip to content

Commit 99e593e

Browse files
authored
Merge pull request #47 from GP-DriveU/refactor/#46/token-argumentresolver
[Refactor] JWT 토큰 처리 로직 리펙토링 (@loginuser) & S3 인코딩 버그 해결
2 parents 2a43249 + 8e825ad commit 99e593e

21 files changed

Lines changed: 204 additions & 156 deletions

File tree

src/main/java/com/driveu/server/domain/auth/application/OauthTokenService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public LoginResponse handleGoogleLogin(String code, String redirectUri) {
6565
.toList();
6666

6767
// 디렉토리 트리 조회
68-
List<DirectoryTreeResponse> directories = directoryService.getDirectoryTree("Bearer " + jwtToken.getAccessToken(), userSemester.getId());
68+
List<DirectoryTreeResponse> directories = directoryService.getDirectoryTree(user, userSemester.getId());
6969

7070
return LoginResponse.builder()
7171
.user(LoginResponse.UserInfo.builder()
Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.driveu.server.domain.auth.enhancer;
22

33
import com.driveu.server.domain.auth.infra.JwtProvider;
4+
import com.driveu.server.global.util.TokenExtractor;
45
import jakarta.servlet.FilterChain;
56
import jakarta.servlet.ServletException;
67
import jakarta.servlet.ServletRequest;
@@ -9,27 +10,21 @@
910
import lombok.RequiredArgsConstructor;
1011
import org.springframework.security.core.Authentication;
1112
import org.springframework.security.core.context.SecurityContextHolder;
12-
import org.springframework.util.StringUtils;
1313
import org.springframework.web.filter.GenericFilterBean;
1414

1515
import java.io.IOException;
1616

17-
18-
1917
@RequiredArgsConstructor
2018
public class JwtAuthenticationFilter extends GenericFilterBean {
2119

22-
public static final String AUTHORIZATION_HEADER = "Authorization";
23-
public static final String BEARER_PREFIX = "Bearer ";
24-
2520
private final JwtProvider jwtTokenProvider;
26-
21+
private final TokenExtractor tokenExtractor;
2722

2823
@Override
2924
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
3025
throws IOException, ServletException {
3126
// 1. Request Header에서 JWT 토큰 추출
32-
String token = resolveToken((HttpServletRequest) request);
27+
String token = tokenExtractor.extractToken((HttpServletRequest) request);
3328
// 2. validateToken으로 토큰 유효성 검사
3429
if (token != null && jwtTokenProvider.validateToken(token)) {
3530
// 토큰이 유효할 경우 토큰에서 Authentication 객체를 가지고 와서 SecurityContext에 저장
@@ -39,13 +34,4 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
3934
// 에러 핸들링 필요
4035
chain.doFilter(request, response);
4136
}
42-
43-
// Request Header에서 토큰 정보 추출
44-
private String resolveToken(HttpServletRequest request) {
45-
String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
46-
if (StringUtils.hasText(bearerToken)) {
47-
return bearerToken.substring(7);
48-
}
49-
return null;
50-
}
5137
}

src/main/java/com/driveu/server/domain/auth/infra/JwtProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,9 @@ private Claims parseClaims(String accessToken) {
8181
}
8282
}
8383

84-
// 사용자 email 가져오기
84+
// 토큰으로 사용자 email 가져오기
8585
public String getUserEmailFromToken(String accessToken) {
86-
String token = accessToken.substring(7);
87-
Claims claims = parseClaims(token);
86+
Claims claims = parseClaims(accessToken);
8887
return claims.getSubject();
8988
}
9089
}

src/main/java/com/driveu/server/domain/directory/api/DirectoryApi.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import com.driveu.server.domain.directory.dto.request.DirectoryOrderUpdateRequest;
77
import com.driveu.server.domain.directory.dto.request.DirectoryRenameRequest;
88
import com.driveu.server.domain.directory.dto.response.*;
9+
import com.driveu.server.domain.user.domain.User;
10+
import com.driveu.server.global.config.security.auth.LoginUser;
911
import io.swagger.v3.oas.annotations.Operation;
12+
import io.swagger.v3.oas.annotations.Parameter;
1013
import io.swagger.v3.oas.annotations.media.ArraySchema;
1114
import io.swagger.v3.oas.annotations.media.Content;
1215
import io.swagger.v3.oas.annotations.media.Schema;
@@ -42,10 +45,10 @@ public class DirectoryApi {
4245
})
4346
public ResponseEntity<?> getDirectories(
4447
@PathVariable Long userSemesterId,
45-
@RequestHeader("Authorization") String token
48+
@Parameter(hidden = true) @LoginUser User user
4649
) {
4750
try {
48-
List<DirectoryTreeResponse> tree = directoryService.getDirectoryTree(token, userSemesterId);
51+
List<DirectoryTreeResponse> tree = directoryService.getDirectoryTree(user, userSemesterId);
4952
return ResponseEntity.ok(tree);
5053
} catch (EntityNotFoundException e){
5154
return ResponseEntity.status(HttpStatus.NOT_FOUND)
@@ -74,10 +77,10 @@ public ResponseEntity<?> getDirectories(
7477
public ResponseEntity<?> createDirectory(
7578
@PathVariable Long userSemesterId,
7679
@RequestBody DirectoryCreateRequest request,
77-
@RequestHeader("Authorization") String token
80+
@Parameter(hidden = true) @LoginUser User user
7881
) {
7982
try {
80-
DirectoryCreateResponse response = directoryService.createDirectory(token, userSemesterId, request);
83+
DirectoryCreateResponse response = directoryService.createDirectory(user, userSemesterId, request);
8184
return ResponseEntity.ok(response);
8285
} catch (EntityNotFoundException e){
8386
return ResponseEntity.status(HttpStatus.NOT_FOUND)
@@ -103,7 +106,7 @@ public ResponseEntity<?> createDirectory(
103106
public ResponseEntity<?> renameDirectory(
104107
@PathVariable Long id,
105108
@RequestBody DirectoryRenameRequest request,
106-
@RequestHeader("Authorization") String token
109+
@Parameter(hidden = true) @LoginUser User user
107110
) {
108111
try {
109112
DirectoryRenameResponse response = directoryService.renameDirectory(id, request);
@@ -131,7 +134,7 @@ public ResponseEntity<?> renameDirectory(
131134
})
132135
public ResponseEntity<?> deleteDirectory(
133136
@PathVariable Long id,
134-
@RequestHeader("Authorization") String token
137+
@Parameter(hidden = true) @LoginUser User user
135138
) {
136139
try {
137140
directoryService.softDeleteDirectory(id);
@@ -161,7 +164,7 @@ public ResponseEntity<?> deleteDirectory(
161164
public ResponseEntity<?> moveDirectoryParent(
162165
@PathVariable Long id,
163166
@RequestBody DirectoryMoveParentRequest request,
164-
@RequestHeader("Authorization") String token
167+
@Parameter(hidden = true) @LoginUser User user
165168
) {
166169
try {
167170
DirectoryMoveParentResponse response = directoryService.moveDirectoryParent(id, request);
@@ -186,7 +189,7 @@ public ResponseEntity<?> moveDirectoryParent(
186189
})
187190
public ResponseEntity<?> updateDirectoryOrder(
188191
@RequestBody DirectoryOrderUpdateRequest request,
189-
@RequestHeader("Authorization") String token
192+
@Parameter(hidden = true) @LoginUser User user
190193
) {
191194
try {
192195
DirectoryOrderUpdateResponse response = directoryService.updateDirectoryOrder(request);

src/main/java/com/driveu/server/domain/directory/application/DirectoryService.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.driveu.server.domain.directory.application;
22

33
import com.amazonaws.services.kms.model.NotFoundException;
4-
import com.driveu.server.domain.auth.infra.JwtProvider;
54
import com.driveu.server.domain.directory.dao.DirectoryHierarchyRepository;
65
import com.driveu.server.domain.directory.dao.DirectoryRepository;
76
import com.driveu.server.domain.directory.domain.Directory;
@@ -13,7 +12,6 @@
1312
import com.driveu.server.domain.resource.domain.ResourceDirectory;
1413
import com.driveu.server.domain.semester.dao.UserSemesterRepository;
1514
import com.driveu.server.domain.semester.domain.UserSemester;
16-
import com.driveu.server.domain.user.dao.UserRepository;
1715
import com.driveu.server.domain.user.domain.User;
1816
import jakarta.persistence.EntityNotFoundException;
1917
import lombok.RequiredArgsConstructor;
@@ -30,8 +28,6 @@ public class DirectoryService {
3028

3129
private final DirectoryRepository directoryRepository;
3230
private final DirectoryHierarchyRepository directoryHierarchyRepository;
33-
private final JwtProvider jwtProvider;
34-
private final UserRepository userRepository;
3531
private final UserSemesterRepository userSemesterRepository;
3632
private final ResourceDirectoryRepository resourceDirectoryRepository;
3733

@@ -78,9 +74,9 @@ private void saveHierarchy(Directory parent, Directory descendant, int depth) {
7874
}
7975

8076
@Transactional
81-
public List<DirectoryTreeResponse> getDirectoryTree(String token, Long userSemesterId) {
77+
public List<DirectoryTreeResponse> getDirectoryTree(User user, Long userSemesterId) {
8278
System.out.println("start getDirectoryTree");
83-
validateUserSemester(token, userSemesterId);
79+
validateUserSemester(user, userSemesterId);
8480

8581
List<Object[]> result = directoryHierarchyRepository.findAllHierarchiesWithDescendantsByUserSemesterId(userSemesterId);
8682

@@ -126,8 +122,8 @@ public List<DirectoryTreeResponse> getDirectoryTree(String token, Long userSemes
126122
}
127123

128124
@Transactional
129-
public DirectoryCreateResponse createDirectory(String token, Long userSemesterId, DirectoryCreateRequest request) {
130-
UserSemester userSemester = validateUserSemester(token, userSemesterId);
125+
public DirectoryCreateResponse createDirectory(User user, Long userSemesterId, DirectoryCreateRequest request) {
126+
UserSemester userSemester = validateUserSemester(user, userSemesterId);
131127

132128
if (request.getParentDirectoryId() == 0) {
133129
return createTopLevelDirectory(userSemester, request);
@@ -191,12 +187,7 @@ private DirectoryCreateResponse createDescendentDirectory(UserSemester userSemes
191187
return DirectoryCreateResponse.from(newDirectory);
192188
}
193189

194-
private @NotNull UserSemester validateUserSemester(String token, Long userSemesterId) {
195-
String email = jwtProvider.getUserEmailFromToken(token);
196-
197-
User user = userRepository.findByEmail(email)
198-
.orElseThrow(() -> new EntityNotFoundException("User not found"));
199-
190+
private @NotNull UserSemester validateUserSemester(User user, Long userSemesterId) {
200191
UserSemester userSemester = userSemesterRepository.findById(userSemesterId)
201192
.orElseThrow(() -> new EntityNotFoundException("UserSemester not found"));
202193

src/main/java/com/driveu/server/domain/question/api/QuestionApi.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import com.driveu.server.domain.question.dto.request.QuestionCreateRequest;
66
import com.driveu.server.domain.question.dto.response.QuestionListResponse;
77
import com.driveu.server.domain.question.dto.response.QuestionResponse;
8+
import com.driveu.server.domain.user.domain.User;
9+
import com.driveu.server.global.config.security.auth.LoginUser;
810
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.Parameter;
912
import io.swagger.v3.oas.annotations.media.Content;
1013
import io.swagger.v3.oas.annotations.media.Schema;
1114
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -40,9 +43,10 @@ public class QuestionApi {
4043
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
4144
})
4245
public ResponseEntity<?> createQuestion(
43-
@RequestHeader("Authorization") String token,
4446
@PathVariable Long directoryId,
45-
@RequestBody List<QuestionCreateRequest> requestList){
47+
@RequestBody List<QuestionCreateRequest> requestList,
48+
@Parameter(hidden = true) @LoginUser User user
49+
){
4650
try {
4751
QuestionResponse response = questionCreatorService.createQuestion(directoryId, requestList);
4852
return ResponseEntity.ok(response);
@@ -74,8 +78,9 @@ public ResponseEntity<?> createQuestion(
7478
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
7579
})
7680
public ResponseEntity<?> getQuestionById(
77-
@RequestHeader("Authorization") String token,
78-
@PathVariable Long questionId){
81+
@PathVariable Long questionId,
82+
@Parameter(hidden = true) @LoginUser User user
83+
){
7984
try {
8085
QuestionResponse response = questionQueryService.getQuestionById(questionId);
8186
return ResponseEntity.ok(response);
@@ -107,8 +112,9 @@ public ResponseEntity<?> getQuestionById(
107112
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
108113
})
109114
public ResponseEntity<?> getQuestionsByUserSemester(
110-
@RequestHeader("Authorization") String token,
111-
@PathVariable Long userSemesterId){
115+
@PathVariable Long userSemesterId,
116+
@Parameter(hidden = true) @LoginUser User user
117+
){
112118
try {
113119
List<QuestionListResponse> response = questionQueryService.getQuestionsByUserSemester(userSemesterId);
114120
return ResponseEntity.ok(response);

src/main/java/com/driveu/server/domain/resource/api/NoteApi.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
import com.driveu.server.domain.resource.dto.response.NoteResponse;
1010
import com.driveu.server.domain.resource.dto.response.NoteUpdateTagResponse;
1111
import com.driveu.server.domain.resource.dto.response.NoteUpdateTitleResponse;
12+
import com.driveu.server.domain.user.domain.User;
13+
import com.driveu.server.global.config.security.auth.LoginUser;
1214
import io.swagger.v3.oas.annotations.Operation;
15+
import io.swagger.v3.oas.annotations.Parameter;
1316
import io.swagger.v3.oas.annotations.media.Content;
1417
import io.swagger.v3.oas.annotations.media.Schema;
1518
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -42,9 +45,10 @@ public class NoteApi {
4245
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
4346
})
4447
public ResponseEntity<?> createNote(
45-
@RequestHeader("Authorization") String token,
4648
@PathVariable Long directoryId,
47-
@RequestBody NoteCreateRequest request){
49+
@RequestBody NoteCreateRequest request,
50+
@Parameter(hidden = true) @LoginUser User user
51+
){
4852
try {
4953
NoteCreateResponse response = noteService.createNote(directoryId, request);
5054
return ResponseEntity.ok(response);
@@ -73,8 +77,9 @@ public ResponseEntity<?> createNote(
7377
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
7478
})
7579
public ResponseEntity<?> getNoteById(
76-
@RequestHeader("Authorization") String token,
77-
@PathVariable Long noteId){
80+
@PathVariable Long noteId,
81+
@Parameter(hidden = true) @LoginUser User user
82+
){
7883
try {
7984
NoteResponse response = noteService.getNoteWithTagById(noteId);
8085
return ResponseEntity.ok(response);
@@ -103,9 +108,9 @@ public ResponseEntity<?> getNoteById(
103108
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
104109
})
105110
public ResponseEntity<?> updateNoteTitle(
106-
@RequestHeader("Authorization") String token,
107111
@PathVariable Long noteId,
108-
@RequestBody NoteUpdateTitleRequest request
112+
@RequestBody NoteUpdateTitleRequest request,
113+
@Parameter(hidden = true) @LoginUser User user
109114
){
110115
try {
111116
NoteUpdateTitleResponse response = noteService.updateNoteTitle(noteId, request);
@@ -135,9 +140,9 @@ public ResponseEntity<?> updateNoteTitle(
135140
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
136141
})
137142
public ResponseEntity<?> updateNoteContent(
138-
@RequestHeader("Authorization") String token,
139143
@PathVariable Long noteId,
140-
@RequestBody NoteUpdateContentRequest request
144+
@RequestBody NoteUpdateContentRequest request,
145+
@Parameter(hidden = true) @LoginUser User user
141146
){
142147
try {
143148
NoteCreateResponse response = noteService.updateNoteContent(noteId, request);
@@ -167,9 +172,9 @@ public ResponseEntity<?> updateNoteContent(
167172
@ApiResponse(responseCode = "500", description = "서버 내부 오류")
168173
})
169174
public ResponseEntity<?> updateNoteTag(
170-
@RequestHeader("Authorization") String token,
171175
@PathVariable Long noteId,
172-
@RequestBody NoteUpdateTagRequest request
176+
@RequestBody NoteUpdateTagRequest request,
177+
@Parameter(hidden = true) @LoginUser User user
173178
){
174179
try {
175180
NoteUpdateTagResponse response = noteService.updateNoteTag(noteId, request);

0 commit comments

Comments
 (0)