최종 검증 리포트 — 코드 ↔ MD ↔ 나만의참고.md
전체 코드와 jwt_oauth2설명.md(부족한점 적용 포함)를 비교하고,
나만의참고.md 규칙이 코드에 잘 적용되었는지 최종 확인한 결과.
1. 코드 ↔ MD 비교 결과
✅ 일치 확인된 항목
| 파일 |
MD 섹션 |
결과 |
InMemoryAuthorizationRequestRepository |
2-1 |
✅ 코드 = MD (ScheduledExecutorService, ConcurrentHashMap) |
Oauth2LoginController |
2-1 |
✅ 코드 = MD (@GetMapping, @Controller, ResponseEntity) |
CustomOAuth2UserService |
2-4 |
✅ 코드 = MD (passwordEncoder + UUID, @Transactional) |
OAuth2LoginSuccessHandler |
2-4 |
✅ 코드 = MD |
JwtUtil |
— |
✅ 코드 = MD (getTokenType에 ExpiredJwtException + JwtException 처리) |
JwtLoginFilter |
4 |
✅ 코드 = MD (throws IOException, ServletException 포함) |
JwtAccessTokenCheckAndSaveUserInfoFilter |
4 |
✅ 코드 = MD ("refresh".equals(tokenType) NPE 방지) |
RefreshController |
5 |
✅ 코드 = MD (@PostMapping, 존재→만료→삭제 순서) |
LogoutController |
5 |
✅ 코드 = MD (@PostMapping) |
RefreshService |
5 |
✅ 코드 = MD |
CustomUserAccount |
6 |
✅ 코드 = MD (UserDetails + OAuth2User 통합) |
SecurityConfig |
7 |
✅ 코드 = MD (필터 등록, OAuth2 설정, exceptionHandling) |
| API 요약표 |
9 |
✅ 실제 endpoint/method와 일치 |
📝 참고: MD에 코드블록이 없는 파일
| 파일 |
이유 |
MainController |
테스트/확인용 API. MD 8-4에서 실행결과 스크린샷으로만 언급 |
JoinController |
표준 회원가입 로직. MD에서는 API 요약표에만 기재 |
CustomUserDetailsService |
MD 섹션 4의 흐름도에서 언급, 표준 Spring Security 패턴 |
OAuthProvider |
현재 코드에서 직접 사용하지 않는 유틸 enum (향후 확장용) |
UserEntity, RefreshEntity |
Entity 구조는 MD에서 텍스트로 언급 (별도 코드블록 불필요) |
2. 나만의참고.md 규칙 적용 확인
📐 Layer Architecture
| 규칙 |
적용 상태 |
상세 |
| Controller → Service → Repository |
✅ 적용됨 |
모든 Controller가 Service를 통해 로직 처리 |
| Controller에서 Repository 직접 사용 ❌ |
✅ 적용됨 |
Repository 직접 호출하는 Controller 없음 |
| Controller에서 Entity 사용 ❌ |
✅ 적용됨 |
MainController가 CustomUserAccount(DTO역할)만 사용, Entity 직접 노출 없음 |
🔐 Security 규칙
| 규칙 |
적용 상태 |
상세 |
@AuthenticationPrincipal CustomUserAccount |
✅ 적용됨 |
MainController에서 사용 |
| Access Token 짧은 만료 |
✅ 적용됨 |
1분 (테스트용) |
| Refresh Token 긴 만료 + DB 저장 |
✅ 적용됨 |
5분 + RefreshEntity DB 저장 |
📤 응답 표준화
| 규칙 |
적용 상태 |
비고 |
ResponseEntity<> 사용 |
✅ 적용됨 |
RefreshController, LogoutController, MainController |
ApiResponse<T> 래핑 |
⚠️ 미적용 |
JWT 강의용 프로젝트로 ApiResponse 클래스 미존재. 단순 Map 응답으로 대체 (합리적 범위) |
| JSON 응답 |
✅ 적용됨 |
MainController의 HTML 반환 → Map JSON으로 수정 완료 |
| 비밀번호 노출 방지 |
✅ 적용됨 |
MainController에서 password 필드 제거 완료 |
기타 코딩 규칙
| 규칙 |
적용 상태 |
상세 |
@RestController 사용 |
✅ 적용됨 |
JoinController, MainController, LogoutController, RefreshController 모두 @RestController |
| HTTP 메소드 명시 |
✅ 적용됨 |
@GetMapping/@PostMapping 사용 (@RequestMapping 미사용) |
| OAuth2 비밀번호 보안 |
✅ 적용됨 |
{noop}oauth2user → passwordEncoder.encode(UUID) (Service + OAuthProvider enum 모두) |
3. 이번 검증에서 수정한 항목
코드 수정
| # |
파일 |
수정 내용 |
| 1 |
JwtAccessTokenCheckAndSaveUserInfoFilter |
tokenType.equals("refresh") → "refresh".equals(tokenType) (NPE 방지) |
| 2 |
JwtAccessTokenCheckAndSaveUserInfoFilter |
불필요한 import 5개 제거 |
| 3 |
RefreshController |
@RequestMapping("/reissue") → @PostMapping("/reissue") |
| 4 |
LogoutController |
@RequestMapping("/logout") → @PostMapping("/logout") |
| 5 |
MainController |
@Controller+@ResponseBody → @RestController |
| 6 |
MainController |
@RequestMapping("/my/info") → @GetMapping("/my/info") |
| 7 |
MainController |
HTML 문자열 반환 → JSON(Map) + ResponseEntity 반환 |
| 8 |
MainController |
비밀번호 응답에서 제거 (보안 문제) |
| 9 |
MainController |
불필요한 import 제거 (HttpSession, Principal 등) |
| 10 |
MainController |
"email:" 라벨로 nickname 표시하던 오타 해결 |
| 11 |
JoinController |
@Controller+@ResponseBody → @RestController |
| 12 |
JoinController |
불필요한 import 제거 (@GetMapping 등) |
| 13 |
OAuthProvider |
{noop}oauth2user → passwordEncoder.encode(UUID) |
| 14 |
OAuthProvider |
toUserEntity() 메소드에 PasswordEncoder 파라미터 추가 |
MD 수정
| # |
위치 |
수정 내용 |
| 1 |
섹션 4 JwtAccessTokenCheckAndSaveUserInfoFilter |
"refresh".equals(tokenType) NPE 방지 반영 |
| 2 |
섹션 4 JwtLoginFilter |
successfulAuthentication()에 throws IOException, ServletException 추가 |
| 3 |
섹션 4 JwtLoginFilter |
unsuccessfulAuthentication()에 throws IOException, ServletException 추가 |
| 4 |
섹션 5 RefreshController |
@RequestMapping → @PostMapping 반영 |
| 5 |
섹션 5 LogoutController |
@RequestMapping → @PostMapping 반영 |
4. 최종 결론
| 항목 |
상태 |
| 코드 ↔ MD 일치 |
✅ 모든 코드블록이 실제 코드와 일치 |
| 나만의참고.md 규칙 |
✅ JWT 강의 범위 내에서 모두 적용됨 |
| 보안 이슈 |
✅ 비밀번호 노출, {noop} 비밀번호, NPE 취약점 모두 해결 |
| 코딩 컨벤션 |
✅ @RestController, @GetMapping/@PostMapping, JSON 응답 통일 |
남은 참고사항: OAuthProvider enum은 현재 프로젝트에서 직접 사용되지 않음 (CustomOAuth2UserService가 인라인으로 처리).
다중 OAuth2 프로바이더 지원 시 활용할 수 있는 확장용 코드로, 보안 수정(PasswordEncoder)만 적용해 둠.