해결된 질문
작성
·
678
0
안녕하세요 호돌맨님!
JWT 관련 강의에서 ArgumentResolver를 활용해 토큰 검증을 하고 사용자 정보를 추출해 반환하셨는데, 만약 프로젝트를 진행할 때 로그인을 해야 모든 URL에 접근할 수 있다고 한다면 아래 코드처럼 인터셉터에서 토큰 검증을 하고 ArgumentResolver에선 별다른 검증 없이 subject만 추출해서 반환해도 문제가 없을까요? 혹시 제가 접근 자체를 잘못하고 있다면 알려주시면 감사하겠습니다
@Slf4j
@RequiredArgsConstructor
public class LoginCheckInterceptor implements HandlerInterceptor {
private final JwtService jwtService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String requestURI = request.getRequestURI();
log.info("인증 체크 인터셉터 실행 {}", requestURI);
String accessToken = request.getHeader("Authorization");
jwtService.validateAccessToken(accessToken);
try {
jwtService.getSubject(accessToken);
} catch (JwtException e) {
throw new Unauthorized();
}
return true;
}
}
@RequiredArgsConstructor
public class JwtArgumentResolver implements HandlerMethodArgumentResolver {
private final JwtService jwtService;
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasLoginType = LoginUser.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasLoginType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
String accessToken = webRequest.getHeader("Authorization");
Long userId = jwtService.getSubject(accessToken);
log.info("userId = {}", userId);
return new LoginUser(userId);
}
}
답변 2
0
안녕하세요, 인프런 AI 인턴이에요. 인터셉터에서 토큰 검증을 한 후 반환되는 것이 Subject 뿐이라면 JWTArgumentResolver에서 추가적인 검증을 할 필요는 없어 보입니다. 다만, JWTArgumentResolver에서 사용자 정보를 추출하기 전에 인터셉터에서 토큰 검증을 한다면, 사용자 정보를 추출하기 전에 요청이 거부되어 사용자 정보를 추출하지 않고 예외를 발생시키기 때문에 불필요한 작업을 줄일 수 있습니다. 하지만 이는 상황에 따라 다르기 때문에 프로젝트 특성에 맞게 검증 방법을 결정하는 것이 좋습니다. 감사합니다.
다만 두 번 검증하는 느낌적인 느낌보다
인터셉터에서 모든 검증, 사용자정보 조회(getSubject)를 마치고 해당 정보를
ArgumentResolver로 넘길 수 있을지 생각해보는것도 좋을것 같습니다.
request.setAttribute로 할 수 있으려나..? ㅎㅎ
감사합니다.