Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자 되버리기

Springboot 토큰 걸러내기 본문

개발/Spring_Boot

Springboot 토큰 걸러내기

구본익 2020. 12. 13. 18:11

사내에서 프론트엔드와 클라이언트 단에서 토큰 로그아웃을 진행하였는데

무언가 오류가 나거나 토큰이 불필요하게 남아있게 될 경우를 대비에 토큰이 불필요한 API에 대해 토큰을 사용하지 않도록 필터링 하는 작업을 진행하게 되었습니다.

 

일단 기본적으로 밑에 글의 트래픽 인터셉트 글을 참고하시면 좋을 듯 합니다.

koogood.tistory.com/32

 

SpringBoot 트래픽 제한하기

한번에 많은 요청이 오거나 혹은 문자인증을 하거나 또는 외부로부터 공격이 왔을 경우 내부의 자원을 보호하기 위해 대비책을 세워두면 좋습니다. 이번 포스팅에서는 Bucket4j를 이용하여 트래

koogood.tistory.com

 

 

우선 인터셉트에 필터 관련 코드를 추가합니다.

 

@Component
@Log4j2
@RequiredArgsConstructor
public class HttpInterceptor extends HandlerInterceptorAdapter {
	PricingPlanService pricingPlanService = new PricingPlanService();
	private  final JwtTokenProvider jwtTokenProvider;
	@Override
	public boolean preHandle(HttpServletRequest request,
							 HttpServletResponse response,
							 Object handler) {
		
		String jwt = request.getHeader("Authorization");
		log.info("================ Before Method");
		log.info("접속 ip 주소 '{}'", request.getRemoteAddr());
		log.info(request.getRemoteAddr());
		if(tokenFilter(request)){
			if(jwt != null && !jwt.equals("undefined")){
				Bucket bucket = pricingPlanService.jwtBucket(jwt);
				log.info("jwt값 : '{}'", jwt);
				if(!jwtTokenProvider.validateToken(jwt)){
					log.info("토큰만료 : '{}'", jwt);
					response.setStatus(401);
					return false;
				}
				return validOverTraffic(bucket, jwt);
			}
		}
		Bucket bucket = pricingPlanService.resolveBucket(request);
		return validOverTraffic(bucket, request.getRemoteAddr());
	}
	@Override
	public void postHandle( HttpServletRequest request,
							HttpServletResponse response,
							Object handler,
							ModelAndView modelAndView) {
		log.info("================ Method Executed");
	}
	@Override
	public void afterCompletion(HttpServletRequest request,
								HttpServletResponse response, 
								Object handler, 
								Exception ex) {
		log.info("================ Method Completed");
	}
	private boolean validOverTraffic(Bucket bucket, String data){
		if (bucket.tryConsume(1)) { // 1개 사용 요청
			// 초과하지 않음
			return true;
		} else {
			// 제한 초과
			log.info("{} 트래픽 초과!!!", data);
			return false;
		}
	}

	public boolean tokenFilter(HttpServletRequest re){
		if(re.getRequestURI().contains("signIn") ||
				re.getRequestURI().contains("region/city") ||
				re.getRequestURI().contains("region/region")){
			return false;
		}
		return true;
	}
}

 

이제 /sigiIn이나 region/city, region/region에 API에 요청이 오는 것에 대해서는 토큰을 사용하지 않을겁니다.

Comments