inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

인터셉터 활용?

해결된 질문

733

민혁

작성한 질문수 7

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);

    }
}

vue.js aws spring-boot jpa spring-security

답변 2

0

호돌맨

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

로그인을 해야 접근할 수 있으니 로그인여부는 Interceptor에서 하시고
사용자 정보가 필요한경우만 ArgumentResolver에서 진행하신거죠?

아주아주 훌륭하십니다. ~~ 짝짝짝!

1

호돌맨

다만 두 번 검증하는 느낌적인 느낌보다
인터셉터에서 모든 검증, 사용자정보 조회(getSubject)를 마치고 해당 정보를
ArgumentResolver로 넘길 수 있을지 생각해보는것도 좋을것 같습니다.
request.setAttribute로 할 수 있으려나..? ㅎㅎ

감사합니다.

0

민혁

말씀하신대로 진행하니 훨씬 더 좋은 코드가 된 것 같습니다
바쁘실텐데 답변해주셔서 감사합니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요. 인터셉터에서 토큰 검증을 한 후 반환되는 것이 Subject 뿐이라면 JWTArgumentResolver에서 추가적인 검증을 할 필요는 없어 보입니다. 다만, JWTArgumentResolver에서 사용자 정보를 추출하기 전에 인터셉터에서 토큰 검증을 한다면, 사용자 정보를 추출하기 전에 요청이 거부되어 사용자 정보를 추출하지 않고 예외를 발생시키기 때문에 불필요한 작업을 줄일 수 있습니다. 하지만 이는 상황에 따라 다르기 때문에 프로젝트 특성에 맞게 검증 방법을 결정하는 것이 좋습니다. 감사합니다.

Deprecated 관련 사항들

0

105

2

깃헙 collaboator 초대 관련

0

89

1

강의 듣다가 도커 이미지 생성시 각각도 가능하나 그렇게 사용하는데가 많은지 모르겠다라는 말을 듣고 남김니다

0

157

2

logout 후에 login 페이지 이동은 어디서 시켜주는건가요?

0

233

1

다중 데이터를 삭제 할 때

0

271

2

querydsl Q class 이슈

0

416

2

Windows WSL Vue 설정

2

247

1

Dip, @transactional

0

189

1

[vite] http proxy error: /auth/login

0

1047

2

로그인 하고 나서 GET요청으로 메인페이지 요청

0

234

2

GitHub Collaborator 초대 관련

0

258

2

Window에서 Vue.js 설정

0

322

2

(솔루션 수정)'tsyringe' Error: TypeInfo not known for "클래스명"

0

713

2

collaboator로 초대받을 수 있을까요??

0

283

2

SecurityMockContext 로부터 유저 정보를 가져오기

0

262

1

given 부분이 길어질 때 어떻게 처리하면 좋을까요?

0

318

1

섹션9 프론트의 코드를 보고싶습니다,,,

0

423

1

Spring Security - defaultSuccessUrl 질문

0

627

1

강의 화면이 나오지 않습니다. 음성과 자막만 나와요

0

302

1

JPAQueryFactory(em)의 객체 생성자 오류에 대해서 질문이 있습니다ㅜㅜ

0

690

2

ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상

0

1182

2

섹션10 언제 나오나요?

0

485

1

CommentService에서 Repository를 호출하지 않는데도

0

345

1

Editor....를 활용한 패턴에 질문있습니다.

0

496

1