JWT(Json Web Token) 토큰 3

작성자 : 조회수 :

앞서 기본적으로 배웠던 JWT 토큰 생성, 인증 과정을 사용, Spring Security 기능을 이용해서

검증, 접속을 Test환경에서 구현 해보도록 하겠습니다.



SpUser는 따로 만든 JPA 모델입니다.





JWT Util을 따로 만들어줍니다.

 

JWTRefresh,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 웹 개발 마스터 초격차 패키지 ,