버전 문제로 compile 대신에 implementation을 사용함.
implementation과 api, compile의 차이
유저의 정보를 받아 JWT를 생성해주는 일을 한다.
token 필드가 반환된다!!
토큰 인증을 위해 컨트롤러의 메서드의 첫 부분마다 인증 코드를 작성 해야하는 문제가 있다.
서블릿 필터: 서블릿 실행 전에 실행되는 클래스들이다.
스프링 시큐리티 프로젝트를 추가하면 스프링 시큐리티가 FilterChainProxy라는 필터를 서블릿 필터에 끼워 넣어준다.
OncePerRequestFilter 클래스를 상속하는 JwtAuthenticationFilter 클래스 구현
요청의 헤더에서 Bearer 토큰을 가져온다. 이 작업은 parseBearerToken() 메서드에서 이루어 진다.
TokenProvider를 이용해 토큰을 인증하고 UsernamePasswordAuthentication을 작성한다. 이 오브젝트에 사용자의 인증 정보를 저장하고 SecurityContext에 인증된 사용자를 등록한다.
인증한 사용자의 정보를 갖고 있어야 할까?
인증 성공!
혹시 모든 요청을 인증하는 게 아닌가? 하는 의문이 들어 토큰에 이상한 값을 넣고 요청을 해보았다.
403 Forbidden이 반환된다!! 결과적으로 성공이다.
아직 TodoController의 메서드에서는 인증 없던 시절 임시로 지정해 놓았던 유저 아이디를 아직도 사용하고 있다. 이 메서드들이 인증된 유저 아이디를 사용할 수 있도록 각 메서드에 userId 매개변수를 추가해준다.
이 때 생성자의 첫 매개변수가 AuthenticationPrincipal 이고, 이 때 String 형의 userId를 넣었다.
그래서 JwtAuthenticationFilter 클래스에서 AuthenticationPrincipal을 String 형의 오브젝트로 지정했기 때문에 @AuthenticationPrincipal의 형으로 String을 사용해야 하는 것을 미리 안 것이다.
계정 2개를 생성하고 각각의 토큰을 복사 해놓는다.
첫 번째 사용자로 로그인한 후 TODO 리스트 하나를 추가한다.
두 번째 사용자도 똑같이 한다.
첫 번째 사용자가 추가한 Todo는 보이지 않고 오직 두 번째 사용자가 추가한 Todo만 반환되는 것을 확인할 수 있다!!