๐Ÿ“š[Spring] Interceptor

ํ…ํ…ยท2025๋…„ 6์›” 12์ผ

Interceptor ๋ฅผ ํ™œ์šฉํ•œ API ๊ถŒํ•œ ๊ฒ€์‚ฌ ๋ฐ ๋กœ๊น…

์š”๊ตฌ์‚ฌํ•ญ

  1. Interceptor๋ฅผ ์‚ฌ์šฉํ•œ API ๋กœ๊น…
  • ์š”์ฒญ ์ •๋ณด(HttpServletRequest)๋ฅผ ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์–ด๋“œ๋ฏผ ๊ถŒํ•œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ฆ ์„ฑ๊ณต ์‹œ, ์š”์ฒญ ์‹œ๊ฐ๊ณผ URL์„ ๋กœ๊น…ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์„ธ์š”.

Interceptor ๋ž€?

HandlerInterceptor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋งŒ๋“ค๋ฉฐ ์„ธ ๊ฐœ์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • preHandel() : ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ ์—ฌ๊ธฐ์„œ ์š”์ฒญ์„ ๊ณ„์† ์ง„ํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • postHandler() : ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ํ›„์— ํ˜ธ์ถœ๋˜๋ฉฐ ์‘๋‹ต ์ฒ˜๋ฆฌ ์ง์ „์— ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • afterCompletion() : ๋ทฐ๊นŒ์ง€ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ๋˜์–ด ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์š”์ฒญ ์ •๋ณด๋ฅผ ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์„ preHandle()๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.


๊ตฌํ˜„์˜ˆ์‹œ - AuthInterCeptor

@Slf4j
@Component
@RequiredArgsConstructor
public class AuthInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

		UserRole role = UserRole.of((String)(request.getAttribute("userRole")));

		if (!UserRole.ADMIN.equals(role)) {
			throw new AuthException("๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.");
		}

		Long userId = (Long)request.getAttribute("userId");
		String url = request.getRequestURI();
		// String stamp = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);

		log.info("๊ถŒํ•œ์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. userId = {}, url = {}, timestamp = {}", userId, url, LocalDateTime.now());

		return true;
	}
}
  • ์š”์ฒญ์—์„œ userRole ์ •๋ณด๋ฅผ ๊บผ๋‚ด ์–ด๋“œ๋ฏผ์ธ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • ์–ด๋“œ๋ฏผ์ด ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ์š”์ฒญ์„ ๋ง‰๋Š”๋‹ค.
  • ์–ด๋“œ๋ฏผ์ด๋ฉด ์‚ฌ์šฉ์ž ID, ์š”์ฒญ URL, ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ๋กœ๊ทธ๋กœ ๋‚จ๊ธด๋‹ค.
  • ๋งˆ์ง€๋ง‰์— true ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์š”์ฒญ์„ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ฒŒ ํ•œ๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ ๋“ฑ๋ก - WebConfig

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
    public final AuthInterceptor authInterceptor;
	
    ...
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
            .addPathPatterns("/admin/**"); // /admin/** ๊ฒฝ๋กœ์—๋งŒ ์ ์šฉ
    }
}
  • WebMvcConfigurer๋ฅผ ๊ตฌํ˜„ํ•œ ์„ค์ • ํด๋ž˜์Šค์—์„œ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
  • addPathPatterns()๋กœ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ ์šฉํ•  URL ํŒจํ„ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํ•„์š”์— ๋”ฐ๋ผ .order(), .excludePathPatterns() ๊ฐ™์€ ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    • .order(index) : ์ฒด์ธ์ˆœ์„œ๋ฅผ ์„ค์ •
    • .addPathPatterns("url") : ์ฒด์ธ์„ ์ ์šฉํ•  url ์„ ์„ค์ •
    • .excludePathPatterns("url") : ์ฒด์ธ์„ ์ œ์™ธํ•  url ์„ ์„ค์ •
profile
์ฐจ๊ทผ์ฐจ๊ทผ

0๊ฐœ์˜ ๋Œ“๊ธ€