๋ฐ์ํ
์ด ํฌ์คํธ๋ ๋ฐ์ด ํ๋ก๊ทธ๋๋ฐ๋์ ์ ํ๋ธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
UsernamePasswordAuthenticationFilter์ ๋ํด์๋ ์๋ ํฌ์คํ ์ ์ฐธ์กฐํ์๊ธธ ๋ฐ๋๋๋ค.
๋ก๊ทธ์ธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ SpringSecurityFilterChain ์ค์ ๋ก๊ทธ์ธ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ํํฐ์ธ UsernamePasswordAuthenticationFilter๋ฅผ ์์ํด์ผ ํ๋ค.
attemptAuthentication
- POST "/login"
- ๋ก๊ทธ์ธ ์์ฒญ์ด ์ค๋ฉด, UsernamePassword..Filter๊ฐ ๊ฐ๋ก์ฑ์ attemptAuthentication ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ํด๋น ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ๋ก๊ทธ์ธ ์ธ์ฆ ๋ก์ง์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
์ปค์คํ Filter ์์ฑ
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private AuthenticationManager authenticationManager;
public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
// Form ๋ฐฉ์์ผ๋ก๋ง getParameter๋ก ๋ฝ์๋ผ ์ ์์. JSON์ ์๋จ!
String username = request.getParameter("username");
String password = request.getParameter("password");
// username, password๋ฅผ ๋ด์์ UsernamePasswordAuthenticationToken์ ์์ฑํ๋ค.
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
// ์์ฑํ ํ ํฐ์ ๋ด์์ authenticationManager.authenticate๋ฅผ ํธ์ถํ๋ฉด, UserDetailsService์ loadUserByUsername()์ด ํธ์ถ๋จ
return this.authenticationManager.authenticate(token);
}
}
- username๊ณผ password๋ฅผ ๋ฝ์์, UsernamePassword..Token์ ์์ฑํด์ค๋๋ค. *(์์ง ์ธ์ฆ์ด ์๋ฃ๋์ง ์์ ์ํ)
- ํด๋น ํ ํฐ์ authenticationManager์๊ฒ ๋๊ฒจ ์ธ์ฆ ๊ถํ์ ์์ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ธ์ฆ์ด ์๋ฃ๋๋ฉด -> successfulAuthentication
์ฌ๊ธฐ์ ์ธ์ฆ์ด ์คํจํ๋ฉด -> unsuccessfulAuthentication
successfulAuthentication
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
// UserDetails ๊ตฌํ์ฒด ๋ฐ์์ค๊ธฐ
AccountAdapter account = (AccountAdapter) authResult.getPrincipal();
// JWT ํ ํฐ ์์ฑ
String jwtToken = JWT.create()
.withSubject(account.getUsername())
.withClaim("exp", Instant.now().getEpochSecond() + 600)
.withClaim("id", account.getAccount().getId())
.withClaim("username", account.getUsername())
.sign(Algorithm.HMAC256("secret"));
// Authorization ํค๋ ๊ฐ์ Bearer ํ ํฐ ๋ด์์ ์๋ต
response.addHeader("Authorization", "Bearer " + jwtToken);
}
- ์๋ต ํค๋์ JWT ํ ํฐ ๋ด์์ ์๋ต!
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ํ์ ๋, ์๋ฒ์์ JWT ํ ํฐ์ ์๋ฒ์์ ์๋ต์ ํด์คฌ์ผ๋ฉด, ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง๋ค JWT ํ ํฐ์ ๋ค๊ณ ์์ฒญ ํ ๊ฒ์ ๋๋ค.
(์ฐ๋ฆฌ๋ ์ด์ ํด๋น JWT ํ ํฐ์ด ์ฌ๋ฐ๋ฅธ ํ ํฐ์ธ์ง ํ์ธํด์ฃผ๋ฉด ๋๋ค!)
๋ค์ ์๊ฐ์ JWT ํ ํฐ์ ๊ฒ์ฆํ๋ ํํฐ๋ฅผ ์์ฑํด์ ํด๋น JWT์ด ์ฌ๋ฐ๋ฅธ ํ ํฐ์ธ์ง ๊ฒ์ฆํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๋ฐ์ํ