๐Ÿ”’ Servlet Filter, Spring Intercepter ํŠน์ง•๊ณผ ์ฐจ์ด ์ดํ•ดํ•˜๊ธฐ

5,069 ๋‹จ์–ดยท11 ๋ถ„ยท์›๋ฌธ(.md)

๊ฐœ์š” #

Team.Lifestyle์ด๋ผ๋Š” GSM์˜ ํ•™์ƒ๋“ค๋ผ๋ฆฌ ๋ชจ์ธ ํŒ€์ด ์žˆ๋‹ค ํŒ€ํ™œ๋™์ค‘ ์˜จ๋ผ์ธ ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ 

์Šคํ„ฐ๋”” ์ฃผ์ œ๋กœ ์ด ์ฃผ์ œ๋ฅผ ์„ ์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‹ค๋“ค ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ํ•œ๋ฒˆ์”ฉ ๋“ค์–ด๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค.

๋‘˜์ด ๋‹ค๋ฅธ๊ฑด ์•Œ๊ฒ ์ง€๋งŒ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ์ œ๋Œ€๋กœ ์„ค๋ช…๋ชปํ•˜๋Š” ๋‚˜์™€ ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•ด

ํ•œ๋ฒˆ์— ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ๋ฒˆ AOP ๊ด€์ ์œผ๋กœ๋„ ์•Œ์•„๋ณด์ž

์ž๋ฐ”๋กœ ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด, ๊ณตํ†ต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์—…๋ฌด๋“ค์ด ๋งŽ๋‹ค.

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ (Servelt Filter) #

ํ•„ํ„ฐ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ HTTP์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ณ€๊ฒฝ, ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์ด๋‹ค.

๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์š”์ฒญ๊ณผ ์ตœ์ข… ์ž์› ์‚ฌ์ด์— ์œ„์น˜ํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•„ํ„ฐ๋Š” J2EE ํ‘œ์ค€ ์ŠคํŽ™ ๊ธฐ๋Šฅ์œผ๋กœ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ(Dispatcher Servlet)์— ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๊ธฐ ์ „/ํ›„์— url ํŒจํ„ด์— ๋งž๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ๋ถ€๊ฐ€์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์Šคํ”„๋ง์˜ ๊ฐ€์žฅ ์•ž๋‹จ์— ์กด์žฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ด๋ฏ€๋กœ, ํ•„ํ„ฐ๋Š” ์Šคํ”„๋ง ๋ฒ”์œ„ ๋ฐ–์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ฆ‰, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹ˆ๋ผ ํ†ฐ์บฃ๊ณผ ๊ฐ™์€ ์›น ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.(์Šคํ”„๋ง ๋นˆ์œผ๋กœ๋Š” ๋“ฑ๋ก ๊ฐ€๋Šฅ)

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ ์ „/ํ›„์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•„ํ„ฐ์˜ ํ๋ฆ„

HTTP ์š”์ฒญ -> WAS -> Filter -> Servlet -> Controller

ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๋ฉด ํ•„ํ„ฐ๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ ๋‹ค์Œ์— ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋œ๋‹ค.

ํ•„ํ„ฐ ์ œํ•œ

HTTP ์š”์ฒญ -> WAS -> Filter -> Servlet -> Controller // ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž

HTTP ์š”์ฒญ -> WAS -> Filter(์ ์ ˆํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ x) //๋น„ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž

ํ•„ํ„ฐ์—์„œ ์ ์ ˆํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋ฉด ๊ทธ๊ณณ์—์„œ ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•„ํ„ฐ ์ฒด์ธ

HTTP ์š”์ฒญ -> WAS -> Filter1 -> Filter2 -> Filter3 -> Servlet -> Controller

ํ•„ํ„ฐ๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ ์ฒด์ด๋‹์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ํ•„ํ„ฐ๋ฅผ ์ ์šฉ ํ›„ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•„ํ„ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์„œ๋“œ #

ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” javax.servlet์˜ Filter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋ฉฐ ์ด๋Š” ๋‹ค์Œ 3๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

  1. init()

  2. doFilter()

  3. destroy()

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()

  • init๋ฉ”์„œ๋“œ๋Š” ํ•„ํ„ฐ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”์‹œํ‚ค๊ณ  ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋‹ค.
  • ์›น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 1ํšŒ์˜ init ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํ•„ํ„ฐ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์ดํ›„ ์š”์ฒญ๋“ค์€ doFilter๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

doFilter()

  • doFilter๋Š” url ํŒจํ„ด์— ๋งž๋Š” ๋ชจ๋“  HTTP ์š”์ฒญ์ด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ „๋‹ฌ๋˜๊ธฐ์ „์— ์›น ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ๋‹ค.
  • doFilter์— ์ธ์ž๋กœ๋Š” FilterChain์ด ์žˆ๋‹ค. FilterChain์˜ doFilter๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ๋Œ€์ƒ์œผ๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.
  • chain.doFilter() ์ „/ํ›„์— ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ์›ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

destroy()

  • destroy๋ฉ”์„œ๋“œ๋Š” ํ•„ํ„ฐ ๊ฐ์ฒด๋ฅผ ์„œ๋น„์Šค์—์„œ ์ œ๊ฑฐํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ์ž์›์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋‹ค.
  • ์ด๋Š” ์›น ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฉฐ ์ดํ›„์—๋Š” doFilter๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ : HTTP ์š”์ฒญ์œผ๋กœ ์˜ค๋Š” ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๋กœ๊ทธ๋กœ ์ฐ๋Š” ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

@Slf4j
public class LogFilter implements Filter {
	
    @Override
    public void doFilter(ServletReqeust req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    	log.info("Run LogFilter.doFilter()");
        
        // ServletRequest๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์ง€ ์•Š๋‹ค ๊ทธ๋ž˜์„œ ๋‹ค์šด์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•œ๋‹ค.
        // HTTP ์š”์ฒญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊นŒ์ง€ ๊ณ ๋ คํ•ด ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค๊ธฐ ๋•Œ๋ฌธ.
        
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();
        String uuid = UUID.randomUUID().toString();
        
        try{
        	log.info("๋กœ๊ทธํ•„ํ„ฐ Request {} , {}",uuid,requestURI);
            // ๋‹ค์Œ ํ•„ํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ํ˜ธ์ถœ ์—†์œผ๋ฉด ์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ ์ด ๋ถ€๋ถ„์ด ์—†์œผ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
            chain.doFilter(request, response); 
        } catch(Exception e) {
        	throw e;
        } finally{
        	log.info("๋กœ๊ทธํ•„ํ„ฐ ์ข…๋ฃŒ");
        }
    }
}

UUID.randomUUID().toString(): ์š”์ฒญ์„ ๊ตฌ๋ถ„ ์ง“๊ธฐ ์œ„ํ•จ์ด๋‹ค.

Filter๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉด FilterRegisterBean์„ ์‚ฌ์šฉํ•ด ํ•„ํ„ฐ๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์•ผํ•œ๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ (Interceptor) #

Spring์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ๋กœ์จ, ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ธ๋“ค๋Ÿฌ(์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ url์— ๋”ฐ๋ผ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ๋ฉ”์„œ๋“œ, ์ดํ•˜ ํ•ธ๋“ค๋Ÿฌ)๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ํ•„ํ„ฐ๋‹ค.

Intercept๋ผ๋Š” ๋‹จ์–ด๋Š” '๋‚š์•„์ฑ„๋‹ค'๋ผ๋Š” ์˜๋ฏธ์ด๋ฉฐ ํ•ด๋‹น ๋‹จ์–ด์™€ ์˜๋ฏธ์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์š”์ฒญ์— ์˜ํ•ด ์„œ๋ฒ„์— ๋“ค์–ด์˜จ Request๊ฐ์ฒด๋ฅผ

์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋„๋‹ฌํ•˜๊ธฐ์ „์— ๋‚š์•„์ฑ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•œ ํ›„ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š”๊ฒƒ์ด ์ธํ„ฐ์…‰ํ„ฐ๋‹ค.

์›น ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋™์ž‘ํ•˜๋Š” ํ•„ํ„ฐ์™€ ๋‹ฌ๋ฆฌ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ์—์„œ ๋™์ž‘ํ•œ๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ํ†ตํ•ด ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋„๋ก ์š”์ฒญํ•˜๋Š”๋ฐ ๊ทธ ๊ฒฐ๊ณผ๋กœ ์‹œํ–‰ ์ฒด์ธ(Handler ExecutionChain)์„ ๋Œ๋ ค์ค€๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์‹คํ–‰ ์ฒด์ธ์€ 1๊ฐœ ์ด์ƒ์˜ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ๋“ค์„ ๊ฑฐ์ณ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ณ , ์—†๋‹ค๋ฉด ๋ฐ”๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ๋‚ด์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์›น ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์ณ ํ”„๋ก ํŠธ์ปจํŠธ๋กค๋Ÿฌ์ธ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์š”์ฒญ์„ ๋ฐ›์€ ํ›„ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์ด๋‚˜ ํ›„์— ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์œ„ํ•ด ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ

(์ถ”๊ฐ€์ ์ธ ์ž‘์—…์œผ๋กœ๋Š” ๋กœ๊ทธ์ธ์ฒดํฌ, ๊ถŒํ•œ ์ฒดํฌ ๋“ฑ์ด ์žˆ๋‹ค.)

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

์˜ค์ง ๊ฐœ๋ฐœ์ž๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ์ž ์ปจํŠธ๋กค๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

๊ฐœ๋ฐœ์ž๋Š” ์˜ค์ง ๊ด€๋ฆฌ์ž ๊ณ„์ •๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํ•ธ๋“ค๋Ÿฌ์— ์ ‘๊ทผํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ์„ธ์…˜ ์ฒดํฌ ์ฝ”๋“œ๋“ค์„

๊ฐ ํ•ธ๋“ค๋Ÿฌ๋“ค์—๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์ž‘์„ฑํ•ด์ฃผ๋Š” ํ•ธ๋“ค๋Ÿฌ์˜ ์ˆ˜๊ฐ€ ๋งŒ์•ฝ ๋งŽ์•„์ง„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

1.ย ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„, ์„œ๋ฒ„์˜ ๋ถ€ํ•˜

์ ์šฉํ•ด์•ผํ•  ํ•ธ๋“ค๋Ÿฌ ์ˆ˜๋งŒํผ ์„ธ์…˜์ฒดํฌ ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋“ค์ด ๋งŽ์•„์ ธ์„œ๋‹ค.

2.์ฝ”๋“œ์˜ ๋ˆ„๋ฝ์— ๋Œ€ํ•œ ๊ฑฑ์ •

์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๋ฝ๊ณผ ๊ฐ™์€ ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํšŒ์›์ •๋ณด์— ์ ‘๊ทผํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ์— ์„ธ์…˜์ฒดํฌ๊ฐ€ ๋ˆ„๋ฝ๋œ๋‹ค๋ฉด?

์ƒ์ƒ๋งŒํ•ด๋„ ๋”์ฐํ•˜๋‹ค.

์œ„ ๊ทธ๋ฆผ์€ ์ˆœ์„œ๋ฅผ ๋„์‹ํ™”ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค,๋ฉ”์„œ๋“œ #

์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” org.springframework.web.servlet์˜ HandlerInterceptor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„(implements)ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค์Œ์˜ 3๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  1. preHandle()

  2. postHandle()

  3. afterCompletion()

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 {
    }
}

preHandle()

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋œ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ ์ด์ „์— ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ „์ฒ˜๋ฆฌ ์ž‘์—…, ์š”์ฒญ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • preHandle์˜ 3๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ handler ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์ด ์ฐพ์•„์ค€ ์ปจํŠธ๋กค๋Ÿฌ ๋นˆ์— ๋งคํ•‘๋˜๋Š” HandlerMethod๋ผ๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ์จ, @RequestMapping์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ์˜ ์ •๋ณด๋ฅผ ์ถ”์ƒํ™”ํ•œ ๊ฐ์ฒด์ด๋‹ค
  • ์‹คํ–‰๋˜์–ด์•ผ ํ•  ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— '์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ'์— ๋น„ํ•ด ์„ธ๋ฐ€ํ•˜๊ณ  ๋กœ์ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌํ„ด๊ฐ’์ด boolean์ด๋‹ค. ๋ฆฌํ„ด์— true์ผ ๊ฒฝ์šฐ preHandle()์„ ์‹คํ–‰ํ•œ ํ›„ ํ•ธ๋“ค๋Ÿฌ์— ์ ‘๊ทผํ•œ๋‹ค
  • false์ผ ๊ฒฝ์šฐ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋‚จ์€ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

postHandle()

  • ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœ๋œ ํ›„์— ์‹คํ–‰๋œ๋‹ค.
  • ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰์€ ์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ ์•„์ง ๋ทฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ด์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
  • ModelAndView ํƒ€์ž…์˜ ์ •๋ณด๊ฐ€ ์ธ์ž๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…ํ•œ ๋ชจ๋ธ์˜ ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ๊ทผ์—๋Š” JSONํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” RestAPI๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ(@RestController)๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.
  • preHandle()์—์„œ false๋ฅผ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ ์šฉ์ค‘์ธ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” preHandle()์€ ์—ญ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋น„๋™๊ธฐ์ ์ธ ์š”์ฒญ์ฒ˜๋ฆฌ์‹œ์—๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ ํ•˜์œ„ ๊ณ„์ธต์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด postHandle์€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

afterCompletion()

  • ๋ชจ๋“  View์—์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ์„ ํฌํ•จํ•œ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— ์‹คํ–‰๋œ๋‹ค.
  • ์š”์ฒญ ์ฒ˜๋ฆฌ์ค‘ ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ธฐ ์ ๋‹นํ•œ ๋ฉ”์„œ๋“œ๋‹ค.
  • preHandle()์—์„œ false๋ฅผ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ ์šฉ์ค‘์ธ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ๊ฒฝ์šฐ preHandle()๋Š” ์—ญ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋น„๋™๊ธฐ์  ์š”์ฒญ ์ฒ˜๋ฆฌ์‹œ์— ํ˜ธ์ถœ๋˜์ง€์•Š๋Š”๋‹ค.
  • postHandle()๊ณผ ๋‹ฌ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ ํ•˜์œ„ ๊ณ„์ธต์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ afterCompletion์€ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ๋œ๋‹ค.

HandlerInterceptor์ž‘์—…์˜ ๋กœ๊ทธ๋ฅผ ์ฐ๋Š” ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

@Slf4j
public class CustomInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        
        log.info("preHandle1");
        
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        
        log.info("postHandle1");
        
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        
        log.info("afterCompletion1");
        
    }    
    
}

์ธํ„ฐ์…‰ํ„ฐ vs AOP #

์ธํ„ฐ์…‰ํ„ฐ ๋Œ€์‹ ์— ์ปจํŠธ๋กค๋Ÿฌ๋“ค์— ์ ์šฉํ•  ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์–ด๋“œ๋ฐ”์ด์Šค๋กœ ๋งŒ๋“ค์–ด AOP๋ฅผ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋“ค๋กœ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ˜ธ์ถœ ๊ณผ์ •์— ์ ์šฉ๋˜๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ๋“ค์€ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

  1. ์ปจํŠธ๋กค๋Ÿฌ ํƒ€์ž…๊ณผ ์‹คํ–‰ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ ์ œ๊ฐ๊ฐ์ด๋ผ ํฌ์ธํŠธ์ปท(์ ์šฉํ•  ๋ฉ”์„œ๋“œ ์„ ๋ณ„)์˜ ์ž‘์„ฑ์ด ์–ด๋ ต๋‹ค.

  2. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฆฌํ„ด ๊ฐ’์ด ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค.

  3. AOP์—์„œ๋Š” HttpServletRequest,Response ๊ฐ์ฒด๋ฅผ ์–ป๊ธฐ ์–ด๋ ต์ง€๋งŒ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ๋‹ค.

ํ•„ํ„ฐ(FIlter) vs ์ธํ„ฐ์…‰ํ„ฐ(Interceptor) ์ฐจ์ด #

ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ๊ฐ๊ฐ์ด ๊ด€๋ฆฌ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ Request/Response์˜ ์กฐ์ž‘ ๊ฐ€๋Šฅ์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฅด๊ณ , ๊ทธ์— ๋”ฐ๋ผ ์šฉ๋„๊ฐ€ ๋‹ค๋ฅด๋‹ค.

์ผ๋ถ€์—์„œย ํ•„ํ„ฐ(Filter)๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ๋ชปํ•˜๋ฉฐ, ๋นˆ์„ ์ฃผ์ž… ๋ฐ›์„ ์ˆ˜๋„ ์—†๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋Š” ์ž˜๋ชป๋œ ์„ค๋ช…์ด๋‹ค. ์ด๋Š” ๋งค์šฐ ์˜›๋‚ ์˜ ์ด์•ผ๊ธฐ์ด๋ฉฐ, ํ•„ํ„ฐ๋Š” ํ˜„์žฌ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๊ณณ์— ์ฃผ์ž…๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋นˆ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.

Request,Response ๊ฐ์ฒด ์กฐ์ž‘ ์—ฌ๋ถ€

ํ•„ํ„ฐ๋Š” Request,Response๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

์—ฌ๊ธฐ์„œ ์กฐ์ž‘์€ ๋‚ด๋ถ€ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”์นœ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

ํ•„ํ„ฐ๊ฐ€ ๋‹ค์Œ ํ•„ํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„ํ„ฐ ์ฒด์ด๋‹์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ Request/Response๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

์ฆ‰ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” Request/Response๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค. NPE(NullPointException)๊ฐ€ ๋‚˜๊ฒ ์ง€๋งŒ null๋กœ๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ด๋‹ค.

public MyFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        // ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค๋ฅธ request์™€ response๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์Œ
        chain.doFilter(request, response);       
    }
    
}

ํ•˜์ง€๋งŒ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ํ•„ํ„ฐ์™€๋Š” ๋‹ค๋ฅด๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์—ฌ๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  true๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ๋‹ค์Œ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๋ฉฐ false๋Š” ์š”์ฒญ์ด ์ค‘๋‹จ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ Request/Response ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์ด ํ•„ํ„ฐ์™€ ํ™•์‹คํžˆ ๋‹ค๋ฅธ์ ์ด๋‹ค.

public class MyInterceptor implements HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // Request/Response๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์—†๊ณ  boolean ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
        return true;
    }

}

ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor)์˜ ์šฉ๋„ ๋ฐ ์˜ˆ์‹œ #

ํ•„ํ„ฐ์˜ ์šฉ๋„ ๋ฐ ์˜ˆ์‹œ

  • ๊ณตํ†ต๋œ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ/์ธ๊ฐ€ ๊ด€๋ จ ์ž‘์—…
  • ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊น…๊ณผ ๊ฒ€์‚ฌ
  • ์ด๋ฏธ์ง€/๋ฐ์ดํ„ฐ ์••์ถ• ๋ฐ ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ
  • ์Šคํ”„๋ง๊ณผ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค

ํ•„ํ„ฐ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœย ์Šคํ”„๋ง๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ „์—ญ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ๋ณด์•ˆ ๊ณตํ†ต ์ž‘์—…์ด ์žˆ๊ณ  ํ•„ํ„ฐ๋Š” ์ธํ„ฐ์…‰ํ„ฐ๋ณด๋‹ค ์•ž๋‹จ์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ „์—ญ์ ์œผ๋กœ ํ•ด์•ผํ•˜๋Š” ๋ณด์•ˆ๊ฒ€์‚ฌ(XSS ๋ฐฉ์–ด ๋“ฑ)๋ฅผ ํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ์ด ์•„๋‹ ๊ฒฝ์šฐ์— ์ฐจ๋‹จ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€ ์š”์ฒญ์ด ์ „๋‹ฌ๋˜์ง€ ๋ชปํ•˜๊ณ  ์ฐจ๋‹จ๋˜๋ฏ€๋กœ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์ด๋ฏธ์ง€ ํ•„ํ„ฐ๋Š” ์ด๋ฏธ์ง€๋‚˜ ๋ฐ์ดํ„ฐ ์••์ถ•์ด๋‚˜ ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ๊ณผ ๊ฐ™์ดย ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ ๋‹นํ•˜๋‹ค. ํ•„ํ„ฐ๋Š” ๋‹ค์Œ ์ฒด์ธ์œผ๋กœ ๋„˜๊ธฐ๋Š” ServletRequest/ServletResponse ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ธํ„ฐ์…‰ํ„ฐ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ•๋ ฅํ•œ ๊ธฐ์ˆ ์ด๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ์˜ ์šฉ๋„ ๋ฐ ์˜ˆ์‹œ

  • ์„ธ๋ถ€์ ์ธ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ/์ธ๊ฐ€ ๊ณตํ†ต ์ž‘์—…
  • API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋กœ๊น… ๋˜๋Š” ๊ฒ€์‚ฌ
  • ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€๊ณต

์ธํ„ฐ์…‰ํ„ฐ๋Š”ย ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๊ณผ ๊ด€๋ จ๋˜์–ด ์ „์—ญ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ์„ธ๋ถ€์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ์ธ์ฆ๊ณผ ์ธ๊ฐ€์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—… ๋“ฑ์ด ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ๊ทธ๋ฃน์˜ ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์„ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ ํ•ฉํ•˜๋‹ค.

๋˜ํ•œ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ํ•„ํ„ฐ์™€ ๋‹ค๋ฅด๊ฒŒ HttpServletRequest/HttpServletResponse ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ œ๊ณต๋ฐ›์œผ๋ฏ€๋กœ

๊ฐ์ฒด ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๋Œ€์‹  ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ–๋Š” ์„ฑ์งˆ์€ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœย ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•˜๊ธฐ์—๋Š” ์šฉ์ดํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์‚ฌ์šฉ์ž ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐํšŒํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ HttpServletRequest์— ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์™ธ์—๋„ ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋ชฉ์ ์œผ๋กœ api ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๊ธฐ๋กํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— HttpServletRequest, Response๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ธํ„ฐ์…‰ํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ IP๋‚˜ ์š”์ฒญ ์ •๋ณด๋“ค์„ ํฌํ•จํ•ด ๊ธฐ๋กํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ํ•„ํ„ฐ(Filter)๋ฅผ ์ธ์ฆ๊ณผ ์ธ๊ฐ€์— ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋กœ๋Š” SpringSecurity๊ฐ€ ์žˆ๋‹ค. SpringSecurity์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” Spring MVC์— ์ข…์†์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ๋Š” ํ•„ํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ/์ธ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Back-End/spring/filter_interceptor.md