티스토리 뷰
토이 프로젝트로 배우는 자바 스프링 [3]. API path와 HTTP Method로 권한 분리하기
kkoon9 2024. 1. 23. 23:25자바와 스프링에 대한 기본 지식을 기르기 위해 토이 프로젝트를 시작했습니다.
프론트 코드 : https://github.com/laboratory-kkoon9/connector_front
백엔드 코드 : https://github.com/laboratory-kkoon9/connector_back
배경
스프링에서는 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를 만들어보았습니다.
읽어주셔서 감사합니다.
'개발 노트 > 토이 프로젝트로 배우는 스프링+자바' 카테고리의 다른 글
토이 프로젝트로 배우는 자바 스프링 [5]. 엔티티의 생성시각을 자동으로 저장하기 (JPA Auditing) (0) | 2024.04.23 |
---|---|
토이 프로젝트로 배우는 자바 스프링 [4]. WebSecurityConfigurerAdapter deprecated (1) | 2024.01.28 |
토이 프로젝트로 배우는 자바 스프링 [2]. 연관관계 추가 및 삭제 (0) | 2024.01.16 |
토이 프로젝트로 배우는 자바 스프링 [1]. N+1 문제 (1) | 2023.12.19 |
토이 프로젝트로 배우는 자바 스프링 [0]. prologue (1) | 2023.11.27 |
- Total
- Today
- Yesterday
- 프로그래머스
- 클린 코드
- 정규표현식
- 이펙티브 자바
- Algorithm
- AWS
- Olympiad
- Java
- Spring
- 이팩티브 자바
- Spring Boot
- 코테
- JPA
- BAEKJOON
- 디자인패턴
- 알고리즘
- Kotlin
- 디자인 패턴
- kkoon9
- 객체지향
- C++
- Effective Java
- kotest
- 클린 아키텍처
- BOJ
- 백준
- programmers
- node.js
- MSA
- 테라폼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |