기본적으로 JWT를 사용하기 위한 디펜던시를 추가했다.
먼저 JWT를 이용해 사용자 검증을 하려면 몇 가지 기능이 필요하다.
- 검증할 수 있는 토큰이 존재해야하기 때문에 토큰 생성 기능
- 토큰 유효기간 검사 기능
- 클라이언트로부터 토큰을 넘겨받는 기능
- 토큰검증이 완료된 후 해당 클라이언트의 권한을 설정하는 기능
요렇게 4가지로 분류하여 기능을 작성했다.
토큰 생성은 로그인 시 사용될 것이고 나머지는 인증에 사용될 것이다.
필자는 Filter를 사용해서 인증 절차를 거치도록 작업했다.
순서대로 서술해보자면
생성
- 클라이언트는 로그인 요청
- 서버는 넘겨받은 ID를 가지고 DB에 해당 ID로 저장되어있는 데이터 조회
- 조회하기 위해 받은 데이터에 있는 비밀번호와 클라이언트로부터 넘겨받은 비밀번호가 일치하는지 검사
- 모든 절차가 정상적으로 진행됐다면 해당 유저 데이터를 기반으로 JWT토큰 생성 요청
- 프로바이더에서는 해당 유저 데이터 정보, 지정된 유효기간, 지정된 암호화 키방식을 Jwt 클레임 객체에 담고, 토큰 생성
- 생성된 토큰을 리턴 받은 서버는 클라이언트에게 응답
인증
- 필터에서는 요청(request) 객체에 토큰이 존재하는지 체크
- 토큰이 null 여부와 동시에 토큰의 유효기간 체크
- 토큰 유효여부 검사가 끝나면 해당 토큰을 생성할 때 클레임 객체에 넣어놓은 사용자의 정보가 있을것이다.
- 해당 정보를 파싱후 조합해 UsernamePasswordAuAuthenticationToken을 만들어 전달하고 마지막 검증절차 진행
이렇게 구조를 짰다. 물론 이게 무조건 옳은 방법도 아니고 정답이라는 것도 절대 아니다.
이제 테스트를 위해 그에 맞는 API를 간단하게 작성해보자.