Programming Project ์ž‘์—…์‹ค/๋‚ด์šฉ ์ •๋ฆฌ

[์šฐ๋ฆฌ์ง‘ ๊ฐ€์กฑ ์ปค๋ฎค๋‹ˆํ‹ฐ ์›น ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ] ๊ธฐ์ˆ  ์ •๋ฆฌ - Interceptor ์„ค์ •

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2021. 12. 24. 19:29
728x90
๋ฐ˜์‘ํ˜•

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ Source Code๋Š” '์ฃผ๋‹ˆํ•˜๋ž‘ Git Hub'์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ(INDEX)
       1.  
์ดˆ๊ธฐ๊ตฌ์„ฑ

       2. Spring Security ์ดˆ๊ธฐ ๊ตฌ์„ฑ

       3. Interceptor ์„ค์ •

.      4. ์ดˆ๊ธฐ Domain ์„ค์ •

 

 

 

 


 

 

๐Ÿš€ Package Tree

 

ํ•ด๋‹น Interceptor๋Š” ๋ณด์‹œ๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์ด์šฉ์ž๋“ค์˜ ๋“ฑ๊ธ‰์„ ๋‚˜๋ˆ„์–ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ฒƒ์ด๊ณ , ๋‚˜์ค‘์— ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ  AdminAPIInterceptor

 

์ตœ์ดˆ ์ฃผ๋‹ˆํ•˜๋ž‘์€ HandlerInterceptor๋ฅผ ๊ตฌํ˜„ํ•œ Class๋ฅผ ๋งŒ๋“  ๊ฒƒ์ด์—์š”.

HandlerInterceptor๋Š” ์–ด๋–ค ์ผ์„ ํ•˜๋Š” ์นœ๊ตฌ์ผ๊นŒ์š”?

HandlerInterceptor๋Š” ํŠน์ •ํ•œ URI ํ˜ธ์ถœ์„ '๊ฐ€๋กœ์ฑ„๋Š”' ์—ญํ• ์„ ํ•˜๋Š” ์นœ๊ตฌ์ธ ๊ฒƒ์ด์—์š”.
์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋กœ์ง์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„, ์‚ฌ์ „์ด๋‚˜ ์‚ฌํ›„ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—์š”.

์ด ์นœ๊ตฌ๋Š” ์•„๋ž˜ Method๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”!


preHandle(request, response, handler)

์ง€์ •๋œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋™์ž‘ ์ด์ „์— ์ˆ˜ํ–‰ํ•  ๋™์ž‘ (์‚ฌ์ „ ์ œ์–ด).


postHandle(request, response, handler, modelAndView)

์ง€์ •๋œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋™์ž‘ ์ดํ›„์— ์ฒ˜๋ฆฌํ•  ๋™์ž‘ (์‚ฌํ›„ ์ œ์–ด).
Spring MVC์˜ Dispatcher Servlet์ด ํ™”๋ฉด์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋™์ž‘.


afterCompletion(request, reponse, handler, exception)

Dispatcher Servlet์˜ ํ™”๋ฉด ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„ ์ฒ˜๋ฆฌํ•  ๋™์ž‘.

 

 

์ฃผ๋‹ˆํ•˜๋ž‘์€ ์—ฌ๊ธฐ์„œ preHandle Method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋„๋ก ํ•  ๊ฒƒ์ด์—์š”!

๋จผ์ € ์ด์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์—์„œ Header์— ์žˆ๋Š” ์ด๋ฆ„์ด Authorization์ธ Header๊ฐ’ JWT ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ token์ด๋ผ๋Š” ๋ฌธ์ž์—ด ์ž๋ฃŒํ˜• ๋ณ€์ˆ˜์— ์ €์žฅ์„ ํ•ด ๋†“์„ ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค ํ•ด๋‹น Token๊ฐ’์ด null์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ Token์„ ๋ฐ›๊ณ  ๋“ค์–ด์˜จ ์ด์šฉ์ž์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•  ๊ฒƒ์ด์—์š”.
๋งŒ์•ฝ ํ•ด๋‹น ์ด์šฉ์ž๊ฐ€ Token์ด null์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด 401 Error๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , Message๋Š” "์š”์ฒญ์—๋Ÿฌ"๋ผ๊ณ  ๋ณด๋‚ด์ค„ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก [ HTTP ์ƒํƒœ 401(Unauthorized) ์ด๋ž€? ]

HTTP ์ƒํƒœ ์ค‘ 401(Unauthorized)์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์œ ํšจํ•œ ์ธ์ฆ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์š”์ฒญ์ด ๊ฑฐ๋ถ€๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ์ƒํƒœ๊ฐ’.

์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์„ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ.
401(Unauthorized) ์‘๋‹ต์„ ๋ฐ›๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ฒฝ์šฐ๋Š” ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ฌด์–ธ๊ฐ€ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ์‡ผํ•‘๋ชฐ ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ, ๋‚˜์˜ ๊ฒฐ์ œ ๋‚ด์—ญ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด 401(Unauthorized)๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๊ฒŒ ๋  ๊ฒƒ.

์ด์™€ ๋งŽ์ด ํ˜ผ๋™๋˜๋Š” HTTP ์ƒํƒœ๋กœ 403(Forbidden)์ด ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜ํ™˜๊ฐ’์„ false๋กœ ๋ณด๋‚ด์ฃผ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด์—์š”.

 

์ด ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ”๋‹ค๋ฉด ๋‹น์—ฐํžˆ ํ•ด๋‹น ์ด์šฉ์ž๋Š” JWT๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ๋ถ€ํ„ฐ JWT์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•  ๊ฒƒ์ด์—์š”.

23๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด Bearer์ด ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์ธ์ฆ ํƒ€์ž… ์ค‘์— ํ•˜๋‚˜์—์š”!

Basic

์‚ฌ์šฉ์ž ์•„์ด๋””์™€ ์•”ํ˜ธ๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์„ ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. (RFC 7617)

Bearer

JWT ํ˜น์€ OAuth์— ๋Œ€ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. (RFC 6750)

Digest

์„œ๋ฒ„์—์„œ ๋‚œ์ˆ˜ ๋ฐ์ดํ„ฐ ๋ฌธ์ž์—ด์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ธ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด์™€ nonce๋ฅผ ํฌํ•จํ•˜๋Š” ํ•ด์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ตํ•œ๋‹ค (RFC 7616)

HOBA

์ „์ž ์„œ๋ช… ๊ธฐ๋ฐ˜ ์ธ์ฆ (RFC 7486)

Mutual

์•”ํ˜ธ๋ฅผ ์ด์šฉํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ƒํ˜ธ ์ธ์ฆ (draft-ietf-httpauth-mutual)

AWS4-HMAC-SHA256

AWS ์ „์ž ์„œ๋ช… ๊ธฐ๋ฐ˜ ์ธ์ฆ (๋งํฌ)

 

์œ„ ์ธ์ฆ ํƒ€์ž…์˜ ์ข…๋ฅ˜์—์„œ ๋‚˜ํƒ€๋‚œ ๊ฒƒ ์ฒ˜๋Ÿผ, bearer๋Š” JWT์™€ OAuth๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ์ฆ ํƒ€์ž…์ธ ๊ฒƒ์ด์—์š”.

 

substring() ๋ฉ”์†Œ๋“œ๋Š” string ๊ฐ์ฒด์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค๋กœ ๋ถ€ํ„ฐ ์ข…๋ฃŒ ์ธ๋ฑ์Šค ์ „ ๊นŒ์ง€ ๋ฌธ์ž์—ด์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, Bearer๋ผ๋Š” Prefix ๊ธธ์ด ๋งŒํผ์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ๋ฐ›์•„์„œ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜์ธ jwtToken ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ค€ ๊ฒƒ์ด์—์š”.

๊ทธ๋ฆฌ๊ณ  Prefix๋งŒํผ์„ ์ œ๊ฑฐํ•˜์—ฌ Authorization Token์ด ์ง€๋‹Œ Claims๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ 25๋ฒˆ์งธ ์ค„์ธ ๊ฒƒ์ด์—์š”.

์ด๋ ‡๊ฒŒ ํ•œ ๋’ค Access Token์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์„œ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 401 Error๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด์—์š”.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด Token์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ Token์ด ์œ ํšจํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•œ ๊ฒƒ์ด์—์š”.

๊ทธ ๋‹ค์Œ์œผ๋กœ ํ•  ๊ฒƒ์€? ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ•ด๋‹น ์ด์šฉ์ž๊ฐ€ ์–ด๋–ค ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ, ๊ถŒํ•œ์ด ์ ์ ˆํ•œ์ง€๋ฅผ ์•Œ์•„๋ด์•ผ๊ฒ ์ง€์š”?

๋จผ์ € JWT Payload(Claims)์•ˆ์— ๋“ค์–ด ์žˆ์„ token ์ด๋ฆ„๊ณผ ์ด์šฉ์ž์˜ ๋“ฑ๊ธ‰์„ ๊ฐ๊ฐ ๋ฝ‘์•„๋ฝ‘์•„ ๊ฐ๊ฐ์˜ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ค€ ๊ฒƒ์ด์—์š”.


๋ฐ˜์‘ํ˜•

 

37๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ ํšŒ์›์˜ ๋“ฑ๊ธ‰์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด์—์š”. member์˜ Grade๊ฐ€ GUEST(์†๋‹˜) ์ด๊ฑฐ๋‚˜, FAMILY(๊ฐ€์กฑ)์ด๋ผ๋ฉด?
403 Error๋กœ ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค ์ค„ ๊ฒƒ์ด์—์š”.


๐Ÿ’ก [ HTTP ์ƒํƒœ 403(Forbidden) ์ด๋ž€? ]
HTTP ์ƒํƒœ ์ค‘ 403(Forbidden)๋Š” ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ์ดํ•ดํ–ˆ์ง€๋งŒ, ๊ถŒํ•œ์ด ์—†์–ด ์š”์ฒญ์ด ๊ฑฐ๋ถ€๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ์ƒํƒœ.
์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ.
403(Forbidden) ์‘๋‹ต์„ ๋ฐ›๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ฒฝ์šฐ๋Š” ๋กœ๊ทธ์ธํ•˜์—ฌ ์ธ์ฆ๋˜์—ˆ์ง€๋งŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ.
์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ์‡ผํ•‘๋ชฐ์— ์ ‘์†ํ•˜์—ฌ ๋กœ๊ทธ์ธ๊นŒ์ง€ ํ•˜์˜€์ง€๋งŒ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ฒฐ์ œ ๋‚ด์—ญ์„ ๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด 403(Forbidden)์„ ๋ฐ˜ํ™˜.

 

๊ทธ๋Ÿฐ ๋‹ค์Œ token์˜ ์ด๋ฆ„์„ ๋น„๊ตํ•ด์„œ JwtUtil Class์— ์„ค์ •ํ•ด ๋‘” ACCESS_TOKEN_NAME๊ณผ ํ˜„์žฌ ์ด์šฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ACCESS_TOKEN_NAME์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•ด์„œ ๊ฐ™๋‹ค๋ฉด '์ฐธ'์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด '๊ฑฐ์ง“'์„ ๋ฐ˜ํ™˜ํ•ด ์ค„ ๊ฒƒ์ด์—์š”.

 

์ฃผ๋‹ˆํ•˜๋ž‘์ด ์ด์šฉ์ž ๋“ฑ๊ธ‰์„ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์—ˆ๊ณ , ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ADMIN, FAMILY, GUEST๋กœ์จ์˜ ๊ฐ๊ฐ์˜ Interceptor๋“ค์ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด์—์š”. ๊ฐ๊ฐ์˜ Interceptor๋“ค์€ ์œ„์™€ ๋‚ด์šฉ์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

728x90
๋ฐ˜์‘ํ˜•