본문 바로가기

개발일지

개발일지 25 - Jwt 검증 중 발생한 오류

뉴스피드 프로젝트를 진행하는 중에 Postman으로 http요청을 보내는데 자꾸 에러가 뜨면서 진행이 되지 않았다.

결론적으로 말하자면 굉장히 많은 문제들이 겹쳐있어서 한 가지만 해결해서 될 문제가 아니었다. 일단 로그를 보면서 하나씩 해결해 나가기로 했다.

 

1.Validation 

 

첫 번째는 내가 정한 Email의 형식을 지키지 않은 형태의 데이터값이 넘어와 데이터 검사에서 걸린 것이다.

이는 다시 형식에 맞춰 보내니 해결되었다.

 

2. 토큰검증 시 예외발생

요청헤더에 토큰을 담아 보내는데 자꾸 예외가 발생했다. 그래서 토큰 관련 메서드를 보면서 잘못작성한 코드가 있는지 확인해 봤다.

    // 토큰 생성 메서드
    public String createToken(String userId){
        Date date = new Date();

        long TOKEN_TIME = 1000*60*60;
        return BEARER_PREFIX +
                Jwts.builder()
                        .setSubject(userId)
                        .setExpiration(new Date(date.getTime()+TOKEN_TIME))
                        .setIssuedAt(date)
                        .signWith(key, signatureAlgorithm)
                        .compact();
    }
    
    //토큰 추출 메서드
        public String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
        if(StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)){
            return bearerToken.substring(7);
        }
        return null;
    }

 

이 두 메서드를 확인하면서 둘러보던 중에 잘못된 부분을 발견했다.

public static final String BEARER_PREFIX = "Bearer"; // "Bearer " 가 되야함

 

bearerToken에서 앞부분을 떼어내기 위해 substring을 사용했는데 index가 잘못 설정되어 있었다. BEARER_PREFIX의 값에 공백을 넣어서 수정하거나 index를 6으로 설정해야 했다.

 

3. final

@Service
@RequiredArgsConstructor
public class MemberDetailsService {
    private MemberRepository memberRepository; // -> private final MemberRepository memberRepository;

    public UserDetails getMemberDetails(String userId){
        Member member = memberRepository.findByUserId(userId)
                .orElseThrow(() -> new UsernameNotFoundException("Not Found" + userId));
        return new MemberDetailsImpl(member);
    }
}

로그에서 자꾸 memberRepository가 null이라고 한다. 그래서 찾아보니 MemberRepository 객체 앞에 final 이 없어서 의도했던 객체를 참조할 수 없었던 것 같다. 그래서 final을 붙여주니 문제가 해결되었다.