Spring에서 HTTP Request Header 가져오기

Spring MVC에서 HTTP 요청 헤더 값을 가져오는 다양한 방법입니다.

방법 1: @RequestHeader 어노테이션

@RequestMapping("/example")
public String example(@RequestHeader(value="User-Agent") String userAgent) {
    System.out.println("User-Agent: " + userAgent);
    return "example";
}

// 필수가 아닌 경우
@RequestMapping("/example")
public String example(
    @RequestHeader(value="X-Custom-Header", required=false) String customHeader,
    @RequestHeader(value="Accept-Language", defaultValue="ko") String lang) {
    return "example";
}

방법 2: HttpServletRequest 사용

@RequestMapping("/example")
public String example(HttpServletRequest request) {
    String userAgent = request.getHeader("User-Agent");
    String contentType = request.getHeader("Content-Type");
    String authorization = request.getHeader("Authorization");
    
    return "example";
}

방법 3: 모든 헤더 가져오기

@RequestMapping("/example")
public String example(@RequestHeader HttpHeaders headers) {
    // 특정 헤더
    String userAgent = headers.getFirst("User-Agent");
    
    // 모든 헤더 출력
    headers.forEach((key, value) -> {
        System.out.println(key + ": " + value);
    });
    
    return "example";
}

// 또는 Map으로 받기
@RequestMapping("/example")
public String example(@RequestHeader Map headers) {
    headers.forEach((key, value) -> {
        System.out.println(key + ": " + value);
    });
    return "example";
}

방법 4: RequestContextHolder 사용

// Service 레이어에서 사용 가능
public void someMethod() {
    HttpServletRequest request = 
        ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
        .getRequest();
    
    String userAgent = request.getHeader("User-Agent");
}

자주 사용하는 헤더

User-Agent클라이언트 브라우저/앱 정보
Authorization인증 토큰 (Bearer, Basic 등)
Content-Type요청 본문 타입
Accept클라이언트가 원하는 응답 타입
Accept-Language선호 언어
X-Forwarded-For프록시 경유 시 원본 IP
Referer이전 페이지 URL

클라이언트 IP 가져오기

public String getClientIP(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    if (ip == null || ip.isEmpty()) {
        ip = request.getHeader("X-Real-IP");
    }
    if (ip == null || ip.isEmpty()) {
        ip = request.getRemoteAddr();
    }
    return ip;
}