5주차 - 2

이준우·2022년 12월 25일
0

Study

목록 보기
7/7

스프링 시큐리티 통합

로그인 여부를 저장하는 것은 스프링 시큐리티와 JWT 토큰을 이용해 해결할 예정.
스프링 시큐리티를 이용하면 코드를 한 번만 짜고, 이 코드가 모든 API를 수행하기 바로 전에 실행되도록 구현할 것이다.

JWT 생성 및 반환 구현.

https://kotlinworld.com/317
gradle은 6.x 버전 이후 compile -> api 그리고 api보다 implementation을 권장.

gradle 디펜던시에 추가

TokenProvider

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


계정 생성

token 필드 반환

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


토큰 인증을 위해 컨트롤러 메서드의 첫 부분마다 인증 코드를 작성 --> 서블릿 필터를 사용해 해결.
스프링 시큐리터란 서블릿 필터의 집합.
서블릿 필터는 서블릿 실행 전에 실행되는 클래스들이다.

서블릿 필터를 구현하고 서블릿 필터를 서블릿 컨테이너가 실행하도록 설정해주면 된다.

서블릿 필터를 통해 원하지 않는 HTTP 요청을 걸러 낼 수 있다.

기능에 따라 다른 서블릿 필터를 작성할 수 있고 이 서블릿 필터들을 FilterChain을 이용해 연쇄적으로 실행할 수 있다.

각 필터는 다음으로 부를 Filter를 FilterChain으로 다음 필터를 실행.

스프링 시큐어 프로젝트 추가하면 스프링 시큐리티가 FilterChainProxy라는 필터를 서블릿 필터에 끼워 준다.
FilterChainProxy 클래스 안에는 내부적으로 필터를 실행, 이 필터들이 스프링이 관리하는 Bean 필터.
상솔할 필터는 OncePerRequestFilter.
WebSecurity ConfigurerAdapter라는 클래스를 상속해 필터를 설정.

JWT를 이용한 인증 구현.

gradle 디펜던시에 추가.

OncePerRequestFilter : 한 요청당 반드시 한번만 실행. 따라서 한번만 인증하면 되는 우리 코드에 딱 맞는 코드.

스프링 시큐리티 설정

서블릿 컨테이너에게 이 서블릿 필터를 사용하라고 알려주는, 설정 작업.
스프링 시큐리티에게 JwtAuthenticationFilter를 사용하라고 알려줌.


로그인 후 받은 토큰

정상적으로 인증


토큰이 틀렸을 경우 403 Forbidden 오류 발생.

JWT를 신뢰할 수 없어 예외처리된 것.

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

인증된 유저 아이디를 사용할 수 있도록 각 메서드에 userId 매개변수를 추가 후,
TodoController 에서 temporary-user 를 userId로 대체.
userId -> Spring이 넘겨줌
@AuthenticationPrincipal 어노테이션을 이용하여 userId를 찾는다.

스프링은 컨트롤러 메서드를 부를 때 @AuthenticationPrincipal 어노테이션이 있나는 것을 안다.
그래서 UsernamePasswordAuthenticationToken 오브젝트를 가져온다.
이 오브젝트에서 AuthenticationPrincipal을 가져와 컨트롤러 메서드에 넘겨준다.

즉 JwtAuthenticationFilter 클래스에서 AuthenticationPrincipal을 String 형의 오브젝트로 지정했기 때문에 @AuthenticationPrincipa의 형으로 String을 사용해야 한다는 것을 미리 안 것이다.

hello@world.com

hello2@world.com --> 첫번째 사용자의 Todo는 보이지 않음.

패스워드 암호화.

시큐리티가 제공하는 BCryptPasswordEncoder를 시용.

UserService 의 getByCredintials 수정

matchs를 사용하는 이유 : BCryptPasswordEncoder는 같은 값을 인코딩하더라도 할 때 마다 값이 다르기 때문. 따라서 두 값이 같은지 비교해주는 메서드인 matchs()를 사용.


profile
잘 살고 싶은 사람

0개의 댓글