본문 바로가기
Spring/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

HttpServletRequest로 HTTP 요청 메시지 조회하기

by hk27 2022. 1. 18.
HTTP 요청 메시지는 어떻게 조회할까요?

 

안녕하세요.

오늘은 HttpServletReqest로 HTTP 요청 메시지를 조회해보겠습니다.

 

HTTP 요청 메시지

먼저 HTTP 요청 메시지의 구조를 알아봅시다[1].

 

HTTP 메시지의 전체적인 구조는 시작 라인, 헤더, 공백 라인, 메시지 바디로 구성되어 있습니다. 

참고로 HTTP 메시지는 HTTP 요청 메시지, HTTP 응답 메시지로 구분할 수 있습니다.

이번 시간에는 HTTP 요청 메시지에 초점을 두고 알아보겠습니다.

 

시작 라인, 헤더, 공백 라인, 메시지 바디가 무엇인지 하나씩 알아봅시다.

 

1. 시작 라인

시작 라인은 HTTP 메서드(GET, PUT, POST)와 요청 대상(절대경로), HTTP 버전이 들어갑니다[2].

아래 사진은 HTTP 요청 메시지의 예입니다[3]. 

첫 번째 줄이 시작 라인입니다. HTTP Method가 무엇인지, 요청 대상이 무엇인지, HTTP 버전은 무엇인지 확인할 수 있습니다.

혹은 아래 사진처럼 쿼리파라미터가 들어갈 수 있습니다. '/search?q=hello&hl=ko'가 모두 요청 대상입니다. 

 

2. HTTP 헤더

HTTP 헤더는 HTTP 전송에 필요한 모든 부가정보입니다.

메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 등등이 포함됩니다.

아래 사진은 HTTP 메시지의 예시인데, 헤더 부분의 내용이 많은 것을 볼 수 있습니다. 

3. 공백 라인

공백 라인은 헤더가 종료되었음을 알리기 위해 넣는 공백 한 줄입니다.

 

4. 메시지 바디

메시지 바디에는 실제 전송할 데이터가 담깁니다.

HTML문서, json 등등이 전송됩니다. 

메시지 바디에 보낼 정보가 없다면, 바디가 비어있을 수 있습니다. 

 

 

HttpServletRequest로 HTTP 요청 메시지 조회하기

다음으로 HttpServletRequest 객체를 사용해서 HTTP 요청 메시지를 조회해 봅시다.

이번 게시글에는 시작 라인, 헤더 부분을 중심으로 조회하고, 다음 게시글에서 데이터를 조회해 보겠습니다.

요청 데이터 조회는 https://passionate.tistory.com/35를 참고해주세요! 

 

서블릿 클래스를 만들었습니다. print 하는 메소드를 만들어서 요청 메시지를 출력하였습니다. 

// http://localhost:8080/request-header?username=hello
@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        printStartLine(request);
        printHeaders(request);
        printHeaderUtils(request);
        response.getWriter().write("ok");
    }
}

 

1. 시작 라인 정보

    //start line 정보
    private void printStartLine(HttpServletRequest request) {
        System.out.println("--- REQUEST-LINE - start ---");
        System.out.println("request.getMethod() = " + request.getMethod()); //GET
        System.out.println("request.getProtocol() = " + request.getProtocol()); //HTTP/1.1
        System.out.println("request.getScheme() = " + request.getScheme()); //http
        System.out.println("request.getRequestURL() = " + request.getRequestURL()); // http://localhost:8080/request-header
        System.out.println("request.getRequestURI() = " + request.getRequestURI()); // /request-test
        System.out.println("request.getQueryString() = " + request.getQueryString()); //username=hi
        System.out.println("request.isSecure() = " + request.isSecure()); //https 사용 유무
        System.out.println("--- REQUEST-LINE - end ---");
        System.out.println();
    }

 

출력 결과

--- REQUEST-LINE - start ---
request.getMethod() = GET
request.getProtocol() = HTTP/1.1
request.getScheme() = http
request.getRequestURL() = http://localhost:8080/request-header
request.getRequestURI() = /request-header
request.getQueryString() = username=hello
request.isSecure() = false
--- REQUEST-LINE - end ---

 

시작 라인 조회 정리

결과 예시는 'http://localhost:8080/request-header?username=hello'를 입력했을 때의 결과입니다. 

기능은 https://tnsgud.tistory.com/656을 참고하였습니다. 

메소드 기능 결과 예시
getMethod() HTTP 메소드 GET
getProtocol()  프로포콜의 이름 버전 HTTP/1.1
getScheme()  스키마(http, https) http
getRequestURL() 호출된 전체 주소
쿼리 파라미터를 포함하지 않음
http://localhost:8080/request-header
getRequestURI()  도메인 이후 하부 주소
쿼리 파라미터를 포함하지 않음
 /request-header
getQueryString() '?' 이후의 쿼리 스트링 username=hello
isSecure() https인지 확인
http면 false, https이면 true 반환
false

 

2. 헤더 정보

헤더의 모든 정보를 출력하는 코드입니다. 

    //Header 모든 정보
    private void printHeaders(HttpServletRequest request) {
        System.out.println("--- Headers - start ---");
        request.getHeaderNames().asIterator()
                .forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
        System.out.println("--- Headers - end ---");
        System.out.println();
    }

 

출력 결과

--- Headers - start ---
host: localhost:8080
connection: keep-alive
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
--- Headers - end ---

헤더 결과 정리는 아래 3번까지 하고 한 번에 하겠습니다. 

 

3. Header 편리한 조회

모든 헤더를 출력하면 중요하지 않은 내용도 나와서, 필요한 내용만 조회해보겠습니다.

   //Header 편리한 조회
    private void printHeaderUtils(HttpServletRequest request) {
        System.out.println("--- Header 편의 조회 start ---");
        System.out.println("[Host 편의 조회]");
        System.out.println("request.getServerName() = " + request.getServerName()); //Host 헤더
        System.out.println("request.getServerPort() = " + request.getServerPort()); //Host 헤더
        System.out.println();
        System.out.println("[Accept-Language 편의 조회]");
        request.getLocales().asIterator()
                .forEachRemaining(locale -> System.out.println("locale = " + locale));
        System.out.println("request.getLocale() = " + request.getLocale());
        System.out.println();
        System.out.println("[cookie 편의 조회]");
        if (request.getCookies() != null) {
            for (Cookie cookie : request.getCookies()) {
                System.out.println(cookie.getName() + ": " + cookie.getValue());
            }
        }
        System.out.println();
        System.out.println("[Content 편의 조회]");
        System.out.println("request.getContentType() = " + request.getContentType());
        System.out.println("request.getContentLength() = " + request.getContentLength());
        System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
        System.out.println("--- Header 편의 조회 end ---");
        System.out.println();
    }

 

출력 결과

--- Header 편의 조회 start ---
[Host 편의 조회]
request.getServerName() = localhost
request.getServerPort() = 8080

[Accept-Language 편의 조회]
locale = ko_KR
locale = ko
locale = en_US
locale = en
request.getLocale() = ko_KR

[cookie 편의 조회]

[Content 편의 조회]
request.getContentType() = null
request.getContentLength() = -1
request.getCharacterEncoding() = UTF-8
--- Header 편의 조회 end ---

 

헤더 조회 정리

결과 예시는 'http://localhost:8080/request-header?username=hello'를 입력했을 때의 결과입니다. 

쿠키와 데이터 바디의 내용이 없음에 유의해주세요!

메소드 기능 결과 예시
getServerName() 서버 이름(":" 이전 부분 or 도메인) localhost
getServerPort() 포트 번호 8080
getLocales() 지역 정보 java.util.Collections$3@cd55dc0
getLocale() 우선순위가 가장 높은 지역 정보 ko_KR
getCookies() 쿠키  
getContentType() 데이터 바디의 타입 null
getContentLength() 데이터 바디 길이 -1
getCharacterEncoding() 데이터 바디 인코딩 정보 UTF-8

 

 

 

지금까지 HttpServletReqest로 요청 메시지를 조회하는 방법을 알아보았습니다. 

다음 게시글에서는 HTTP 요청 메시지의 데이터를 조회하는 방법을 알아보겠습니다.

 

 

 

인프런  '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 듣고 공부하며 정리한 자료입니다. 

잘못된 부분은 피드백 주시면 감사하겠습니다. 

글 읽어주셔서 감사합니다 :-)

 

[0] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술, 섹션 2. 서블릿 https://www.inflearn.com/course/스프링-mvc-1

[1]모든 개발자를 위한 HTTP 웹 기본 지식, https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC

[2] https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

[3] https://velog.io/@gparkkii/HTTPMessage

 

 

 

 

댓글