config ๋๋ ํ ๋ฆฌ์
TokenAuthenticationFilter.java ํ์ผ ๋ง๋ค๊ฑฐ์.
์ด ํํฐ์์๋, ํ ํฐ์ ๋ด๊ธด Authorization ํค๋ ๊ฐ์ ธ์์,
์์ธ์ค ํ ํฐ ์ ํจํ๋ฉด ์ธ์ฆ ์ ๋ณด ์ค์ ํ๋๊ฑธ ํ ๊ฑฐ์.
@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
// ์์ฒญ ํค๋์ Authorization ํค์ ๊ฐ ์กฐํ
String authorizationHeader = request.getHeader(HEADER_AUTHORIZATION);
// ๊ฐ์ ธ์จ ๊ฐ์์ ์ ๋์ฌ ์ ๊ฑฐ
String token = getAccessToken(authorizationHeader);
if(tokenProvider.validToken(token)) {
Authentication authentication = tokenProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
์ด ๋ฉ์๋๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ์ปจํธ๋กค๋ฌ ๋๋ฌ ์ ์ ํธ์ถ๋จ.
์ฌ๊ธฐ์ ๊ถ๊ธํ๋์ ๋ค์ด ์๋๋ฐ, ํ์คํ์ค ๋ณด์๋ฉด
Q1. HttpServletRequest request๋ ์๊ฒ ๋๋ฐ, response๋ ๋ญ๋?
( ์ด ์ฝ๋๋ controller๋๋ฌ ์ ์ ํธ์ถ๋๋๊ฑด๋ฐ,
์๋น์ค ๋ก์ง ๋ค์ด๊ฐ์ง๋ ์์๋๋ฐ ์ฌ response?
request๋ ํด๋ผ์ด์ธํธ์์ ๋ณด๋ธ ์์ฒญ์ด๋๊น ์๊ฒ ๋๋ฐ... )
A.
์ด ์์ ์์๋ ์๋ต์ด ์๋ฃ๋์ง ์์๊ฒ ๋ง์.
์ฆ, reponse๊ฐ์ฒด๋ ์ด๋ฏธ ๋น์ด์๋ ์ํ๋ก ์์ฑ๋์ด์ ์ ๋ฌ๋๊ฑฐ์!
HttpServletRequest๋ HttpServletResponse๋
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๋ง๋๋๋ฐ,
request๊ฐ์ฒด, response๊ฐ์ฒด๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์
ํํฐ์ ๋๊ธฐ๋๊ฑฐ์!
[ ํด๋ผ์ด์ธํธ ์์ฒญ ]
↓
[ ํฐ์บฃ(์๋ธ๋ฆฟ ์ปจํ
์ด๋) ]
↓
ํํฐ → ์ปจํธ๋กค๋ฌ → ์๋น์ค
↓ ↑
โโโ โ โ< ์๋ต >โโโโโโ
์ฆ response ๊ฐ์ฒด๋ ํ์ฌ ๋น์ด์๋๊ฑฐ์.
์ปจํธ๋กค๋ฌ ๊ฑฐ์น ํ์ ์ฑ์์ง๊ฒ ์ง...
Q2. ๊ฐ์ ธ์จ ๊ฐ์์ ์ ๋์ฌ ์ ๊ฑฐํ๋ค๋๊ฒ, Bearer ey~์ฌ๊ธฐ์ Bearer์์ ๋ ์ ๋ง ๋ฑ JWT ํ ํฐ๋ง ๋จ๊ธฐ๊ฒ๋ค๋ ๋ชฉ์ ๋ง๋?
A.
๋ง์!
Q3. tokenProvider.getAuthentication(token); ์ ์ญํ ์?
A.
ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ์๋ก Authentication๊ฐ์ฒด ๋ง๋๋๊ฑฐ์
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑธ SecurityContext์ ์ ์ฅํ๋๊ฒ ๋ฐ๋ก ๋ค์์ค ์ฝ๋
( SecurityContextHolder.getContext().setAuthentication(authentication); )
์ฌ๊ธฐ์ ํ์๋๋ ๋ ํ๋์ ์ง๋ฌธ...
Q3-1. ๋งค๋ฒ Authentication๊ฐ์ฒด ๋ง๋๋๊ฒ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ธ๊ฐ?
A.
JWT ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ํน์ง ์ค ํ๋์ธ
**๋ฌด์ํ**๋๋ฌธ์
๋งค ์์ฒญ๋ง๋ค ํ ํฐ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ถ์ถํ๋๊ฑฐ์.
์๋ฒ๋ "๋๊ฐ ๋ก๊ทธ์ธํ๋์ง" ๊ธฐ์ตํ์ง ์๊ธฐ ๋๋ฌธ.
๋ฐ๋ผ์ ๋งค๋ฒ Authentication๊ฐ์ฒด ๋ง๋ค ์๋ฐ์ ์์.
--> ๊ทธ๋ ๋ค๋ฉด SecurityContextHolder์ ์๋ฏธ๋ ๋ญ๋ฐ?
๋งค ์์ฒญ๋ง๋ค ํํฐ๊ฐ ์คํ๋๋๋ฐ,
ํด๋น ์ธ์ฆ ๊ฐ์ฒด๋ฅผ SecurityContext์ ์ ์ฅํ๋ ์ฉ๋์.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑธ ์ปจํธ๋กค๋ฌ๋ ์๋น์ค๋ก์ง์ด SecurityContext์์ ๊บผ๋ด ์ฐ๋๊ฑฐ์.
=
์ด ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ํ ์์ฒญ ๋ด์์๋ง ์ ํจํ๋ค๋๊ฑฐ์!
์์ฒญ์ด ๋๋๋ฉด SecurityContext๋ ์ฌ๋ผ์ง
(์ค๋ ๋๋ก์ปฌ ๊ธฐ๋ฐ์ด๋๊น)
Q4. filterChain.doFilter()๋ ๋ญํ๋ ๋ฉ์๋?
A.
๋ค์ ํํฐ๋ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ ๋๊ธฐ๋๊ฑฐ์.
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ์๋๋ฐ,
ํํฐ์์ ๋ค์์ผ๋ก ์๋๊ฒจ์ฃผ๋ฉด
๊ฑ ๋ฉ์ถ๊ณ ๋๋๊ธฐ๋๋ฌธ์..
๊ทธ๋ฅ ๋จ์ง ํ๋ฆ์ ๋๊ธฐ๋ ์ญํ ์ด์ง,
๊ฐ์ returnํ๊ฑฐ๋ ๊ทธ๋ฌ์ง๋ ์์.
๋ค์์ getAccessToken()ํจ์!
private String getAccessToken(String authorizationHeader) {
if(authorizationHeader != null && authorizationHeader.startsWith(TOKEN_PREFIX)) {
return authorizationHeader.substring(TOKEN_PREFIX.length());
}
return null;
}
์ด ํจ์๋
doFilterInternal()๋ฉ์๋์์ ํธ์ถํ๊ฒ๋๋๋ฐ
๊ฑฐ๊ธฐ์ request.getHeader()ํด์ ํค๋๋ง ๋ ๋ผ์ค๊ณ
(๊ทธ๋ฌ๋ฉด Bearer ey~~์ด๋ฐ์์ด ๋๊ฒ ์ง?)
๊ทธ ๋ค์์ ๊ฐ์ ธ์จ ๊ฐ์์ ์ ๋์ฌ๋ฅผ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ค.
์ฆ, ์์ฒญ ํค๋์์ ์ค์ JWT ํ ํฐ(ey~)๋ง ์ถ์ถํด์ฃผ๋ ์ญํ ์ ํ๋๊ฑฐ์.
์ฐธ๊ณ ๋ก Authorizationํค๋๋ ๋ณดํต
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...
์ด๋ฐ์์ผ๋ก ์ ๋ฌ๋จ!
๋ค์ ํฌ์คํ ์์๋ ํ ํฐ API๋ฅผ ๊ตฌํํ๊ฒ ์!