시애틀의 명물인 스타벅스 1호점! 평소엔 사람이 줄을 서서 기다린다고 하지만 평일 낮과 평일 밤에 방문한 덕분인지 줄을 오래기다리지 않았다ㅎㅎ

 

 

 

 

 

- TIL -

구현 목표 )

JWT 내부의 payload 에 Role 값을 key, value 로 지정한 후 클라이언트에서 해당 JWT 를 가져와 서버로 검증할때 해당 유저의 정보를 가져와 DB 에서 값을 추출하여 접근 api 주소에 권한이 있는지 확인하여 처리하도록 구현하고자 하였다.

 

 

 

문제 발생 )

1. 우선 현재 프로젝트에서 관리하는 Role 값은 enum 타입으로 설정하여 관리중이고 Spring Security 에서는 GrantedAuthority 객체나 SimpleGrantedAuthority 객체를 사용하여 객체 값을 관리하므로 관리하는 객체 타입이 다른 점에서 발생할 수 있는 문제가 있다고 판단하였다.

 

2. 토큰이 정상정으로 발급됨을 확인한 뒤 HttpSecurity 클래스의 hasRole("USER") 메소드나 @PreAuthrize("hasAnyRole('USER')") 어노테이션을 사용하여 분명 권한 정보를 토큰에서 추출하여 비교한 뒤 검증해야하는데 모든 요청의 응답이 403 Forbidden 로 처리되는 문제가 발생했다.

 

 

 

문제 해결 )

1. Role 값의 타입 문제는 토큰을 구현하며 공식문서와 인터넷 서핑을 통해 찾아보니 어짜피 JWT 에 담기는 모든 내용은 문자열로 변환하여 저장되고 검증되므로 토큰을 구현하는데 있어서 현재 사용하는 클래스 타입에서 캐스팅을 통해 문자열로 변환한 뒤 저장해주면 된다는 해결책을 찾게 되었다.

UsernamePasswordAuthenticationFilter 클래스의 successfulAuthentication 메소드를 오버라이딩하여 payload 부분에 내가 넣고자하는 정보를 넣어서 저장, 이때 user.getRole() 메소드를 통해 가져온 값은 enum 타입이므로 name() 메소드를 사용하여 String 타입으로 캐스팅하여 토큰을 빌드하였다

 

 

2. 가장 큰 문제점이었던 권한이 정상적으로 검증되지 않았던 문제는 우선적으로 토큰에 정상적인 권한 값이 들어가있는지 토큰의 정보를 추출하여 확인해보아도 내가 설정한 USER 값이 정상적으로 출력되는 것을 확인할 수 있었다. 그래서 공식문서를 찾아보니 hasRole 을 사용하여 권한을 검증하면 ROLE_ 의 접두가사 권한의 앞에 붙는다는 사실을 알게되었고 유저의 Role 값을 검증함에 있어서 앞에 접두사를 붙여서 코드를 구현하니 정상적으로 200 OK 응답이 돌아오는 것을 확인하였다.

UserDetails 클래스에서 getAuthorities 메소드를 오버라이딩하여 role 값을 추출하여 앞에 "ROLE_" 접두사를 붙여서 검증하게끔 설정하니 200 Ok 사인을 반환

728x90

+ Recent posts