UserDetails 인터페이스를 상속하는 User 엔티티를 생성한다.
Spring Security에서 사용자의 정보를 담는 인터페이스
인터페이스 구성 확인
id 값을 받아 User 객체를 받아오는 메소드를 구현한다.
Spring Security에서 username을 받아 UserDetails 객체를 반환하는 인터페이스
username을 받아 userDetails 객체를 반환하는 메소드
UserDetailsService
에서 User 정보를 가져와서 해당정보를 갖고 토큰을 생성하는 클래스
JwtTokenProvider 코드
userid와 권한 목록을 갖고 토큰을 생성하는 메소드
Claims 객체는 JWT 토큰에 값을 넣기 위해 사용한다고 한다.
Jwts.builder() 메소드를 사용해 토큰 내용 부분을 채워준다.
getUsername()을 이용해 sub값을 받아 이를 이용해 UserDetails 정보를 받아온 후 SecurityContextHolder에 저장할 Authentication 생성
Jwts.parser()를 통해 secretKey를 설정하고 이를 이용해 클레임을 추출해 넣었던 토큰의 sub 값을 추출한다.
헤더 값으로 전달된 토큰 값을 가져와서 리턴하는 메소드
토큰의 기간이 만료되었는지 체크하는 테스트
JWTAuthenticationFilter
OncePerRequestFilter를 상속받는 클래스
JWT 토큰으로 인증하고 SecurityContextHolder 에 추가하는 필터 설정 클래스
시큐리티 설정 클래스
스프링 시큐리티의 적용 범위, 예외처리 등을 어떻게 처리할 것인지 설정한다.
SecurityConfiguration에서 권한 확인 중 예외가 발생할 시 실행되는 클래스
exception uri로 리디렉트되어 예외 메소드가 호출된다.
SecurityConfiguration에서 인증 과정 중 예외가 발생할 시 실행되는 클래스
예외처리를 위해 response를 생성해서 값을 채운 후 클라이언트에게 응답하게 된다.
로그인과 회원가입을 처리할 클래스
전달받은 정보로 User 객체를 만들어 저장한다.
그 후 객체 저장에 결과를 Dto에 저장한다.
전달받은 정보와 DB 정보를 대조한 후 패스워드가 일치하면 토큰을 생성해 Dto에 추가로 저장한다.
성공 시 결과를 저장하는 메소드
실패 시 결과를 저장하는 메소드
setSuccessResult(), setFailResult()의 데이터 설정을하기 위한 enum 클래스
패스워드를 암호화해서 저장하기 위해 암호화를 해주는 클래스
로그인 메소드
회원가입 수행 메소드
예외발생 시 처리하는 메소드
에러 발생 시 응답메시지, 코드등을 전달하는 메소드
인증 보안 파트는 반복해서 봐도 이해가 힘들었다.
책 자체가 A를 하려면 B를 이용해야 한다. 왜냐하면~ 이렇게 설명해주기 보다
B를 이용해서 A를 만든다. 라는 뉘앙스가 강해서 그냥 왜 이렇게 하는 지는 알아서 찾아봐야 하고 생각보다 구글에 정보가 많지도 않아서 너무 힘들었던 파트
다른 파트들도 지금 다시하면 또 까먹었겠지만 유난히 이 파트가 고생시킨 것 같다.
이걸로 책 한 권이 다 끝났지만 말 그대로 겉핥기했다. 이렇게 해서 스프링부트로 취업을 할 수 있을지 모르겠다..