티스토리 뷰

자바와 스프링에 대한 기본 지식을 기르기 위해 토이 프로젝트를 시작했습니다.

 

토이 프로젝트로 배우는 자바 스프링 [0]. prologue

자바와 스프링에 대한 기본 지식을 기르기 위해 토이 프로젝트를 시작했습니다. 프론트 코드 : https://github.com/laboratory-kkoon9/connector_front GitHub - laboratory-kkoon9/connector_front Contribute to laboratory-kkoon9/co

kkoon9.tistory.com

프론트 코드 : https://github.com/laboratory-kkoon9/connector_front

 

GitHub - laboratory-kkoon9/connector_front

Contribute to laboratory-kkoon9/connector_front development by creating an account on GitHub.

github.com

백엔드 코드 : https://github.com/laboratory-kkoon9/connector_back

 

GitHub - laboratory-kkoon9/connector_back

Contribute to laboratory-kkoon9/connector_back development by creating an account on GitHub.

github.com

배경

스프링에서는 API에 따라 권한 체크를 건너 뛰게 할 수 있습니다.

Filter에서 제공하는 shouldNotFilter를 사용해서 권한 체크를 건너 뛸 수 있는데, 이번 포스팅에서 소개해보려고 합니다.

권한

API에 따라 권한이 필요한 API, 권한이 필요없는 API가 있습니다.

권한을 어떤 것으로 판단하느냐는 여러 개발 방법이 있겠지만, 이번 토이 프로젝트에서는 token을 사용했습니다.

token 이야기를 하면 길어지니, token은 다른 포스팅에서 다뤄보겠습니다.

결국, 권한이 필요없는 API에서는 토큰을 검사하는 로직을 포함하지 않아야 합니다.

1. API path로 선별

다음 코드는 jwtTokenFilter 입니다.

@Slf4j
@Component
@RequiredArgsConstructor
public class JwtTokenFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, NullPointerException {
        // 토큰을 검사해주는 로직
    }
    
    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        Collection<String> excludeUrlPatterns = new LinkedHashSet<>();

        excludeUrlPatterns.add("/api/profile");
        excludeUrlPatterns.add("/api/profile/user/**");
        excludeUrlPatterns.add("/api/users");
        excludeUrlPatterns.add("/api/auth");

        return excludeUrlPatterns.stream().anyMatch(pattern -> new AntPathMatcher().match(pattern, request.getServletPath()));
    }
}

 

shouldNotFilter 메서드의 리턴값이 true라면 토큰을 검사해주는 로직을 수행하지 않고 다음 로직으로 넘어갈 수 있습니다.

위 코드처럼 excludeUrlPatterns에 API path를 넣어주면 해당하는 API는 권한이 없는 유저라도 호출할 수 있는 API 입니다.

토이 프로젝트에서 예시로는 다음 API들이 있습니다.

  • 프로필 목록 조회
  • 프로필 상세 조회
  • 회원가입
  • 로그인

1-1. API path로 선별의 문제점

하지만 API path로만 선별하는 건 문제점이 있습니다.

바로, path는 동일하고 HTTP Method가 다른 API가 존재할수도 있습니다.

예를 들어, 프로필 생성 API도 프로필 목록 조회와 동일한 API path("/api/profile")를 사용합니다.

2. HTTP Method를 포함한 API path로 선별

path로만 선별하는 게 문제라면 간단하게 HTTP Method도 포함해서 선별하면 됩니다.

@Slf4j
@Component
@RequiredArgsConstructor
public class JwtTokenFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, NullPointerException {
        // 토큰을 검사해주는 로직
    }
    
    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        if (new AntPathRequestMatcher("/api/profile", HttpMethod.GET.toString()).matches(request)) {
            return true;
        }

        if (new AntPathRequestMatcher("/api/profile/user/**", HttpMethod.GET.toString()).matches(request)) {
            return true;
        }

        if (new AntPathRequestMatcher("/api/auth", HttpMethod.POST.toString()).matches(request)) {
            return true;
        }

        if (new AntPathRequestMatcher("/api/users", HttpMethod.POST.toString()).matches(request)) {
            return true;
        }

        return false;
    }
}

AntPathRequestMatcher는 API path(pattern)와 httpMethod를 포함하는 matcher입니다.

이 matcher와 HttpServletRequest를 비교(matches)해주는 로직입니다.

결론

이처럼 API path와 HttpMethod로 권한 로직을 넘어가는 filter를 만들어보았습니다.

읽어주셔서 감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함