login_interceptor

๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ - ์ธํ„ฐ์…‰ํ„ฐ

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

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ๊ฐ™์ด ์›น ๊ด€๋ จ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๊ฐ€ ์„œ๋ธ”๋ฆฟ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ผ๋ฉด, ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์ ์šฉ๋˜๋Š” ์ˆœ์„œ์™€ ๋ฒ”์œ„, ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค.

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

  • HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ โ†’ ์„œ๋ธ”๋ฆฟ โ†’ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ โ†’ ์ปจํŠธ๋กค๋Ÿฌ

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

  • ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ ์ดํ›„์— ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ์Šคํ”„๋ง MVC์˜ ์‹œ์ž‘์ ์ด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  • ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ์—๋„ URL ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์„œ๋ธ”๋ฆฟ URL ํŒจํ„ด๊ณผ๋Š” ๋‹ค๋ฅด๊ณ  ๋งค์šฐ ์ •๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

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

  • ์ค‘๊ฐ„์— ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ทธ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋จผ์ € ์ ์šฉํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ์ด ๊ฒฝ์šฐ ๋“ฑ๋ก๋œ ์ˆœ์„œ๋Œ€๋กœ preHandle์ด ํ˜ธ์ถœ๋˜๊ณ , ๋“ฑ๋ก๋œ ์—ญ์ˆœ์œผ๋กœ postHandle ๋ฐ afterCompletion์ด ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์ž.

img.png

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

img_1.png
  • preHandle : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „

  • postHandle : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ํ›„

  • afterCompletion : ์š”์ฒญ ์™„๋ฃŒ ์ดํ›„

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ request,response๋งŒ ์ œ๊ณตํ–ˆ์ง€๋งŒ, ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ(handler)๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€ ์ •๋ณด๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค modelAndView๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ์‘๋‹ต ์ •๋ณด๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

img.png
  • ์ •์ƒ ํ๋ฆ„

    • preHandle : ์ปจํŠธ๋กค๋กœ ํ˜ธ์ถœ ์ „์— ํ˜ธ์ถœ (๋” ์ •ํ™•ํžˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ ์ „์— ํ˜ธ์ถœ)

      • preHandle์—์„œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋‹ค์Œ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋”๋Š” ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. false์ธ ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. (๊ทธ๋ฆผ 1๋ฒˆ์—์„œ ๋์ด๋‚œ๋‹ค.)

    • postHandle : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ํ›„์— ํ˜ธ์ถœ (๋” ์ •ํ™•ํžˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ ํ›„์— ํ˜ธ์ถœ)

    • afterCompletion : ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง ๋œ ์ดํ›„์— ํ˜ธ์ถœ

img_1.png
  • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ

    • preHandle : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „์— ํ˜ธ์ถœ

    • postHandle : ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

    • afterCompletion : ํ•ญ์ƒ ํ˜ธ์ถœ๋œ๋‹ค. ์˜ˆ์™ธ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ์–ด๋–ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด postHandle()์€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ˆ์™ธ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณตํ†ต ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ ค๋ฉด afterCompletion()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

      • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด afterCompletion()์— ์˜ˆ์™ธ ์ •๋ณด(ex)๋ฅผ ํฌํ•จํ•ด์„œ ํ˜ธ์ถœ๋œ๋‹ค,

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ - ์š”์ฒญ ๋กœ๊ทธ

LogInterceptor

  • request.setAttribute(LOG_ID, uuid);

    • ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์˜ ๊ฒฝ์šฐ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ํ˜ธ์ถœ ์‹œ์ ์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— preHandle์—์„œ ์ง€์ •ํ•œ ๊ฐ’์„ postHandle, afterCompletion ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋”˜๊ฐ€์— ๋‹ด์•„๋‘์–ด์•ผ ํ•œ๋‹ค. ์ธํ„ฐ์…‰ํ„ฐ ์—ญ์‹œ ์‹ฑ๊ธ€ํ†ค์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„ํ—˜ํ•˜๋‹ค.

    • ThreadLocal์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • afterCompletion์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํ˜ธ์ถœ์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ ๋กœ๊ทธ๋ฅผ afterCompletion์—์„œ ์‹คํ–‰ํ•œ๋‹ค.

  • ํ•„ํ„ฐ์™€ ๋น„๊ตํ•ด๋ณด๋ฉด ์ธํ„ฐ์…‰ํ„ฐ๋Š” ๋งค์šฐ ์ •๋ฐ€ํ•˜๊ฒŒ URL ํŒจํ„ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (PathPattern ๊ณต์‹ ๋ฌธ์„œarrow-up-right)

  • preHandle ๋ฉ”์„œ๋“œ์—๋Š” RequestMappingHandlerMapping ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ HandlerMethod ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

  • ์ด ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ณตํ†ต์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ์œ„ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋ณด์•ˆ ๊ณ„์ธต์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ณด์•ˆ ์ž‘์—…์€ Spring Security ๋˜๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • postHandle ๋ฉ”์„œ๋“œ์—๋Š” RequestMappingHandlerAdapter ํด๋ž˜์Šค ์‹คํ–‰ ํ›„ ๋ฐ˜ํ™˜๋œ ModelAndView ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

  • ์ด ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ณตํ†ต์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ - ์ธ์ฆ ์ฒดํฌ

LoginCheckInterceptor

WebConfig

์ธ์ฆ์€ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „์—๋งŒ ํ˜ธ์ถœ๋˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— preHander๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

ArgumentResolver ํ™œ์šฉ

@Login ์–ด๋…ธํ…Œ์ด์…˜

  • @Target(ElementType.PARAMETER) : ํŒŒ๋ผ๋ฏธํ„ฐ์—๋งŒ ์‚ฌ์šฉ

  • @Retention(RetentionPolicy.RUNTIME) : ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๊ฐ€ ๋‚จ์•„์žˆ์Œ

LoginMemberArgumentResolver

  • supportsParameter() : @Login ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด์„œ Memberํƒ€์ž…์ด๋ฉด ํ•ด๋‹น ArgumentResolver๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

  • resolveArgument() : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ง์ „์— ํ˜ธ์ถœ ๋˜์–ด์„œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์Šคํ”„๋ง MVC๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌํ•ด์ค€๋‹ค.

WebConfig

์ปจํŠธ๋กค๋Ÿฌ


์ธํ„ฐ์…‰ํ„ฐ ๋‚ด๋ถ€ ํ˜ธ์ถœ ๊ณผ์ •

img_2.png
  • RequestMappingHandlerMappingํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ HandlerExecutionChain ๊ฐ์ฒด๋กœ ๋ฐ›๋Š”๋ฐ, ์ด ๊ฐ์ฒด ์•ˆ์—๋Š” ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด์™€ ์ธํ„ฐ์…‰ํ„ฐ ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (์ฐธ๊ณ )

  • HandlerExecutionChain ๊ฐ์ฒด๋Š” ๋“ฑ๋ก๋œ ์ธํ„ฐ์…‰ํ„ฐ๋“ค์˜ ๊ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

img_3.png
img_4.png
  • ์ดํ›„ ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ๋ณด๋ฉด HandlerAdapter์—๊ฒŒ ์š”์ฒญ์„ ๋„˜๊ธฐ๊ธฐ ์ „์— ์ธํ„ฐ์…‰ํ„ฐ์˜ preHandle์„ ํ˜ธ์ถœํ•œ๋‹ค. ํ•˜๋‚˜์˜ ์ธํ„ฐ์…‰ํ„ฐ๋ผ๋„ preHandle์—์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ดํ›„ ์•„๋ฌด๊ฒƒ๋„ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

  • HandlerAdapter์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜๋ฉด ์ธํ„ฐ์…‰ํ„ฐ์˜ postHandle์„ ํ˜ธ์ถœํ•œ๋‹ค.

  • afterCompletion์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํ•ญ์ƒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

img_5.png
  • applyPreHandle ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด ๋“ฑ๋ก๋œ ์ธํ„ฐ์…‰ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ preHandle์„ ํ˜ธ์ถœํ•œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋”๋ผ๋„ ํ•ญ์ƒ afterCompletion์„ ํ˜ธ์ถœํ•œ๋‹ค.

img_6.png
  • applyPostHandle ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด ๋“ฑ๋ก๋œ ์ธํ„ฐ์…‰ํ„ฐ์˜ ์—ญ์ˆœ์œผ๋กœ postHandle์„ ํ˜ธ์ถœํ•œ๋‹ค.

img_7.png
  • triggerAfterCompletion ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด preHandle์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ ์ธํ„ฐ์…‰ํ„ฐ๋ถ€ํ„ฐ ์—ญ์ˆœ์œผ๋กœ afterCompletion์„ ํ˜ธ์ถœํ•œ๋‹ค.

img_8.png
  • ๋ทฐ์˜ ๋ Œ๋”๋ง ๊ณผ์ •์ด ๋ชจ๋‘ ๋๋‚˜๊ณ  ๋‚˜์„œ๋„ ์œ„ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ๋œ๋‹ค.

img_9.png

Last updated