TIL

🎫@AuthenticationPrincipal 과 @RequestHeader

초비비 2025. 2. 21. 23:39

@RequestHeader를 사용하라구요?

 

프로젝트 중 팀원분께서 튜터님에게 면담을 다녀오셨는데,
유저 정보를 가져올 때 @AuthenticationPrincipal말고 @RequestHeader를 사용하라고 얘기를 듣고 오셔서 공유를 해주셨다.

근데 왜 일까???🙃 궁금해졌다. 그래서 찾아 본 걸 적어보려고 함!

@AuthenticationPrincipal

@AuthenticationPrincipal은 Spring Security에서 제공하는 어노테이션
주로 Spring Security의 인증 정보(로그인된 사용자 정보)를 컨트롤러 메소드에 주입할 때 사용
@RestController
public class UserController {

    @GetMapping("/user/profile")
    public ResponseEntity<String> getProfile(@AuthenticationPrincipal UserDetails userDetails) {
        // UserDetails에는 현재 인증된 사용자의 정보가 포함됨
        String username = userDetails.getUsername();
        return ResponseEntity.ok("Hello, " + username);
    }
}
  • Spring Security의 인증 정보에서 현재 인증된 사용자의 정보를 자동으로 찾아서 해당 메소드의 파라미터로 주입
  • Spring Security의 Authentication 객체나 Principal 객체를 사용하여 로그인된 사용자의 정보를 추출

장점

  • 인증된 사용자 정보를 직접 추출할 필요 없이 자동으로 주입받을 수 있음
  • Custom 로그인 객체를 직접 주입받을 수 있어 타입 안정성이 보장됨
  • Spring Security가 사용자 정보를 관리하여 보안적으로 안전하게 처리
  • 인증 객체를 쉽게 모킹할 수 있어 단위 테스트가 용이함

단점

  • 인증이 필요하지 않은 요청에서 사용할 경우 NullPointerException이 발생할 수 있음
  • Spring Security에 의존적이어서 보안 설정 변경 시 영향을 받을 수 있음
  • Spring Security와 연동되어야 하기 때문에 Spring Security가 인증을 담당하는 환경에서만 사용 가능

 @RequestHeader

@RequestHeader는 HTTP 요청 헤더의 값을 메서드 파라미터에 바인딩하는 데 사용되는 Spring MVC 어노테이션
HTTP 요청의 헤더에 포함된 정보를 메소드 인자에서 바로 사용하려면 이 어노테이션을 사용함
@RestController
public class HeaderController {

    @GetMapping("/user")
    public ResponseEntity<String> getUser(@RequestHeader("Authorization") String authHeader) {
        // 요청 헤더에서 Authorization 값을 가져와 사용
        return ResponseEntity.ok("Authorization header: " + authHeader);
    }
}
  • RequestHeader는 HTTP 요청의 헤더에서 특정 값을 가져와서 해당 메소드의 파라미터로 주입
    • Authorization 헤더, Content-Type, User-Agent 등의 헤더를 주입받을 수 있음

장점

  • 다양한 헤더 정보 활용 가능
  • 클라이언트의 정보나 요청 관련 메타데이터를 쉽게 얻을 수 있음
  • 인증 여부와 관계없이 모든 요청에서 사용 가능
  • Spring Security와 관계없이 HTTP 헤더를 다룰 수 있어서 인증 시스템을 사용하는 경우뿐만 아니라 다양한 환경에서 사용 가능

단점

  • 헤더 정보는 클라이언트에서 쉽게 조작할 수 있으므로, 중요한 정보를 처리할 때는 주의가 필요
  • 많은 헤더를 개별적으로 주입받으면 코드가 복잡해질 수 있음
  • 요청에 해당 헤더가 없으면 MissingRequestHeaderException 예외가 발생하여 추가적인 예외 처리 로직이 필요

정리를 해보면!

@AuthenticationPrincipal @RequestHeader
인증된 사용자 정보 HTTP 헤더 정보
인증된 요청에서만 의미가 있음 모든 요청에서 사용 가능
서버의 보안 컨텍스트에서 데이터를 가져옴 클라이언트가 전송한 HTTP 헤더에서 데이터를 가져옴