🥑

초보 개발자의 일상

개발 공부/SpringBoot

JWT 토큰 발행 받기

dev.jelee 2024. 11. 8. 23:18

 

1. 회원가입. @PostMapping("/signup")

  1. ID/PW 입력 (request)
  2. ID 유효한지 체크. DuplicateKeyException으로 이미 있는 아이디면 throw new. 없는 아이디면 다음으로 넘어가기.
  3. PW는 PasswordEncoder로 암호화
  4. DB에 저장 사용자 정보 저장.
  5. ResponseEntity로 status(상태)는 성공 응답 코드, body(본문)에는 회원가입이 완료되었다는 메시지를 클라이언트에게 응답해주기.(보내주기)

2. 로그인 & 토큰 @PostMapping("/login")

ID/PW 입력 > 사용자 확인:DB에서 확인 > USER가 맞으면... > 인증 토큰 생성 > 인증 객체 생성 > 스프링 전체에 사용할 수 있도록 bean 등록 > user는 토큰으로 여러 서비스 가능.

  1. ID/PW 입력 (request)
  2. UsernamePasswordAuthenticationToken에 request(ID, PW)를 담아서 객체로 생성
  3. authenticate()를 통해 사용자 인증 수행을 하여 인증이 성공되면 Authentication 객체에 결과값을 저장한다.
    • **AuthenticationManagerBuilder**는 인증 방식(메모리 인증, JDBC 인증 등)을 설정.
    • **AuthenticationManagerBuilder.getObject()**로 실제 인증을 수행할 AuthenticationManager 객체를 생성
    • **AuthenticationManager**의 authenticate() 메서드가 인증을 수행
    • 요약:
      1. authenticationManagerBuilder.getObject() 가 인증을 수행할 AuthenticationManager 객체를 생성
      2. AuthenticationManager  객체의 authenticate() 메서드가 인증을 수행
      3. 인증 성공시 Authentication 객체 반환. 인증 실패시 예외 발생
  4. SecurityContextHolder.getContext()를 통해 현재 스레드에 해당하는 SecurityContext 객체를 반환한다. 그리고 이 반환된 SecurityContext 객체에 setAuthentication 메서드를 통해 Authentication 정보를 저장한다. 
    • **SecurityContextHolder.getContext()**: 현재 스레드에 해당하는 SecurityContext 객체를 반환합니다.
    • **setAuthentication(authentication)**: 반환된 SecurityContext 객체에 Authentication 정보를 저장하는 메서드입니다.
  5. tokenProvider 객체의 .createToken() 메서드를 통해 authentication 객체의 정보를 가지고 JWT 토큰을 생성.
  6. authentication.getPrincipal()를 통해 인증된 사용자 정보를 UserDetails 객체로 반환하는데, 이 UserDetails가 Custom한 CustomUserDetails 객체이다.
  7. userDetails에서 MemberDTO 타입의 회원 정보를 뽑아서 member에 저장.
  8. MemberService의 updateLastLogin() 메서드를 호출해 member.getUserNo() 값을 전달한다. 이 값은 추측으로는 사용자이 마지막 로그인 시간을 갱신하는데 사용하는 것 같다.
    • MemberService.java 파일에 가면 updateLastLogin()메서드가 있다. 이 메서드는 반환값이 없으며(void) MemberMapper의 selectLastLogin() 메서드에 userNo 값을 전달한다.
    • MemberMapper.java 파일에 가면 selectLastLogin() 메서드가 있다. 이 메서드는 반환값이 없으며(void) MemberMapper.xml과 연결되어 있다. 
    • MemberMapper.xml 파일에 가면 <update id="updateLastLogin">이 있다. 여기로 Long데이터 타입의 userNo값이 UPDATE된다.
  9. TokenResponse객체를 .builder()를 사용하여 (빌더 패턴) 객체를 만든다. 이 객체에는 jwt 토큰, member객체의 userID(로그인한 사용자의 아이디), member객체의 userName(이름) 필드를 저장한다. 그리고 마지막에 .build() 메서드를 사용하여 객체를 생성한다.
  10. ResponseEntity객체의 ok메서드를 호출. ok 메서드는 성공 응답 코드인 200을 반환하고 builder패턴을 사용하여 만든 JsonResponse객체를 반환한다. JsonResponse객체에는 성공 여부의 true값과 로그인이 완료되었다는 메세지, tokenResponse데이터(발행받은 JWT토큰; 사용자 ID, 사용자 이름이 담긴 JWT토큰)가 담겨있다.

 

용어 설명

  • **authenticationManagerBuilder**는 인증 방식을 설정하는 도구이다. (메모리에서 인증할지, 데이터베이스에서 인증할지, LDAP에서 인증할지 등을 설정)
  • **getObject()** 설정된 방식에 따라 AuthenticationManager 객체를 생성하는 메서드이다. AuthenticationManager는 인증을 실제로 처리하는 객체다.
  • **authenticate(authenticationToken)** 메서드는 authenticationToken을 기반으로 실제 인증을 수행한다. 즉, 사용자가 입력한 정보가 DB나 메모리 등의 저장소에 저장된 정보와 일치하는지 확인하는 과정입니다.
    • 인증 성공 시: 인증된 사용자 정보를 담은 Authentication 객체를 반환합니다.
    • 인증 실패 시: 인증 실패를 나타내는 예외(BadCredentialsException 등)를 던집니다.
  • **authenticationToken**은 사용자가 입력한 사용자 이름과 비밀번호를 담고 있는 객체
  • **Authentication** 객체는 인증된 사용자의 정보를 담고 있습니다. 이 객체는 인증 성공 후 반환되며, 인증된 사용자의 이름, 권한, 계정 상태 등의 정보를 포함합니다. 예를 들어, 인증이 성공하면 다음과 같은 정보를 담은 Authentication 객체를 얻게 됩니다:
    • 사용자 이름
    • 권한
    • 계정 상태 (활성화 여부)
  • **TokenResponse** 객체는 일반적으로 JWT 토큰을 생성하고 응답으로 반환하는 경우에 사용되는 DTO(Data Transfer Object) 클래스입니다. 이 객체는 서버에서 클라이언트에게 인증된 사용자의 JWT 토큰과 관련된 정보를 전달하기 위해 사용됩니다.

 

 

 

'개발 공부 > SpringBoot' 카테고리의 다른 글

Throwable cause, Throwable  (1) 2024.11.07
@JsonInclude  (1) 2024.11.07
Builder  (0) 2024.11.07
Enum  (1) 2024.11.07
@JsonFormat  (0) 2024.11.07