4.3 스프링 시큐리티 통합

jaehyeok1230·2022년 12월 25일
0

JWT 생성 및 반환 구현

jjwt 라이브러리 디펜던시에 추가

버전 문제로 compile 대신에 implementation을 사용함.
implementation과 api, compile의 차이

TokenProvider 클래스 생성

유저의 정보를 받아 JWT를 생성해주는 일을 한다.

USerController의 /signin에서 토큰 생성 및 반환

테스팅

token 필드가 반환된다!!

스프링 시큐리티와 서블릿 필터

토큰 인증을 위해 컨트롤러의 메서드의 첫 부분마다 인증 코드를 작성 해야하는 문제가 있다.

  • 서블릿 필터를 사용하면 된다.

서블릿 필터: 서블릿 실행 전에 실행되는 클래스들이다.

  • 원하지 않는 HTTP요청을 걸러 낼 수 있다.

[Spring Security] Filter란?

스프링 시큐리티 프로젝트를 추가하면 스프링 시큐리티가 FilterChainProxy라는 필터를 서블릿 필터에 끼워 넣어준다.

  • FilterChainProxy 클래스 안에는 내부적으로 필터를 실행시키는데, 이 필터들이 스프링이 관리하는 스프링 빈 필터다.

JWT를 이용한 인증 구현

스프링 시큐리티 디펜던시를 build.gradle에 추가

JwtAuthenticationFilter 클래스 생성

OncePerRequestFilter 클래스를 상속하는 JwtAuthenticationFilter 클래스 구현

  • 인증부분만 구현하고 유효 시간 검사는 생략함

  • 요청의 헤더에서 Bearer 토큰을 가져온다. 이 작업은 parseBearerToken() 메서드에서 이루어 진다.

  • TokenProvider를 이용해 토큰을 인증하고 UsernamePasswordAuthentication을 작성한다. 이 오브젝트에 사용자의 인증 정보를 저장하고 SecurityContext에 인증된 사용자를 등록한다.

    • 서버가 요청이 끝나기 전까지 방금 인증한 사용자의 정보를 갖고 있어야 하기 때문이다.

인증한 사용자의 정보를 갖고 있어야 할까?

  • 요청을 처리하는 과정에서 사용자가 인증됐는지 여부나 인증된 사용자가 누구인지 알아야 할 때가 있기 때문이다.

스프링 시큐리티 설정

WebSecurityConfig 클래스 생성

테스팅

인증 성공!

혹시 모든 요청을 인증하는 게 아닌가? 하는 의문이 들어 토큰에 이상한 값을 넣고 요청을 해보았다.

403 Forbidden이 반환된다!! 결과적으로 성공이다.

TodoController에서 인증된 유저 사용하기

아직 TodoController의 메서드에서는 인증 없던 시절 임시로 지정해 놓았던 유저 아이디를 아직도 사용하고 있다. 이 메서드들이 인증된 유저 아이디를 사용할 수 있도록 각 메서드에 userId 매개변수를 추가해준다.

TodoController 수정

궁금증

  • userId는 도대체 누가 어떻게 String인 것을 알고 넘겨주는 것인가?
    - 이 매개변수는 스프링이 넘겨준다는 것쯤은 이제 짐작할 수 있다. 그렇다면 스프링은 어떻게 userId를 찾아내는가?
    • @AuthenticationPrincipal을 이용한 것이다.
  • @AuthenticationPrincipal은 무엇인가?
    JwtAuthenticationFilter class 내부에 UsernamePasswordAuthenticationToken을 생성했다.

이 때 생성자의 첫 매개변수가 AuthenticationPrincipal 이고, 이 때 String 형의 userId를 넣었다.
그래서 JwtAuthenticationFilter 클래스에서 AuthenticationPrincipal을 String 형의 오브젝트로 지정했기 때문에 @AuthenticationPrincipal의 형으로 String을 사용해야 하는 것을 미리 안 것이다.

테스팅

계정 2개를 생성하고 각각의 토큰을 복사 해놓는다.

첫 번째 사용자로 로그인한 후 TODO 리스트 하나를 추가한다.

두 번째 사용자도 똑같이 한다.

첫 번째 사용자가 추가한 Todo는 보이지 않고 오직 두 번째 사용자가 추가한 Todo만 반환되는 것을 확인할 수 있다!!

패스워드 암호화

UserService 수정

UserController 수정

0개의 댓글