본문 바로가기

대덕공부/Spring

Header && Enumeration

Header란?

> 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루어져 있습니다. 값 앞에 붙은 빈 문자열은 무시

> HTTP헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송을 할 수 있게 한다.

 

General header: 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더.

Request header: 페치 될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더.

Response header위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더.

Entity header: 콘텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더

 

Accpet ?

> 내가 너한테 요청을 보냇는데 니가 답장을할때 반드시 이러한타입으로 보내야한다 라는 의미 

> 우선순위 말해줌

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

>맨앞에있는 mime이 최우선 타입

 

number=23&dummy=asdasdasd
>>query string 형태
>>json으로 가공

>> get방식 querystirng 

 

 

HTTP 헤더

헤더?

저장 되거나 전송되는 데이터 블록의 맨 앞에 위치한 데이터를 가리킵니다.
특정 프로토콜의 헤더의 내용은 특정 프로토콜의 기능을 제공하기 위한 정보를 담고있습니다.
헤더의 뒤에 이어지는 데이터는 페이로드 혹은 바디로 불립니다.

HTTP 헤더의 역할

HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다.

HTTP 헤더의 종류

종단간 헤더(end-to-end)

최종 수신자에게 전달되어야 하는 헤더.
request에 대해서는 서버, response에 대해서는 클라이언트입니다.
중간 프록시는 종단간 헤더를 수정되지 않은 상태로 재전송해야하며, 캐시는 이를 반드시 저장해야합니다.

홉간 헤더(hop-by-hop)

이러한 헤더는 단일 전송-레벨 연결에서만 의미가 있으며 프록시에의해 재전송되거나 캐시되어선 안됩니다. 이러한 헤더들은 다음과 같습니다. Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, TE, Trailer, Transfer-Encoding, Upgrade. 홉간 헤더는 Connection 일반 헤더를 사용해 설정될 수도 있음에 유의해야합니다.

General header

요청 및 응답 메시지 모두에서 사용되지만 컨텐츠 자체에는 적용되지 않는 헤더.
사용되고 있는 Context에 따라 response, request 헤더로 사용됩니다. 그러나 entity헤더는 아닙니다.

가장 흔한 general 헤더는 Date, Cache-Control 및 Connection입니다.

  • Date : 현재시간
  • Pragma : 캐시제어(no-cahce), HTTP/1.0에서 쓰던 것으로 HTTP/1.1에서는 Cache-Control이 쓰인다.
  • Cache-Control : 캐시제어 > **request context**
    • max-age= : 캐시의 유효기간을 명시합니다.
    • max-stale[=] : 만료된 캐시를 응답으로 받아들일지 지정합니다. optional하게 응답이 만료되어서는 안되는 시간을 지정할 수 있습니다.
    • min-fresh= : 클라이언트가 지정 된 시간동안 신선한(문제가 없는) 상태로 유지 될 응답을 원함을 나타냅니다.
    • no-cache : 캐시를 사용하기 전에 재검증합니다.(서버로 요청을 보냄)
    • no-store : 아무것도 캐시하지 않습니다.
    • no-transform : 응답에 대해 변형이나 변환을 허용하지 않습니다.
    • only-if-cached : 무조건 캐시를 사용합니다.
    • response context
    • must-revalidate : 캐시를 사용하기전에 만료 상태를 확인하며, 만료된 것은 절대 사용하지 않습니다.
    • no-cache : 캐시를 사용하기 전에 재검증합니다.(서버로 요청을 보냄)
    • no-store : 아무것도 캐시하지 않습니다.
    • no-transform : 응답에 대해 변형이나 변환을 허용하지 않습니다.
    • public : 응답이 어떤 캐시에 의해서든 캐시된다는 것을 나타냅니다.
    • private : 응답이 단일 사용자를 위한것이며 공유 캐시에 의해 저장되지 않아야 한다는 것을 나타냅니다.
    • proxy-revalidate :must-revalidate와 동일하지만, 공유 캐시에만 적용됩니다.
    • max-age= : 캐시의 유효기간을 명시합니다.
    • s-maxage= : max-age 혹은 Expires 헤더를 재정의하나, 프록시 같은 공유 캐시에만 적용되며 사설 캐시에 의해서는 무시됩니다.
  • Upgrade : 프로토콜을 업그레이드 HTTP/2.0
  • Via : 이용할 프록시의 이름, 프로토콜 버전, 호스트명
  • Connection : 전송이 완료된 후 연결을 유지할지 말지 나타냅니다. HTTP/1.1의 경우 keep-alive가 default입니다.

Request header

HTTP 요청에서 사용되지만 메시지의 컨텐츠와는 관련이 없는 헤더입니다.
Accept, Accept-*, If-*와 같은 request 헤더 들은 조건부 요청 수행을 허용합니다.
Cookie, User-Agent, Referer와 같은 다른 것들은 컨텍스트를 정확히 나타내어 서버가 응답에 맞출 수 있게 합니다.

  • Host : 서버의 도메인명과 서버의 포트를 지정합니다.
  • User-Agent : 클라이언트 정보를 포함합니다(예:브라우저 정보)
  • Referer : 현재 주소로 접근할 수 있었던 이전 주소의 정보를 포함합니다.
  • Accept : 클라이언트가 이해할 수있는 미디어 타입에 대한 정보를 포함합니다.
  • Accept-Charset : 클라이언트가 이해할 수 있는 캐릭터 셋에 대한 정보를 포함합니다.캐릭터 셋과 인코딩 1
    캐릭터 셋과 인코딩 2
  • Accept-Language : 클라이언트가 어떤 언어를 이해할 수 있는지, 그리고 locale중 어떤 것이 선호되는지에 대한 정보를 포함합니다.
  • Accept-Encoding : 클라이언트가 이해 가능한 컨텐츠 인코딩 방법에 대한 정보를 포함합니다.
  • Authorization : 클라이언트의 자격증명을 포함합니다.
  • Origin : fetch를 요청한 원래의 주소의 정보를 포함합니다. 경로 정보는 포함하지 않습니다.
  • Cookie : Set-Cookie헤더와 함께 서버에 의해 이전에 전송되어 저장된 쿠키를 포함합니다.

Response header

HTTP 응답에서 사용될 수 있는 헤더입니다. 역시 컨텐츠와는 관련이 없습니다.
Age, Location, Server와 같은 response 헤더는 더 상세한 응답의 컨텍스트를 제공하기 위해 사용됩니다.

  • Transfer-Encoding : body 내용 자체 압축 방식 지정Transfer-Encoding: chunked
    Transfer-Encoding: compress
    Transfer-Encoding: deflate
    Transfer-Encoding: gzip
    Transfer-Encoding: identity
  • // 어떤 값들은 쉼표로 구분하여 나열될 수 있습니다
    Transfer-Encoding: gzip, chunked
  • Expires : 응답의 유효기간을 설정합니다.응답 내에 max-age 혹은 s-max-age 디렉티브를 지닌 Cache-Control 헤더가 존재할 경우, Expires 헤더는 무시됩니다.
  • Last-Modified : 서버가 알고 있는 가장 마지막 수정 된 날짜와 시각을 표시합니다.
  • ETag : 특정 리소스를 식별하는 식별자. 컨텐츠가 변경되었는지 알 수 있습니다.
  • Set-Cookie : 서버에서 사용자 브라우저에 쿠키를 전송하기 위해 사용됩니다.
  • Location : 리다이렉트 될 주소에 대한 정보를 포함합니다. Status Code가 3xx 혹은 201일 경우에 볼 수 있다.
  • Server : 요청을 처리하는 서버의 소프트웨어 정보를 포함합니다.
  • Age : Max-Age의 시간 내에서 얼마나 흘렀는지에 대한 정보를 포함합니다.
  • WWW-Authenticate : 리소스에 접근하기 위해 사용되어야 하는 메소드에 대한 정보를 포함합니다. 401 Unauthorized 응답과 함께 전송됩니다.

Entity header

메시지 바디의 컨텐츠를 나타내는 헤더입니다.
HTTP Request, Response 모두에서 사용됩니다.

  • Content-Encoding : 미디어 타입을 압축하기 위해서 사용됩니다. 클라이언트는 본문을 압축한 방식을 알 수 있습니다.
  • Content-Encoding: gzip
    Content-Encoding: compress
    Content-Encoding: deflate
    Content-Encoding: identity
    Content-Encoding: br
  • Content-Type : 본문의 미디어 타입을 나타내기위해 사용됩니다.
  • Content-Length : 본문의 길이를 나타냅니다.
  • Content-Language : 본문이 대상으로 하는 언어를 의미합니다.
  • Content-Location : 컨텐츠에 접근할 수 있는 위치를 나타냅니다.
  • Allow : 리소스가 지원하는 메소드의 집합을 의미합니다.

 

<%@page import="java.io.PrintWriter"%>
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <h4>요청 헤더의 종류</h4>
   <table>
      <thead>
         <tr>
            <th>헤더이름</th>
            <th>헤더 값</th>
         </tr>
      </thead>
      <tbody>

         <%
            String pattern = "<tr><td>%s</td><td>%s</td></tr>";
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
               String name = headerNames.nextElement();
               String value = request.getHeader(name);
               out.println(String.format(pattern, name,value));
            }
         %>

      </tbody>
   </table>
   <pre>
   요청 헤더 : 클라이언트와 요청에 대한 부가 정보를 key/value 형태로 표현한 데이터.
</pre>
</body>
</html>

 

Enumeration VS Iterator 

두 개의 인터페이스는 거의 비슷하지만 스레드(thread)의 지원 여부가 다릅니다.

Iterator는 스레드에 안전하지 않는 구조입니다.

스레드에 안전한 구조로 사용하고 싶다면 Enumeration을 사용하면 됩니다.

ArrayList, HashSet 등은 Iterator을 사용하면 되고,

Vector, Hashtable 등은 Enumeration을 사용하면 됩니다.

 

Enumeration 사용이유 

>> 유지보수 등의 유연성을 더 좋게 하기 위해

 

예를 들어 기존에 사용하던 컬렉션의 클래스를 다른 컬렉션의 클래스로 변경하는 경우 지원하는 메서드가 다르면 수정하는 부분이 많아질 수 있다. 하지만 Iterator 인터페이스를 사용한다면 이 부분의 구현부는 굳이 수정할 이유가 없음!

 

>>Iterator는 다음 내용이 있는지 확인하는 hasNext() 메서드와 그 값을 가져오는 next() 메서드가 있습니다. 또한 해당 컬렉션의 값을 삭제할 수 있는 remove() 메서드도 제공

 

>>Enumeration은 다음 내용이 있는지 확인하는 hasMoreElements() 메서드와 그 값을 가져오는 nextElement() 메서드가 있고 컬렉션의 데이터를 삭제하는 기능은 없음

 

https://kutar37.tistory.com/entry/%EC%9E%90%EB%B0%94-Iterator-Enumeration-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

자바 Iterator, Enumeration 인터페이스

자바 Iterator, Enumeration 인터페이스 Iterator는 반복자라는 뜻으로, Iterator 인터페이스는 자료를 얻어내는데 사용한다. 이 자료를 얻어내는 iterator() 메소드는 컬렉션(Collection) 자료형이라면 관계없이

kutar37.tistory.com

 

 

Enumeration<String> em = request.getHeaderNames();

헤더 전체정보 가져오기 

 

hasMoreElements() 

읽어올 요소가 남아있는지 확인. 있으면 true, 없으면 false. Iterator의 hasNext()와 같음

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=west5tomb&logNo=50035152452 

 

hasMoreElements() // nextElement()

hasMoreElements() // nextElement() Enumeration 은 순서를 가지고 있는 배열의 한 종류라고 생각하시...

blog.naver.com

 

 

'대덕공부 > Spring' 카테고리의 다른 글

요청파라미터 전달방식과 사용방법  (0) 2022.06.13
get방식 vs post방식 참고**  (0) 2022.06.08
ImageStreaming  (0) 2022.06.07
Servlet - 생명주기  (0) 2022.06.02
WAS에 서블릿 등록  (0) 2022.06.02