1. 회원가입. @PostMapping("/signup")
- ID/PW 입력 (request)
- ID 유효한지 체크. DuplicateKeyException으로 이미 있는 아이디면 throw new. 없는 아이디면 다음으로 넘어가기.
- PW는 PasswordEncoder로 암호화
- DB에 저장 사용자 정보 저장.
- ResponseEntity로 status(상태)는 성공 응답 코드, body(본문)에는 회원가입이 완료되었다는 메시지를 클라이언트에게 응답해주기.(보내주기)
2. 로그인 & 토큰 @PostMapping("/login")
ID/PW 입력 > 사용자 확인:DB에서 확인 > USER가 맞으면... > 인증 토큰 생성 > 인증 객체 생성 > 스프링 전체에 사용할 수 있도록 bean 등록 > user는 토큰으로 여러 서비스 가능.
- ID/PW 입력 (request)
- UsernamePasswordAuthenticationToken에 request(ID, PW)를 담아서 객체로 생성
- authenticate()를 통해 사용자 인증 수행을 하여 인증이 성공되면 Authentication 객체에 결과값을 저장한다.
- **AuthenticationManagerBuilder**는 인증 방식(메모리 인증, JDBC 인증 등)을 설정.
- **AuthenticationManagerBuilder.getObject()**로 실제 인증을 수행할 AuthenticationManager 객체를 생성
- **AuthenticationManager**의 authenticate() 메서드가 인증을 수행.
- 요약:
- authenticationManagerBuilder.getObject() 가 인증을 수행할 AuthenticationManager 객체를 생성
- AuthenticationManager 객체의 authenticate() 메서드가 인증을 수행
- 인증 성공시 Authentication 객체 반환. 인증 실패시 예외 발생
- SecurityContextHolder.getContext()를 통해 현재 스레드에 해당하는 SecurityContext 객체를 반환한다. 그리고 이 반환된 SecurityContext 객체에 setAuthentication 메서드를 통해 Authentication 정보를 저장한다.
- **SecurityContextHolder.getContext()**: 현재 스레드에 해당하는 SecurityContext 객체를 반환합니다.
- **setAuthentication(authentication)**: 반환된 SecurityContext 객체에 Authentication 정보를 저장하는 메서드입니다.
- tokenProvider 객체의 .createToken() 메서드를 통해 authentication 객체의 정보를 가지고 JWT 토큰을 생성.
- authentication.getPrincipal()를 통해 인증된 사용자 정보를 UserDetails 객체로 반환하는데, 이 UserDetails가 Custom한 CustomUserDetails 객체이다.
- userDetails에서 MemberDTO 타입의 회원 정보를 뽑아서 member에 저장.
- 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된다.
- TokenResponse객체를 .builder()를 사용하여 (빌더 패턴) 객체를 만든다. 이 객체에는 jwt 토큰, member객체의 userID(로그인한 사용자의 아이디), member객체의 userName(이름) 필드를 저장한다. 그리고 마지막에 .build() 메서드를 사용하여 객체를 생성한다.
- 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 |