2021. 12. 24. 19:29ใProgramming Project ์์ ์ค/๋ด์ฉ ์ ๋ฆฌ
ํด๋น ํ๋ก์ ํธ์ ๋ํ 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๋ค์ ์์ ๋ด์ฉ์ด ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ค๋์ ์ฌ๊ธฐ๊น์ง ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!