DTO클래스 생성, Repository코드 및 로그인 API관련 코드 생성
Dto클래스들을 위한 dto패키지를 만들자
dto 패키지 구성
그리고 repository 패키지까지 생성
여기서 repository 패키지 내에는 repository 인터페이스들이 들어간다. 이 인터페이스들은 모두 JpaRepository를 extends한다.
JpaRepository클래스
Spring Data JPA는 여러 API를 제공한다. 인터페이스의 findAll, save 등의 메소드를 호출하는 형태로 crud작업과 페이징, 정렬 등의 작업을 수행한다.
JpaRepository<엔티티 클래스명, ID필드 타입>을 extends하여 repository클래스를 생성해 사용한다.
service패키지를 만들고, userDetailsService를 implements한 customUserDetailsService클래스를 생성한다.
UserDetailsService
spring security에서 유저의 정보를 가져오도록 하는 인터페이스. 유저의 정보를 불러오기 위해 구현해야하는 메소드가 정의되어 있다.
유저의 정보를 불러와서 UserDetails객체로 리턴하는 loadUserByUsername을 오버라이드한다.
이렇게까지 했으면 이제 로그인 api를 만들 차례다.
AuthController를 추가한다.
이 컨트롤러는
두 개를 주입받는다.
이제 코드를 모두 작성했으니 어떤 로직으로 로그인이 수행되는지 보자.
authorize메소드의 loginDto를 통해 로그인시 필요한 정보를 넘기면, loginDto에 담긴 정보인 password와 username을 이용해
usernamePasswordAuthenticationToken을 생성한다.
그러면 그 authenticationToken을 이용해 권한 객체인 authentication을 생성할 것이다.
이 과정에서 authentication을 생성하기 위해 authenticate메소드가 실행된다.
이 때 CustomUserDetailsService의 loadUserByUsername메소드가 실행된다.
이 결과는 authentication에 담긴다.
이 객체를 securityContext에 저장하고, 그 인증 정보를 기준으로 해서
tokenProvider의 createToken메소드를 통해 JWT Token을 생성한다.
그 토큰을 response header에 넣고, TokenDto를 통해서 response body에도 넣어서 리턴한다.
❓❔Security Context
security context란 authentication객체가 저장되는 보관소이다. 필요시 언제든지 authentication 객체를 꺼내어 쓸 수 있도록 제공되는 클래스이다.
threadlocal에 저장되며, 아무 곳에서나 참조가 가능하다.
인증이 완료되면 httpsession에 저장되어 어플리케이션 전반에 걸쳐 전역적인 참조가 가능하다.
❓❔Authentication(인증 객체)
사용자의 인증 정보를 저장하는 토큰 개념.
사용자의 인증 정보인 authentication객체를 security context에 저장한다.
인증 용도 혹은 인증 후 세션에 담기 위한 용도로 사용된다.
인증 후 최종 인증 결과를 담고 securitycontext에 저장하면
Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
이렇게 전역적으로 참조할 수 있다.
authentication객체가 security context에 저장되는 시점은 jwtFilter의 doFilter메소드에서 request가 들어올 때이다.
회원가입 및 권한검증
이제 util패키지를 만들고 SecurityUtil클래스를 만들자.
이 클래스는 security context에서 authentication객체를 가져오고 그를 통해 username을 리턴한다.
이제 유저정보조회와 회원가입 등을 위한 userService클래스를 생성한다.
그리고 그 서비스는 UserController에서 api 요청을 받았을때 수행되도록 한다.
signup api테스트
❓❔왜 생성자 주입시 @AutoWired를 쓰지 않을까?
=> 생성자가 하나일 경우 어노테이션이 없어도 자동 주입된다!
강의)
코드)
개인 레포)
기타 블로그)