스프링 시큐리티 Jwt: controller.AuthController

2024. 11. 5. 09:44·개인 코드 분석

▶ 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  (1) 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
  1. ▶ AuthController 클래스
  2. ▷ AuthController 클래스 해석
  3. ▶ login 메서드
  4. ▷ login 메서드 해석
  5. ▶ refreshToken 메서드
  6. ▷ refreshToken 메서드 해석
'개인 코드 분석' 카테고리의 다른 글
  • 스프링 시큐리티 Jwt: jwt.JwtAuthenticationEntryPoint
  • 스프링 시큐리티 Jwt: jwt.JwtAccessDeniedHandler
  • 스프링 시큐리티 Jwt: handler.GlobalExceptionHandler
  • 스프링 시큐리티 Jwt: controller.UserController
GLaDiDos
GLaDiDos
GLaDiDos
GLaDiDos의 티스토리
GLaDiDos
전체
오늘
어제
  • 분류 전체보기 (207)
    • 자바 튜토리얼 (19)
    • 스프링 프레임워크 (15)
      • IoC (Inversion of Control) (7)
    • Toby Spring 3.1 (4)
    • 테스트 주도 개발 (TDD) (4)
    • 디자인 패턴 (1)
    • 깃 (Git) (1)
    • Reflection (10)
    • 스프링 AOP (15)
    • JPA (Java Persistence API) (10)
    • 네트워크 (5)
    • Spring Boot (48)
      • Annotations (3)
      • Auto-Configuration (12)
      • Spring Data JPA (28)
      • Spring Security (4)
    • Apache Tomcat (7)
    • Web on Servlet Stack (29)
    • 자바 (4)
    • 개인 코드 분석 (9)
    • Spring Security in Action (11)
    • AWS (Amazon Web Service) (2)
      • EC2 (2)
    • 도커 (Docker) (0)
    • 리눅스 (1)
    • 스프링 마이크로서비스 (8)
    • 마이크로서비스 아키텍처 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

링크

공지사항

인기 글

태그

최근 댓글

최근 글

hELLO· Designed By정상우.v4.6.1
GLaDiDos
스프링 시큐리티 Jwt: controller.AuthController
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.