JWT의 경우 강의와 실습을 통해 토큰 발급 및 검증을 공부한 적이 있었다. 그런데 MSA랑 연동을 어떻게 할까 하던 중, 이미 MSA와 JWT를 연동한 소스코드와 블로그를 발견했다. 해당 내용을 참고해서 내 프로젝트에 적용했다.
헤더
바디
패키지 구조는 내 프로젝트 아키텍쳐 (헥사고날 아키텍쳐)에 맞게 리팩토링했다.
서비스 안으로 들어오는 것은 in
으로, 서비스 바깥으로 나가는 것은 out
으로 지정해줬다.
redis.server=redis
JwtAuthenticaionFilter
내 의 attemptAuthentication()
에서 new UsernamePasswordAuthenticationToken(principal, credential)
을 할 때, principal 인자는 UserDetails
구현체의 loadUserByUsername(username)
의 username과 동일해야 한다.https://github.com/Development-team-1/just-pickup
위에 기재한 유의사항 2.와 연관된 문제이다.
Jwts.parser().setSigningKey(SECRET).parseClaimsJwt(token)
Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token)
jwt가 아니라 jws였다.
POST "/login"
이여야만 로그인 시도를 jwt 필터가 해줘야 한다.
그런데 다른 http method도 받아들이던 문제가 있었다.
그래서 다음과 같이 수정했다. (상위 클래스인UsernamePasswordAuthenticationFilter의 attemptAuthentication을 참고했다.)
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (!request.getMethod().equals("POST")) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
}
...
}
}