▶ AuthController 클래스
더보기
@Slf4j
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class AuthController {
private final AuthenticationService authenticationService;
...
}
▷ AuthController 클래스 해석
@Slf4j
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
- @Slf4j: 이 어노테이션은 Lombok에서 제공하는 기능으로, log라는 이름의 Logger 객체를 자동으로 생성한다. 이를 통해 log.info(), log.debug(), log.error()와 같은 로그 메소드를 쉽게 사용할 수 있다. 로그를 남길 수 있는 기능을 추가해주는 역할이다.
- @RestController: 이 어노테이션은 Spring MVC에서 이 클래스를 RESTful 컨트롤러로 인식하도록 한다. 이 클래스에 정의된 모든 메소드는 JSON이나 XML 형식으로 응답을 반환하게 된다.
- @RequestMapping("/api"): 이 클래스에 정의된 모든 메소드가 기본적으로 /api 경로를 포함하도록 한다. 예를 들어, 이 클래스 내의 메소드에서 /login으로 매핑하면 실제 경로는 /api/login이 된다.
- @RequiredArgsConstructor: Lombok 어노테이션으로, final로 선언된 모든 필드에 대해 생성자를 자동으로 생성한다. 이를 통해 AuthenticationService 필드를 생성자 주입 방식으로 사용할 수 있게 한다. 즉, 이 어노테이션 덕분에 AuthController 객체가 생성될 때 AuthenticationService 필드가 자동으로 초기화된다.
private final AuthenticationService authenticationService;
- private final AuthenticationService authenticationService: AuthenticationService 타입의 authenticationService 필드를 선언한니다. final로 선언하여 한 번 초기화되면 변경할 수 없도록 한다. AuthenticationService는 주로 인증 관련 로직을 처리하는 서비스로, 이를 주입받아 사용한다.
▶ login 메서드
더보기
@PostMapping("/login") // login
public ResponseEntity<TokenResponse> login(@Valid @RequestBody LoginDto loginDto) {
Optional<TokenResponse> optTokenResponse =
authenticationService.makeTokens(loginDto);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JwtFilter.AUTHORIZATION_HEADER, "Bearer " +
optTokenResponse.get().getAccessToken());
ResponseEntity<TokenResponse> ret = new ResponseEntity<>(
optTokenResponse.get(),
httpHeaders,
HttpStatus.OK);
return ret;
}
▷ login 메서드 해석
@PostMapping("/login")
public ResponseEntity<TokenResponse> login(@Valid @RequestBody LoginDto loginDto) {
- @PostMapping("/login"): HTTP POST 요청을 /login 경로로 매핑한다. 이 메소드는 /login 경로로 오는 POST 요청을 처리한다.
- public ResponseEntity<TokenResponse>: 메소드의 반환 타입은 ResponseEntity<TokenResponse>다. ResponseEntity는 응답 상태 코드, 헤더, 본문을 모두 설정할 수 있는 Spring의 응답 객체다.
- login(@Valid @RequestBody LoginDto loginDto): LoginDto 객체를 매개변수로 받고, @Valid를 통해 해당 객체의 유효성을 검사한다. @RequestBody는 클라이언트의 요청 본문을 loginDto 객체로 변환한다.
Optional<TokenResponse> optTokenResponse = authenticationService.makeTokens(loginDto);
- Optional<TokenResponse> optTokenResponse: TokenResponse를 감싸는 Optional 객체를 생성한다. Optional을 사용하면 null 값으로 인한 예외 처리를 더욱 안전하게 할 수 있다.
- authenticationService.makeTokens(loginDto): authenticationService의 makeTokens 메소드를 호출하여 loginDto를 사용해 토큰을 생성한다. 이 메소드는 TokenResponse 객체를 반환하며, 이를 Optional로 감싸 optTokenResponse에 저장합니다.
HttpHeaders httpHeaders = new HttpHeaders();
- HttpHeaders httpHeaders = new HttpHeaders(): HTTP 응답 헤더를 담을 HttpHeaders 객체를 생성한다. 이 객체에 인증 토큰을 추가할 예정이다.
httpHeaders.add(JwtFilter.AUTHORIZATION_HEADER, "Bearer " + optTokenResponse.get().getAccessToken());
- httpHeaders.add(...): Authorization 헤더에 JWT 토큰을 추가한다. JwtFilter.AUTHORIZATION_HEADER는 Authorization 헤더 이름을 나타내며, "Bearer " + optTokenResponse.get().getAccessToken()는 Bearer 타입의 인증 토큰을 설정한다.
- optTokenResponse.get(): Optional에서 TokenResponse 객체를 추출한다.
- .getAccessToken(): 추출한 TokenResponse 객체에서 액세스 토큰을 가져온다.
ResponseEntity<TokenResponse> ret = new ResponseEntity<>(
optTokenResponse.get(),
httpHeaders,
HttpStatus.OK);
- ResponseEntity<TokenResponse> ret = new ResponseEntity<>(...): ResponseEntity 객체를 생성하여 TokenResponse와 함께 응답을 준비한다.
- optTokenResponse.get(): 응답 본문에 TokenResponse 객체를 담는다.
- httpHeaders: 응답 헤더에 설정한 인증 토큰이 포함된 헤더를 설정한다.
- HttpStatus.OK: HTTP 상태 코드를 200 OK로 설정한다.
return ret;
- return ret: 생성한 ResponseEntity 객체를 반환하여 클라이언트에게 응답한다.
▶ refreshToken 메서드
더보기
@PostMapping("/refresh-token")
public ResponseEntity<?> refreshToken(@RequestBody
RefreshTokenRequest refreshTokenRequest,
Authentication authentication) {
try {
Optional<TokenDto> tokenDto = authenticationService.makeNewAccessToken(
refreshTokenRequest, authentication);
if (!tokenDto.isEmpty()) {
return ResponseEntity.ok(tokenDto.get());
} else {
return ResponseEntity.badRequest().body(
"Refresh token expired. Please login again.");
}
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
▷ refreshToken 메서드 해석
@PostMapping("/refresh-token")
public ResponseEntity<?> refreshToken(@RequestBody
RefreshTokenRequest refreshTokenRequest,
Authentication authentication) {
- @PostMapping("/refresh-token"): 이 어노테이션은 HTTP POST 요청을 /refresh-token 경로에 매핑한다. 클라이언트가 /refresh-token으로 POST 요청을 보내면 이 메소드가 호출된다.
- public ResponseEntity<?> refreshToken(...): 메소드 선언부다. ResponseEntity<?>는 제너릭 타입으로 응답 본문에 어떠한 타입이라도 보낼 수 있도록 한다.
- @RequestBody RefreshTokenRequest refreshTokenRequest: 요청 본문을 RefreshTokenRequest 객체로 변환한다. RefreshTokenRequest는 클라이언트가 보낸 리프레시 토큰의 정보를 포함하는 DTO다.
- Authentication authentication: 현재 인증된 사용자의 인증 정보를 담고 있는 객체다. 이는 스프링 시큐리티에서 주입하며, 인증된 사용자의 ID나 권한 정보를 포함할 수 있다.
try {
Optional<TokenDto> tokenDto = authenticationService.makeNewAccessToken(
refreshTokenRequest, authentication);
- try: 예외 발생 가능성이 있는 코드를 안전하게 실행하기 위해 try-catch 블록을 사용한다.
- Optional<TokenDto> tokenDto = authenticationService.makeNewAccessToken: authenticationService의 makeNewAccessToken 메소드를 호출하여 새로운 액세스 토큰을 발급받는다.
- makeNewAccessToken(refreshTokenRequest, authentication): refreshTokenRequest와 authentication 정보를 전달하여 새 액세스 토큰을 요청한다. 반환값은 TokenDto 객체를 감싼 Optional이다.
if (!tokenDto.isEmpty()) {
return ResponseEntity.ok(tokenDto.get());
} else {
return ResponseEntity.badRequest().body("Refresh token expired. Please login again.");
}
- return ResponseEntity.ok(tokenDto.get()): 토큰 발급에 성공한 경우, 응답 본문에 tokenDto를 담고 상태 코드 200 OK를 반환한다.
- return ResponseEntity.badRequest().body("..."): 클라이언트에 상태 코드 400 Bad Request를 반환하고, 응답 본문에는 Refresh token expired. Please login again. 메시지를 담는다.
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
- catch (Exception e): 토큰 생성 중 예외가 발생하면 예외를 잡아 처리한다.
- return ResponseEntity.badRequest().body(e.getMessage()): 상태 코드 400 Bad Request와 예외 메시지를 응답 본문에 담아 반환한다. 이를 통해 예외 발생 시 클라이언트에게 원인 메시지를 전달할 수 있다.
'개인 코드 분석' 카테고리의 다른 글
스프링 시큐리티 Jwt: jwt.JwtFilter (0) | 2024.11.05 |
---|---|
스프링 시큐리티 Jwt: jwt.JwtAuthenticationEntryPoint (0) | 2024.11.05 |
스프링 시큐리티 Jwt: jwt.JwtAccessDeniedHandler (0) | 2024.11.05 |
스프링 시큐리티 Jwt: handler.GlobalExceptionHandler (0) | 2024.11.05 |
스프링 시큐리티 Jwt: controller.UserController (0) | 2024.11.05 |