본문 바로가기
spring

spring security 403 forbidden

by __Minnie_ 2024. 3. 16.

spring security를 설정하고, 회원가입, 로그인까지는 정상적으로 동작하는데, 인증이 필요한 api에 접근하려고 하니 계속해서 403에러가 발생했습니다. jwtFilter단에서 로그를 찍어보았을 때, header에 설정한 토큰은 정상적으로 설정되어 있었고, email 역시 정상적이었습니다. 로그 레벨도 trace로 변경해보았지만, 별다른 에러 로그는 뜨지 않았습니다.

 

jwtfilter단에서 로그를 여러군데 넣어서 찍어보았을 때, 딱히 문제가 없었고 jwtfilter 다음으로 usernamePasswordAuthenticationFilter로 넘어가기 때문에 여기서 문제가 생겼을 것이라고 판단하였습니다. 또한 한 블로그 글을 보니, Authentication token을 커스텀하면서 저와 동일한 문제가 발생된 것을 보고 아래 함수에서 문제가 생겼을 것으로 판단하고 해당 함수를 자세히 뜯어보았습니다. 

public UsernamePasswordAuthenticationToken getAuthentication(String accessToken) {
    Claims claims = parseClaims(accessToken);
    return new UsernamePasswordAuthenticationToken(claims.getSubject(), "");
}

 

 

UsernamePasswordAuthenticationToken의 생성자를 들어가서 살펴보니 아래와 같았습니다.

위 코드를 보면 제가 사용한 생성자의 경우 첫번째 생성자인 것을 확인할 수 있는데, 해당 생성자의 경우 setAuthenticated가 false로 설정되어 있는 것을 확인할 수 있습니다. 해당 변수가 false로 설정되어 있어서 authorizationFilter에서 에러를 발생시킨 것입니다. 

 

public UsernamePasswordAuthenticationToken getAuthentication(String accessToken) {
    Claims claims = parseClaims(accessToken);
    if (claims.get(AUTHORITIES_KEY) == null) throw new IllegalArgumentException("invalid token");
    GrantedAuthority authority = new SimpleGrantedAuthority(AUTHORITIES_KEY);
    return new UsernamePasswordAuthenticationToken(claims.getSubject(), "", Collections.singleton(authority));
}

그래서 두번째 생성자를 사용하기 위해서 위처럼 코드를 수정해주었고, 이렇게 수정해주니 정상적으로 동작되는 것을 확인하였습니다.