기존 코드 상의 authority는 미흡한 점이 많아, 제대로 동작하지 않았습니다. 이를 고쳐 @PreAuthorize와 같은 어노테이션을 활용한 접근 제한이 가능하도록 수정하였습니다.
기존 PrincipalDetails에는 Member 객체가 포함되어있어, Service 레이어에서 member.getId()를 통해 ID를 추출후, 다시 repository를 통해 Member를 검색해야되는 비효율성이 존재했습니다. 따라서 PrincipalDetails에는 Member의 Id, LoginType, Role이 포함되도록 수정되었습니다.
위 3가지 필드는 JWT 토큰의 Claim으로 저장되도록 JWT의 구조를 변경하였습니다.
기존의 Member 조회 쿼리 발생은 다음과 같이 발생했습니다.
JwtTokenProvider에서 Member 조회 쿼리 수행 (JWT에 존재하는 Id로 Member 조회) 후 PrincipalDetails에 저장
이후, Service 레이어에서 memberId로 (PrincipalDetails에 존재하는 Member의 Id) 다시 Member를 조회
PrincipalDetails에 Member가 아닌, memberId를 저장하여, 조회 쿼리를 1번만 발생하도록 줄였습니다.
Claim에 LoginType이 들어간 이유 :
로그아웃, 비밀번호 변경과 같이 LoginType에 따라 로직이 다르게 수행되야 하는 경우가 존재하여, PrincipalDetails에 포함시켰습니다.
Claim에 Role이 들어간 이유 :
Controller 메서드가 실행되기 전, 해당 사용자의 권한을 알아야 하기 때문에 PrincipalDetails에 포함시켰습니다.
PR Summary
25
PR Detail Description
위 3가지 필드는 JWT 토큰의 Claim으로 저장되도록 JWT의 구조를 변경하였습니다.
기존의 Member 조회 쿼리 발생은 다음과 같이 발생했습니다.
PrincipalDetails에 Member가 아닌, memberId를 저장하여, 조회 쿼리를 1번만 발생하도록 줄였습니다.
Claim에 LoginType이 들어간 이유 :
Claim에 Role이 들어간 이유 :
Screenshots (Optional)
-