검증, 접속을 Test환경에서 구현 해보도록 하겠습니다.
SpUser는 따로 만든 JPA 모델입니다.
JWT Util을 따로 만들어줍니다.
JWT의 Refresh,Access Token발행 메소드를 전부다 만들어줍니다.
실습 하기 앞서 필요한 코드들 입니다.
코드설명 :
WebIntegrationTest 클래스입니다.
간단한 로컬 서버 포트번호와
웹 테스트 환경을 제공해 주는 클래스입니다
SpUserRepository입니다.
간단하게 email (username 이라고도함)을 select 해주는 메소드를 지정해줍니다.
H2 데이터 베이스를 기반으로 합니다.
테스트 앞서 설정 코드입니다
1. 매번 설정할 때 Repository.deleteAll()을 통해서 DB를 한번 비워줍니다.
2. 그리고 고정된 값 name : user , password : 1111 회원정보를 저장합니다.
3. (중요한 점) addAuthority 에 규칙 ROLE_USER 정해줬습니다.
JPA로 H2 DB에 접근할 때 두 가지 문제점을 해결해야 합니다.
첫 번째로 패스워드가 암호화 되어서 들어가야 한다는 점
두 번째로 SecurityConfig에서 JPA에서 H2 DB 접근을 허가 해줘야 합니다.
아래 코드가 그 두 가지 문제를 해결해줍니다.
암호화 해서 넣지 않아도 에러를 발생시키지 않게 만들어 줍니다.
(다만 코드를 보면 알 수 있듯이 권장하지 않는 코드입니다. 이번 테스트를 위해서 잠시 꺼놓겠습니다.)
위의 addAuthority를 추가시켜주지 않으면 에러가 발생합니다.
반드시 추가 바랍니다.
총 두 번의 요청이 이뤄집니다.
로그인 요청 (Access Token 발급)
원하는 페이지 요청 (사용자의 정보와 AccessToken을 Header에 담아서 전송)
실습하기 앞서 먼저 Spring Security 는 인증 받지 않았을 때 모든 request 들을 가로채
Login 쪽으로 가서 유저의 아이디와 비밀번호를 요구합니다.
그래서 테스트 할 때 먼저 토큰 인증을 받기 위해 로그인 후 인증을 받도록 하겠습니다.
앞서 저장한 user1, 1111이 있기에 로그인 요청할 때
바디에 아이디와 비밀번호 값을 담아 보내줍니다.
Config 메소드에 로그인과 토큰 체크를 위한 필터추가를 해줍니다
LoginFilter , checkFilter 두 가지를 추가시켜줍니다.
그럼 필터에 로그인 요청 시, loginFilter에 걸리게 됩니다.
만든 LoginFilter를 확인해 보시면
UsernamePasswordAuthenticationFilter를 상속받은 것을 알 수 있습니다.
UsernamePasswordAuthenticationFilter란
폼 형식의 패스워드와 닉네임을 입력 받아 로그인 처리, 인증완료면 success 처리를 해주는 메소드 입니다.
즉 아까 테스트 코드에서 ‘/login’ 요청을 받았을 때 필터 추가했던 JWTLoingFilter에서 자연스레 들어와
위의 코드에 objectMapper를 통해서 유저 이름과 비밀번호가 담겨 들어오는 것 입니다.
앞서 SpUser 테이블은 userDetail을 상속받았으며
아래 연결된 서비스에서 정해놓은 username을 찾게 됩니다.
검증을 통해서 일치하면
55쪽의 return 값을 successfulAuthentication쪽으로 날려줍니다..
그럼 response헤 header에 토큰과 Content_type을 담아 보내줍니다.
결과값을 받은 resp1의 값을 확인해보면
이처럼 접속한 SpUser의 값과 , 만들어진 토큰 값을 받을 수 있습니다.
그 다음에는 인증 받은 토큰을 이용해 ‘/greating’
get요청을 해보겠습니다
아까 만든 JWTUtil 클래스를 잘 보면 인증 받을 때 유저이름과 액세스 토큰을 줍니다..
그래서
요청 시 아래 사진처럼 Header에 인증 토큰 값을 담아 보내기 때문에
BasicAuthenticationFilter를 상속받은 JWTCheckFilter에서 대신 체크하도록 진행됩니다.
즉 요청 시 헤더에 들어간 인증요청 때문에 토큰 검증에 들어간다는 뜻 입니다.
마지막으로
Bearer가 있는지 체크, 없다면 그냥 반환하고
만약 있다면 토큰이 있다는 것이니 그대로 값을 가져오고
받아온 String token 값을 사전에 만들어 두었던 검증 코드를 이용해
검증합니다. 성공시 doFilter로 성공 실패 시 에러를 발생시켜 Token is not valid를 출력해줍니다
200 ok와 함께 올바르게 출력됨을 볼 수 있습니다.
참고 :
스프링부트 Java/Spring 웹 개발 마스터 초격차 패키지 ,