JWT 토큰 발급 코드 분석 및 에러 해결

dasd412·2023년 1월 4일
0

MSA 프로젝트

목록 보기
19/25

MSA에 JWT를 적용한 이유

https://medium.com/spoontech/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%EC%A1%B0-msa-%EC%9D%98-%EC%9D%B8%EC%A6%9D-%EB%B0%8F-%EC%9D%B8%EA%B0%80-authorization-authentication-a595179ab88e


JWT 토큰 발급 소스 코드

JWT의 경우 강의와 실습을 통해 토큰 발급 및 검증을 공부한 적이 있었다. 그런데 MSA랑 연동을 어떻게 할까 하던 중, 이미 MSA와 JWT를 연동한 소스코드와 블로그를 발견했다. 해당 내용을 참고해서 내 프로젝트에 적용했다.

PostMan

request

response

헤더

바디

패키지 구조

패키지 구조는 내 프로젝트 아키텍쳐 (헥사고날 아키텍쳐)에 맞게 리팩토링했다.

서비스 안으로 들어오는 것은 in으로, 서비스 바깥으로 나가는 것은 out으로 지정해줬다.

작동 과정

유의 사항

  1. 레디스 구성 정보는 도커 환경이므로, localhost가 아니라 redis로 기재한다.
redis.server=redis
  1. JwtAuthenticaionFilter내 의 attemptAuthentication()에서 new UsernamePasswordAuthenticationToken(principal, credential)을 할 때, principal 인자는 UserDetails 구현체의 loadUserByUsername(username)의 username과 동일해야 한다.

2.에 대한 참고 링크

https://github.com/codingspecialist/Springboot-Security-JWT-Easy/blob/master/src/main/java/com/cos/jwtex01/config/jwt/JwtAuthenticationFilter.java

소스 코드 출처

블로그

https://velog.io/@bum12ark/MSA-JWT-%EC%9D%B8%EC%A6%9D-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-1.-%EB%A1%9C%EA%B7%B8%EC%9D%B8

GitHub

https://github.com/Development-team-1/just-pickup


발생한 문제

BadCredentials

위에 기재한 유의사항 2.와 연관된 문제이다.

UnsupportedJwtException

문제가 발생한 코드

Jwts.parser().setSigningKey(SECRET).parseClaimsJwt(token)

해결

Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token)

jwt가 아니라 jws였다.

POST 이외의 요청도 인식하던 문제

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());
        }
        ...
    }
}

profile
아키텍쳐 설계와 테스트 코드에 관심이 많음.

0개의 댓글