
이번 글에서는 이 강의를 듣는 첫 번째 이유인 JWT를 설정하는 방법에 대해 알아보겠습니다.
우선 정수원님의 시큐리티 강의를 통해 세션 로그인 방식에 대해 알아본 적이 있습니다. 기억을 꺼내 다시 굵직하게 정리를 해보자면 이렇습니다.
- 사용자가 로그인 인증을 시도합니다.
- 서버는 그것을 검증하고, 성공하면 세션을 생성한 다음 빠른 탐색을 위해 이 세션의 고유한 ID를 만듭니다.
- 서버는 로그인 응답에 고유한 세션 ID를 포함합니다.
- 사용자는 매 요청 시마다 서버로부터 받은 세션 ID를 요청에 포함해 요청합니다.
- 서버는 이 세션 ID를 토대로 세션을 검색해 비교 후 사용자에 권한을 부여합니다.
토큰 방식은 위 같은 세션 방식과는 다릅니다. 서버가 별도의 세션 저장소를 가지지 않고 그러므로 당연히 세션 ID라는 것도 만들지 않습니다. 대신, 최초 로그인 시 사용자에게 토큰이라는 것을 발급해 사용자가 매 요청마다 이 토큰을 가지고 오도록 하는 겁니다.
이번 프로젝트에서는 토큰을 발급하는 주체와 인증하는 주체가 같기 때문에 대칭키 방식으로 토큰을 만들 겁니다. 최주호님이 이 방식을 쉬운 예로 들었는데요, 아래와 같습니다.
- 일반 시민은 버스를 타기 위해 버스 회사에서 토큰을 구매한다.
- 일반 시민은 이 토큰에 대해 아무 것도 알 필요가 없고, 단지 이 토큰만 있으면 버스를 탈 수 있다는 사실만 안다.
- 일반 시민은 버스에 탑승 시마다 토큰을 지불한다.
- 버스 기사는 받은 토큰이 유효한 토큰인지만 확인한다.
이제 JWT를 위한 소스를 만들어보겠습니다. 먼저 JWT 기본 설정을 위한 VO 클래스를 만듭니다. VO는 대칭키, 만료시간, 인증타입, 헤더 내용을 포함합니다.

그런 다음 시큐리티에서 인증을 하기 위해 필수적인 UserDetails, UserDetailsService 두 가지 클래스를 커스텀해 만들겠습니다.


위 두 클래스는 익숙한 내용이니 별도의 설명은 생략하겠습니다. 그런 다음 토큰을 만들고 검증하는 기능을 가진 객체를 만들겠습니다.

토큰을 생성하는 create()라는 매서드를 만들고, 파라미터로 인증에 성공한 UserDetails 객체를 받습니다.
withSubject: 토큰의 대표 명칭
withExpiresAt: 토큰의 만료 시간, 기본 설정은 무한대
withClaim: 토큰 페이로드의 유저 정보
sign: 알고리즘과 비밀키로 구성된 서명
TOKEN_PREFIX: 토큰 형식
다음으로는 이것들을 이용해 실제 작동할 필터를 만들어야 하는데요, 해당 내용은 다음 글에서 작성하겠습니다.