Commit 493d688
authored
feat(Jwt): Auth, Filter, Exception (#50)
* feat(JwtParser): JWT 파싱 예외 처리 추가
* feat(JwtRefresher): 프론트엔드와 협의한 JWT 갱신 로직 완성
* feat(JwtValidator): 명확한 검증을 위해 boolean 반환에서 예외 반환으로 수정
* feat(JwtGenerator): 동일 시점 생성 토큰을 JTI로 구분
* feat(JwtService): JWT 서비스 구조 개선 및 기능 추가
- verifyToken 메서드 제거 후 processAccessToken 메서드로 통합.
- 만료된 AccessToken을 처리하고 갱신된 토큰을 Set-Cookie 헤더에 추가하도록 구현.
- HttpServletResponse를 활용해 갱신된 AccessToken 설정 로직 추가.
- 만료된 AccessToken에 대한 예외 처리 로직(handleJwtExpiredException) 추가.
- JwtException을 확인하고 만료된 토큰만 갱신 처리.
- SetCookieUseCase 의존성 주입을 통해 클라이언트에 새로운 AccessToken 전달.
- JwtRefresher와 SetCookieUseCase를 활용하여 클라이언트 응답에 새로운 AccessToken을 설정하는 책임 분리.
- JwtValidator와 JwtParser를 활용한 검증 및 클레임 추출 구조 간소화.
* feat(JwtValidator): 반환 타입 변경, 내부 예외 처리
* feat(JwtException): Jwt 예외를 위한 메시지와 클래스 추가
* feat(RefreshTokenManager): 예외 타입, 메시지 수정
* feat(JwtAuthenticationToken): 사용자 인증 정보를 커스텀 인증 토큰으로 관리
- 사용자 정보를 담는 principal(userId)과 credentials(accessToken) 필드 추가
- Spring Security의 AbstractAuthenticationToken을 상속받아 SecurityContext와의 호환성 유지
- setAuthenticated(true)를 통해 인증 상태 설정 (생선 전에 검증함)
- 이후 SecurityContextHolder에서 principal 및 권한 정보를 추출하여 사용 가능
* feat(JwtAuthFilter): JWT 기반 인증 필터 구현
- HTTP 요청의 Authorization 헤더에서 JWT 추출
- 추출한 JWT를 검증하고 만료 시 리프레시 처리 (JwtUseCase 활용)
- JWT Claims에서 사용자 ID와 권한을 추출하여 JwtAuthenticationToken 생성
- SecurityContextHolder에 Authentication 객체 등록하여 인증 상태 관리
- shouldNotFilter 메서드로 특정 요청 URI에 대해 필터링 제외 가능 (현재는 개발 중 모든 요청 허용)
* feat(JwtExceptionFilter): JWT 예외 처리 필터 구현
- JWT 처리 중 발생하는 JwtException을 전용 필터에서 처리 (스프링 컨텍스트가 아니므로)
- HTTP 상태 코드 401(Unauthorized)와 함께 ProblemDetail 형식의 JSON 응답 생성
- ProblemDetail 응답에 오류 제목, 유형, 상세 메시지, 타임스탬프 포함
* feat(SecurityConfig): JwtAuthFilter, JwtExceptionFilter 추가
- JwtAuthFilter: 요청 헤더에서 JWT를 검증하고, 인증 정보를 SecurityContext에 설정
- JwtExceptionFilter: JWT 처리 중 발생한 예외를 캡처하고 ProblemDetail 형식으로 응답 반환
* test(JwtServiceTest): 다양한 JWT 테스트 추가
- JWT 토큰 생성 및 검증 로직 테스트:
- 토큰이 올바르게 생성되고, 예상한 클레임(`id`, `role`, `expiration`)을 포함하는지 확인.
- 동일 사용자에 대해 여러 토큰 생성 시 서로 다른 값이어야 함을 검증.
- JWT 만료 및 갱신 로직 테스트:
- 만료된 AccessToken이 RefreshToken이 유효한 경우 갱신되는지 확인.
- RefreshToken이 유효하지 않거나 존재하지 않을 때 예외 발생을 검증.
- RefreshToken 관련 테스트:
- 기존 RefreshToken이 올바르게 갱신되는지 확인.
- RefreshToken이 없거나 잘못된 경우 예외 발생을 검증.
- JWT 예외 처리 테스트:
- 잘못된 토큰 및 만료된 토큰이 적절한 `JwtException`을 던지는지 확인.
- RefreshToken 저장 및 유효성 확인 테스트:
- RefreshToken 저장 로직 검증.
- 갱신된 AccessToken이 쿠키에 올바르게 설정되는지 확인.
* feat(JwtAuthenticationToken): 직렬화 지원 추가
- principal 필드를 직렬화 가능하도록 수정
- credentials 필드는 인증 이후에 사용하지 않으니 직렬화 제외
- 세션 저장 및 분산 서버 환경에서의 호환성 확보
* refactor: unused import 삭제
* style(개행): git 잠재적인 이슈 예방
* style: when, then 주석 행 맞추기
* feat(ProblemDetail): type 삭제
* refactor(JwtAuthFilter): private 메서드 위치 변경1 parent 6134620 commit 493d688
File tree
15 files changed
+551
-41
lines changed- src
- main/java/com/somemore
- auth/jwt
- exception
- filter
- generator
- parser
- refresh
- manager
- refresher
- service
- usecase
- validator
- global/configure
- test/java/com/somemore/auth/jwt/service
15 files changed
+551
-41
lines changedLines changed: 15 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
Lines changed: 14 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
Lines changed: 67 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
Lines changed: 31 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
Lines changed: 50 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| 27 | + | |
26 | 28 | | |
27 | 29 | | |
28 | 30 | | |
| 31 | + | |
29 | 32 | | |
30 | 33 | | |
31 | 34 | | |
| |||
Lines changed: 19 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
4 | 6 | | |
| 7 | + | |
5 | 8 | | |
| 9 | + | |
6 | 10 | | |
7 | 11 | | |
8 | 12 | | |
| |||
14 | 18 | | |
15 | 19 | | |
16 | 20 | | |
| 21 | + | |
17 | 22 | | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
23 | 37 | | |
24 | 38 | | |
Lines changed: 4 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
4 | 6 | | |
5 | 7 | | |
6 | | - | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| |||
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
19 | | - | |
| 20 | + | |
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
27 | | - | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | | - | |
| 31 | + | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| |||
Lines changed: 3 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
| 29 | + | |
29 | 30 | | |
30 | | - | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
35 | 36 | | |
36 | 37 | | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | 38 | | |
46 | 39 | | |
47 | 40 | | |
| |||
Lines changed: 22 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
| 6 | + | |
| 7 | + | |
5 | 8 | | |
6 | 9 | | |
7 | 10 | | |
8 | 11 | | |
9 | 12 | | |
| 13 | + | |
| 14 | + | |
10 | 15 | | |
11 | 16 | | |
12 | 17 | | |
| |||
19 | 24 | | |
20 | 25 | | |
21 | 26 | | |
| 27 | + | |
22 | 28 | | |
23 | 29 | | |
24 | 30 | | |
25 | 31 | | |
26 | 32 | | |
27 | 33 | | |
28 | 34 | | |
29 | | - | |
30 | | - | |
31 | | - | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
32 | 40 | | |
33 | | - | |
34 | | - | |
35 | 41 | | |
36 | 42 | | |
37 | 43 | | |
38 | | - | |
39 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
40 | 55 | | |
41 | 56 | | |
0 commit comments