스프링 시큐리티 및 스프링 부트에서 HttpServletRequest 객체는 중요한 역할을 하며, 보안 관련 작업에 많이 사용됩니다. 아래는 HttpServletRequest에서 스프링 시큐리티 및 스프링 부트 동작에서 유의미한 동작과 관련된 주요 메소드들입니다.
1. getAuthType()
- 설명: 이 메소드는 요청에 대해 사용된 인증 방법을 반환합니다. 예를 들어, "BASIC", "FORM", "CLIENT_CERT", "DIGEST" 등이 될 수 있습니다.
- 스프링 시큐리티에서 사용: 스프링 시큐리티에서 인증 방식(Basic, Form 등)을 확인할 때 사용될 수 있습니다. 인증 방식은 인증을 처리하는 필터에 영향을 미칩니다.
String authType = request.getAuthType();
2. getRemoteUser()
- 설명: 인증된 사용자의 원격 사용자 이름을 반환합니다.
- 스프링 시큐리티에서 사용: 인증된 사용자의 이름을 가져오는 데 사용됩니다. 이 값은 SecurityContextHolder에 저장된 Authentication 객체와 연결된 사용자의 정보를 가져올 때 유용합니다.
String remoteUser = request.getRemoteUser();
3. isUserInRole(String role)
- 설명: 사용자가 특정 역할(role)을 가지고 있는지 확인합니다.
- 스프링 시큐리티에서 사용: 이 메소드는 권한 부여(Authorization) 과정에서 사용됩니다. 요청이 들어왔을 때 사용자가 특정 역할을 가지고 있는지 확인하여 권한을 부여하는 데 사용됩니다.
boolean hasRole = request.isUserInRole("ADMIN");
4. getUserPrincipal()
- 설명: 인증된 사용자의 Principal 객체를 반환합니다. Principal 객체는 사용자의 이름이나 기타 인증 정보를 포함합니다.
- 스프링 시큐리티에서 사용: SecurityContextHolder에 저장된 Authentication 객체에서 사용자 정보(Principal)을 쉽게 추출할 수 있습니다.
Principal principal = request.getUserPrincipal();
5. getSession(boolean create)
- 설명: 현재 요청과 관련된 세션을 가져옵니다. create가 true일 경우, 세션이 없으면 새로 생성합니다.
- 스프링 시큐리티에서 사용: 세션을 통해 인증 정보를 유지할 수 있습니다. 세션을 사용하여 인증된 사용자 정보를 저장하고 요청 간 인증 상태를 유지합니다.
HttpSession session = request.getSession(true); // 세션이 없으면 새로 생성
6. getRequestedSessionId()
- 설명: 요청에 포함된 세션 ID를 반환합니다.
- 스프링 시큐리티에서 사용: 이 값은 세션을 확인하거나 세션을 재인증할 때 사용됩니다. 사용자가 새로운 요청을 보낼 때 기존 세션이 유효한지 확인하는 데 유용합니다.
String sessionId = request.getRequestedSessionId();
7. isRequestedSessionIdValid()
- 설명: 요청에 포함된 세션 ID가 유효한지 확인합니다.
- 스프링 시큐리티에서 사용: 세션의 유효성 검사에 사용됩니다. 요청이 유효한 세션을 사용하는지 확인할 때 유용합니다. 인증된 사용자의 세션이 유효한지 확인하여, 요청을 처리할 수 있도록 합니다.
boolean validSession = request.isRequestedSessionIdValid();
8. authenticate(HttpServletResponse response)
- 설명: 클라이언트를 인증하기 위한 메소드입니다. HttpServletResponse 객체를 이용하여 인증을 수행합니다.
- 스프링 시큐리티에서 사용: 주로 Basic Authentication이나 Digest Authentication과 같은 HTTP 인증 방식을 처리할 때 사용됩니다.
request.authenticate(response); // 인증 과정 시작
9. login(String username, String password)
- 설명: 사용자 이름과 비밀번호를 사용하여 로그인합니다.
- 스프링 시큐리티에서 사용: 이 메소드는 일반적으로 인증을 시작하기 위한 메소드로, HttpServletRequest를 통해 로그인 정보를 처리할 수 있습니다. 스프링 시큐리티에서는 이 메소드를 통해 로그인 절차를 시작할 수 있습니다.
request.login("user", "password"); // 로그인 처리
10. logout()
- 설명: 사용자가 로그아웃할 때 호출됩니다.
- 스프링 시큐리티에서 사용: 스프링 시큐리티에서는 로그아웃을 처리할 때 SecurityContextHolder에 저장된 인증 정보를 삭제하고, 세션을 무효화하여 보안 상태를 관리합니다.
request.logout(); // 로그아웃 처리
11. getRequestURI()
- 설명: 요청된 URI를 반환합니다.
- 스프링 시큐리티에서 사용: URI를 사용하여 요청을 필터링하거나 특정 경로에 대한 보안을 설정할 때 유용합니다.
String uri = request.getRequestURI();
12. getRequestURL()
- 설명: 전체 요청 URL을 반환합니다. 이는 URI와 호스트 정보를 포함한 전체 URL을 제공합니다.
- 스프링 시큐리티에서 사용: 전체 URL을 기반으로 보안 필터나 인증 절차를 설정할 때 유용합니다.
StringBuffer url = request.getRequestURL();
실제 코드에서 HttpServletRequest가 보이지는 않는데,
간접적으로 어떻게 활용되고 있는지 알아보자
1. @RequestParam과 HttpServletRequest
@RequestParam 어노테이션은 클라이언트의 요청 파라미터를 메서드 인자로 바인딩하는데 사용됩니다. 내부적으로는 HttpServletRequest 객체에서 요청 파라미터를 읽는 방식으로 동작합니다.
예시:
@PostMapping("/auth")
public ResponseEntity<Map<String,Object>> login(@RequestParam String email, @RequestParam String password) {
// email과 password는 HttpServletRequest 객체에서 자동으로 가져옴
...
}
2. @RequestBody와 HttpServletRequest
@RequestBody 어노테이션은 요청 본문에 포함된 데이터를 객체로 변환합니다. 내부적으로 Spring은 HttpServletRequest를 사용해 요청 본문을 읽어오고 이를 지정된 객체로 변환합니다.
@PostMapping("/signup")
public ResponseEntity<UserResponse> createUser(@Valid @RequestBody UserRequest userRequest) {
// userRequest는 HttpServletRequest 객체의 요청 본문에서 변환된 데이터
return ResponseEntity.ok(userService.createUser(userRequest));
}
3. @RequestHeader와 HttpServletRequest
@RequestHeader는 요청 헤더를 메서드 인자로 바인딩합니다. 이 또한 HttpServletRequest 객체를 사용하여 헤더 값을 추출하는 방식으로 동작합니다.
예시:
@GetMapping("/users/validate")
public ResponseEntity<UserResponse> validateUser(@RequestHeader("Authorization") String token) {
// Authorization 헤더는 HttpServletRequest 객체에서 가져옴
return ResponseEntity.ok(userService.validateUser(token));
}
스프링 시큐리티와 스프링 부트에서 HttpServletRequest의 다양한 메소드들이 인증(Authentication), 권한 부여(Authorization), 세션 관리 등을 처리하는 데 중요한 역할을 합니다. 특히 사용자의 인증 상태를 유지하고 관리하는 데 필요한 정보를 제공하며, 로그인, 로그아웃, 권한 확인 등의 작업을 필터 체인에서 수행할 수 있도록 도와줍니다.
'Spring and Spring Boot > Class, Annotation, Library' 카테고리의 다른 글
Spring Security Library : SecurityContextHolder Class (0) | 2025.03.16 |
---|---|
Spring Security Library : DispatcherServlet Class (0) | 2025.03.16 |
Library : Mockito에서 제공하는 when ~ then 구문을 활용한 스프링부트 단위 테스트 (0) | 2025.03.04 |
Annotation : HTTP 요청 데이터 바인딩 방법 비교하기 (@RequestBody, @RequestParam, @ModelAttribute) (1) | 2025.02.27 |
Class : HTTP 응답을 표현하는 데 사용되는 클래스 (ResponseEntity, HttpEntity) (0) | 2025.02.27 |