
MySQL 데이터베이스를 활용 JWT 기반의 인증/인가를 구현하고 회원 정보 저장하기
회원가입 : 내부 회원 가입 로직은 세션 방식과 JWT 방식의 차이가 없다.
로그인 (인증) : 로그인 요청을 받은 후 세션 방식은 서버 세션이 유저 정보를 저장하지만 JWT 방식은 토큰을 생성하여 응답한다.
// JWT
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
Spring의 보안(인증과 권한, 인가 등)을 담당하는 서블릿 필터의 집합이다.
서블릿 필터는 서블릿 실행 전에 실행되는 클래스들로 토큰 인증을 위해 컨트롤러 메서드의 첫 부분마다 인증 코드를 작성하는 고민을 해결하기 위해 서블릿 필터를 사용
전자 서명 토큰 중 하나, 서버가 헤더와 페이로드를 생성한 후 전자 서명을 한다는 특징이 있다.
JSON 형태의 토큰으로 {header}.{payload}.{signature}로 구성되어있고, 토큰 기반 인증이므로 서버가 생성함.
장점
사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요 없다.
URL 파라미터와 헤더로 사용
수평 스케일이 용이하다
디버깅 및 관리가 편하다.
REST 서비스로 제공이 가능하다
단점
토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없다.
더 많은 필드가 추가되면 토큰이 커지게 된다.
2.Payload
sub : Subject를 줄인 말, 토큰의 주인을 의미 sub는 ID처럼 유일한 식별자여야함.
iss : Issuer를 줄인 말, 토큰을 발행한 주체를 의미한다.
iat : issued at을 줄인 말, 토큰이 발행된 날짜와 시간
exp : expiration을 줄인 말, 토큰이 만료되는 시간
3.Signature
토큰의 유효성 검사에 사용함.
토큰 발행 > 로그인 시 토큰 반환 > 토큰을 이용해 API 인증
JWT 라이브러리 추가(gradle)
토큰 클래스 생성(TokenProvider.java)
토큰을 생성한 후 반환할 DTO 생성(UserDTO.java)
사용자 Controller 생성
1) 요청의 헤더에서 Bearer 토큰을 가져온다.
2) 클래스를 이용해 토큰을 인증한다.
3) 오브젝트에 사용자의 인증 정보를 저장하고 Security에 인증된 사용자를 등록한다. 등록하여 요청을 처리하는 과정에서 사용자가 인증됐는지 여부나 인증된 사용자가 누군지 알 수 있다.
Spring Security 설정
Controller 인증 적용