@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 헤더에서 데이터를 가져옴 |