Spring Framework/Spring & Spring Boot

[Spring] ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor)

soogoori 2024. 3. 18. 17:39

Spring Security๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด filter์™€ interceptor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด Spring Security ๊ณผ์ •์„ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๊ธฐ์— ๊ธฐ๋กํ•œ๋‹ค! 

โœจ ์šฉ๋„ - ๊ณตํ†ต๊ด€์‹ฌ์‚ฌํ•ญ (Cross-cutting concern)

๐Ÿ‘‰ ์›น ์„œ๋น„์Šค์—์„œ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ ๋กœ์ง์— ๋กœ๊ทธ์ธ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ• ํ…๋ฐ... ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋  ๊ฒƒ์ด๊ณ  ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค. 

๋งŽ์€ ๋กœ์ง์—์„œ ๊ณตํ†ต์œผ๋กœ ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์ด๋ฅผ ์Šคํ”„๋ง์˜ AOP๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›น์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 
๐Ÿ‘‰ HTTP์˜ ํ—ค๋”๋‚˜ URL ์ •๋ณด (ํŠน์ • URL์ผ ๋•Œ ์ธ์ฆ) โž” HttpServletRequest๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ, ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ ์‚ฌ์šฉ 

 

 

 

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ & ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ 

ํ•„ํ„ฐ๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ ์ œ๊ณตํ•˜๊ณ , ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. 

ํ๋ฆ„์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ ๋ชจ๋‘ ์Šคํ”„๋ง controller๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ํ›„์— ์ ์šฉ๋œ๋‹ค. 

 

 

 

 

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ 

 

๐Ÿ”น ํ•„ํ„ฐ์˜ ํ๋ฆ„ 

HTTP ์š”์ฒญ โž” WAS โž” ํ•„ํ„ฐ โž” ์„œ๋ธ”๋ฆฟ โž” ์ปจํŠธ๋กค๋Ÿฌ
  • ํ•„ํ„ฐ๋Š” ํŠน์ • URL ํŒจํ„ด์— ์ ์šฉ ๊ฐ€๋Šฅ ๐Ÿ‘‰ /* ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ชจ๋“  ์š”์ฒญ์— ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ
  • ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์Šคํ”„๋ง์˜ ๊ฐ€์žฅ ์•ž๋‹จ์— ์กด์žฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ด๋ฏ€๋กœ ํ•„ํ„ฐ๋Š” ์Šคํ”„๋ง ๋ฒ”์œ„ ๋ฐ–์—์„œ ์ฒ˜๋ฆฌ๋จ
    • ์Šคํ”„๋ง ๋ฒ”์œ„ ๋ฐ–์ด๋”๋ผ๋„ bean ์‚ฌ์šฉ ๊ฐ€๋Šฅ..! โž” ์›๋ž˜๋Š” ๋ชป ์ผ๋Š”๋ฐ ๋ฒ„์ „์—…๋˜๋ฉด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ..

 

๐Ÿ”น ํ•„ํ„ฐ ์ฒด์ธ 

HTTP ์š”์ฒญ โž” WAS โž” ํ•„ํ„ฐ1  โž” ํ•„ํ„ฐ2   โž” ํ•„ํ„ฐ3 โž” ์„œ๋ธ”๋ฆฟ โž” ์ปจํŠธ๋กค๋Ÿฌ
  • ์ค‘๊ฐ„์— ํ•„ํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
    ex) ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ํ•„ํ„ฐ๋ฅผ ๋จผ์ € ์ ์šฉํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ํ•„ํ„ฐ ๋งŒ๋“ฆ

 

 

๐Ÿ”น ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค 

public interface Filter {
    public default void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

    public default void destroy() {}
}
  • ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋“ฑ๋กํ•˜๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„ํ„ฐ๋ฅผ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ
  • init() : ํ•„ํ„ฐ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ โž” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ
  • doFilter() : ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ  โž” ํ•„ํ„ฐ ๋กœ์ง ๊ตฌํ˜„
    • chain.doFilter()๋กœ ๋‹ค์Œ ํ•„ํ„ฐ ํ˜ธ์ถœ โž” ๋งŒ์•ฝ ์—†๋‹ค๋ฉด ์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ 
  • destroy() : ํ•„ํ„ฐ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ โž” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ

 

 

 

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ 

 

โœจ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ณ  ๋” ์ •๊ตํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต 

๐Ÿ”น ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ ํ๋ฆ„ 

HTTP ์š”์ฒญ โž” WAS โž” ํ•„ํ„ฐ โž” ์„œ๋ธ”๋ฆฟ โž” ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ โž” ์ปจํŠธ๋กค๋Ÿฌ
  • ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ๊ณผ ์ปจํŠธ๋กค๋Ÿฌ ์‚ฌ์ด์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ง์ „์— ํ˜ธ์ถœ๋จ

 

๐Ÿ”น ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ ์ฒด์ธ 

HTTP ์š”์ฒญ โž” WAS โž” ํ•„ํ„ฐ โž” ์„œ๋ธ”๋ฆฟ โž” ์ธํ„ฐ์…‰ํ„ฐ1 โž” ์ธํ„ฐ์…‰ํ„ฐ2 โž” ์ปจํŠธ๋กค๋Ÿฌ

 

 

๐Ÿ”น ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค 

public interface HandlerInterceptor {
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}
}

 

doFilter ํ•˜๋‚˜๋กœ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ๋‹ฌ๋ฆฌ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” 3๊ฐœ๋กœ ์„ธ๋ถ„ํ™”๋˜์–ด์žˆ๋‹ค. 

  • preHandle() : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „ (ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ ์ „)
  • postHandle() : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ํ›„ (ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ ํ›„)
  • afterCompletion() : ์š”์ฒญ ์™„๋ฃŒ ์ดํ›„ โž” ํ•ญ์ƒ ํ˜ธ์ถœ๋จ

 

 

 

ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ ์ฐจ์ด ์ •๋ฆฌ ๋ฐ ์š”์•ฝ

 

  • XSS ๊ณต๊ฒฉ, CORS ์ •์ฑ…์„ ์ž˜ ๋”ฐ๋ฅด๋ฉด์„œ ๋ณด๋ƒˆ๋Š”์ง€ ๋“ฑ์„ ๋จผ์ € ํ•„ํ„ฐ์—์„œ ๊ฑฐ๋ฅด๊ณ  ํ†ต๊ณผํ•œ ๊ฒƒ๋“ค๋งŒ ์Šคํ”„๋ง์—์„œ ์ฒ˜๋ฆฌ
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์•ž ๋’ค๋กœ ์ธก์ • ์‹œ ์ธํ„ฐ์…‰ํ„ฐ ์‚ฌ์šฉ 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://mangkyu.tistory.com/173

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2