ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CS] JSP HTTP URL
    Computer Science/CS 2024. 4. 8. 16:07
    728x90

    지금은 많이 사용하지 않는 JSP는 무엇일까?

    사용하지 않는데 왜 알아야할까?

    HTTP동작 방식, 웹의 역사를 알기 위해서는 알아야 한다.

     

    JSP를 이해하기 위해 필요한 기술들이 있다.

    URL, HTTP에 대해 알아보자

     

    URL

    Uniform Resource Locator

    http://www.naver.co.kr/html/category/1.html?xzone=ctgr1^html

    구성 요소

    ● 프로토콜 : http

                         웹 브라우저가 서버와 내용을 주고받을 때 사용할 규칙 이름

    ● 서버 이름 : www.naver.co.kr  

                         서버 이름, 도메인 이름 or IP주소

    ● 경로 : /html/category/1.html

                 웹 페이지의 상세 주소, 웹 페이지마다 다른 주소를 갖음.

    ● 쿼리 문자열 : ?xzone=ctgr1^html

                              추가로 서버에 보내는 데이터, 쿼리 문자열을 이용해서 검색어를 전달함

     

    정적 자원과 동적 자원

    ● 정적 페이지(static, 정적 자원)

       웹 브라우저는 늘 같은 응답 데이터를 받으므로 동일한 화면을 출력한다. 고정된 결과가 출력

       이미지 파일, HTML파일

    ● 동적 페이지(dynamic, 동적 자원)

       URL을 입력한 시점에 따라 다른 내용이 웹 브라우저에 표시된다.

       사용자들마다 다른 페이지가 보여질 수 있다.

       JSP, PHP, ASP.net

     

    WAS

    Web Application Server

    웹 브라우저로부터 요청이 오면 알맞은 프로그램을 찾아 실행하고, 프로그램이 실행 결과를 응답으로 전송한다.

     

    HTTP

    Hyper Text Markup Language

    웹 서버는 URL에 해당하는 HTML문서를 전송하는데, HTML문서를 받는 웹 브라우저는 정해진 규칙에 따라 HTML문서를 분석해서 알맞은 화면을 생성한다.

    ● 렌더링 : HTML표준에 따라 HTML문서로부터 알맞은 화면을 생성하는 과정

     

      GET, POST

    웹 브라우저는 GET, POST 두 가지 방식 중 한 가지를 이용해 파라미터를 전송한다.

     

    둘의 차이점은 "전송 방식"이다.

      GET

    요청 URL에 파라미터를 붙여서 전송 -> URL의 쿼리 문자열로 전송!

    URL의 경로 뒤에 물음표(?)와 함께 파라미터를 붙여 전송 = 쿼리 문자열(query string)

    각각의 파라미터는 앰퍼샌드(&)기호로 구분

    파라미터의 이름과 값은 등호기호(=)로 구분

    웹 브러우저, 웹 서버, 웹 컨테이너에 따라 전송할 수 있는 파라미터 값의 길이 제한이 있을 수 있다.

     

     POST

    데이터 영역을 이용해 파라미터를 전송 -> 웹 브라우저나 웹 서버 등에 상관없이 전송할 수 있고, 파라미터 길이  제한 없음.

     

    ● Header, Body

    HTTP메시지는 헤더+바디로 이루어진다.

    https://docs.trafficserver.apache.org/

    HTTP Header

    헤더는 크게 request와 response헤더로 나뉘어진다.

    https://docs.trafficserver.apache.org/

    1. General Header(일반 헤더)

       요청/응답이 생성된 날짜 및 시간 등과 같은 HTTP통신에 대한 일반적인 정보

       전송되는 HTTP본문 컨텐츠와 관련 X

       Date, Connection, Cache-Control

     

    2. Request / Response Header ( 요청/ 응답 헤더)

       요청 헤더는 요청한 URL, 메소드(GET, POST, HEAD), 요청 생성에 사용된 브라우저 및 기타 정보를 포함

       응답 헤더는 컨턴츠에 사용된 인코딩, 서버 시스템에서 응답을 생성하는 데 사용되는 서버 소프트웨어 및 기타 정보를 포함

       요청 : Host, User-Agent, Accept, Cookie, Origin, Authorization, 

       응답 : Server, Allow, Content-Disposition,  

    3. Entity Header ( 엔티티 헤더)

        실제 메시지 또는 전송중인 HTTP본문에 대한 정보

        컨텐츠 길이, 컨텐츠 언어, 인코딩, 만료 날짜 및 기타 중요한 정보

        Content-Length, Content-Type, Content-Language, Content-Encoding


    공통 헤더(요청/응답)

    Date

    HTTP메시지가 만들어진 날짜와 시간으로 자동으로 만들어진다.

    General-Header: Data: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    // Date: Wed, 21 Oct 2015 07:28:00 GMT

     

    connection

    현재의 전송이 완료된 후 네트워크 접속 유지 유무를 제어

    1. keep-alive : 지속 연결

    2. close : 연결 종료

    Connection: keep-alive
    Connection: close

     

    Cache-Control

    캐싱 허용 여부

    1. no-store : 캐시를 저장하지 않음

    2. no-cache : 모든 캐시를 쓰기 전에 서버에 해당 캐시를 사용해도 되는지 확인

    3. must-revalidate : 만료된 캐시만 서버에 확인

    4. public : 공유 캐시에 저장 가능

    5. private : '브라우저'같은 특정 사용자 환경에만 저장

    6. max-age : 캐시의 유효시간을 명시

    Cache-Control : max-age=0

    HTTP Request Header

    GET

    - Host : 서버와 도메인 네임

    - User-Agent : 현재 사용자가 어떤 클라이언트(운영체제, 앱, 브라우저)를 통해 요청을 보냈는지 알 수 있다.

    - Accept : 클라이언트가 허용할 수 있는 파일 형식 (MIME Type)

    - Cookie : 웹 서버가 클라이언트에 쿠키를 저장해 놓았다면 해당 쿠키의 정보를 이름-값 쌍으로 웹 서버에 전송

    - Origin : 요청이 어느 주소에서 시작되었는지 나타냄, 보낸 주소와 받는 주소가 다르면 CORS문제 발생

    - Authorization : 인증 토큰을 서버로 보낼 때 사용

     

    POST

    - Content-Type : 받는 측에서 데이터 처리 타입

                              기본 값 : "text/html"

                              한국어 포함하고 있는 charset = UTF-8(EUC-KR)

     

    Content-Type 

    JSP가 생성할 문서의 MIME타입 입력

    ( HTTP에서 Content-Type은 MIME표준에 정의된 것을 사용)

    데이터를 받는 측에서 데이터를 어떤 타입으로 처리할지 정한다. (데이터 받는 측 : Request, Response둘다)

     

    Content-Type Header가 없다면

    특정 data(img, 비디오 등)를 Content-Type없이 보내면 data를 받는 측에서 단순 텍스트 데이터로 받는다.

     

    HTTP GET메소드는 value=text형식으로 보내기 때문에 Content-Type은 필요없다.

    HTTP메소드에 POST, PUT처럼 Body에 data를 보낼때 Content-Type이 필요하다.

    axios를 사용해 클라이언트가 서버에서 API요청 시 Content-Type을 application/json으로 지정한다.

     

    문법

    - type / subtype

    /로 구분되며 type은 카테고리, subtype은 개별 혹은 멀티파트 타입을 나타낸다.

    ex) 이미지 데이터일 경우, Content-Type의 type은 image가 된다.

    image에서도 png, jpg, gif 등 다양한 확장자가 있으며, subtype에 image 확장자를 나타낸다.

    -> image/png

     

    종류

    - 이진 파일의 기본 타입

       브라우저에서 자동으로 실행하거나 실행하지 않을지 여부

    Content-Type : application/actet-stream

     

    - 문자

    Context-Type:text/plain

     

    - 이미지

    브라우저는 해당 컨텐츠를 이미지로 취급

    Content-Type:image/png

    Content-Type:image/jpeg

    Content-Type:image/gif

    Content-Type:image/webp

     

    - 자바스크립트

    Content-Type:text/javascript

     

    -멀티파트

    Content-Type: multipart/form-data

    <form>태그를 사용해 브라우저에서 서버로 전송할 때 사용

    Content-Disposition과 Content-Type은 HTTP표준이지만 일부 구형 브라우저에서는 다르게 동작할 수 있다.

     

     

    MIME (마임)

    Multipurpose Internet Mail Extensions

    전자 우편을 위한 인터넷 표준 포맷.

    전자우편은 7비트 ASCII문자를 사용하여 전송되기 때문에, 8비트 이상의 코드를 사용하는 문자나 바이너리 파일들을 MIME포맷으로 변환되어 SMTP로 전송된다.

    실질적으로 SMTP로 전송되는 대부분의 전자 우편은 MIME형식이다.

    MIME표준에 정의된 Content types은 HTTP와 같은 통신 프로토콜에서 사용되며, 점차 그 중요성이 커지고 있다.

     

     

     

    HTTP Response Header

    - Server : 웹서버의 정보를 나타냄

    - Allow : 특정 메서드만 허용, 다른 요청이 들어오면 405 Method Not Allowed 에러를 리턴

    - Content-Disposition : 응답 본문을 브라우저가 어떻게 표시해야 할지 알림

     

    HTTP Entity Header

    - Content-Length : 바이트 단위를 가지는 헤더+바디의 크기

    - Content-Type : 개체의 미디어 타입(MIME)과 문자열 인코딩(UTF-8)을 지정하기 위해 사용

    - Content-Language : 사용자들이 언어를 설명하기 위해 사용

    - Content-Encoding : 미디어 타입을 압축하기 위해 사용


    정리

    공통 헤더

    Date : 현재시간 (Tue, 20 Apr 2021 GMT)

    Pragma : 캐시제어 (no-cache), HTTP/1.0에서 쓰던 것으로 HTTP/1.1에서는 Cache-Control이 쓰인다.

    Cache-Control : 캐시 제어

    + no-store : 캐시를 저장하지 않겠다.

    + no-cache : 모든 캐시를 쓰기 전에 서버에 해당 캐시를 사용해도 되는지 확인하겠다.

    + must-revalidate : 만료된 캐시만 서버에 확인하겠다.

    + public : 공유 캐시에 저장해도 된다.

    + private : '브라우저' 같은 특정 사용자 환경에만 저장하겠다.

    + max-age : 캐시의 유효시간을 명시하겠다.

    Transfer-Encoding : body 내용 자체 압축 방식 지정

    'chunked'면 본문의 내용이 동적으로 생성되어 길이를 모르기 때문에 나눠서 보낸다는 의미다.

    본문에 데이터 길이가 나와서 야금야금 브라우저가 해석해서 화면에 뿌려줄 때 이 기능을 사용한다.

    Upgrade : 프로토콜 변경시 사용 ex) HTTP/2.0

    Via : 중계(프록시)서버의 이름, 버전, 호스트명

    Content-Encoding : 본문의 리소스 압축 방식 (transfer-encoding은 body 자체이므로 다름)

    Content-type : 본문의 미디어 타입(MIME) ex) application/json, text/html

    Content-Length : 본문의 길이

    Content-language : 본문을 이해하는데 가장 적절한 언어 ex) ko

    한국사이트여도 본문을 이해하는데 영어가 제일 적절하면 영어로 지정된다.

    Expires : 자원의 만료 일자

    Allow : 사용이 가능한 HTTP 메소드 방식 ex) GET, HEAD, POST

    Last-Modified : 최근에 수정된 날짜

    ETag : 캐시 업데이트 정보를 위한 임의의 식별 숫자

    Connection : 클라이언트와 서버의 연결 방식 설정 HTTP/1.1은 kepp-alive 로 연결 유지하는게 디폴트.

     

    요청 헤더

    Host : 요청하려는 서버 호스트 이름과 포트번호

    User-agent : 클라이언트 프로그램 정보 ex) Mozilla/4.0, Windows NT5.1

    이 정보를 통해서 서버는 클라이언트 프로그램(브라우저)에 맞는 최적의 데이터를 보내줄 수 있다.

    Referer : 바로 직전에 머물렀던 웹 링크 주소(해당 요청을 할 수 있게된 페이지)

    Accept : 클라이언트가 처리 가능한 미디어 타입 종류 나열 ex) */* - 모든 타입 처리 가능, application/json - json데이터 처리 가능.

    Accept-charset : 클라이언트가 지원가능한 문자열 인코딩 방식

    Accept-language : 클라이언트가 지원가능한 언어 나열

    Accept-encoding : 클라이언트가 해석가능한 압축 방식 지정 ex) gzip, deflate

    압축이 되어있다면 content-length와 content-encoding으로 압축을 해제한다.

    Content-location : 해당 개체의 실제 위치

    Content-disposition : 응답 메세지를 브라우저가 어떻게 처리할지 알려줌. ex) inline, attachment; filename='jeong-pro.xlsx'

    Content-Security-Policy : 다른 외부 파일을 불러오는 경우 차단할 리소스와 불러올 리소스 명시

    ex) default-src https -> https로만 파일을 가져옴

    ex) default-src 'self' -> 자기 도메인에서만 가져옴

    ex) default-src 'none' -> 외부파일은 가져올 수 없음

    If-Modified-Since : 여기에 쓰여진 시간 이후로 변경된 리소스 취득. 페이지가 수정되었으면 최신 페이지로 교체하기 위해 사용된다.

    Authorization : 인증 토큰을 서버로 보낼 때 쓰이는 헤더

    Origin : 서버로 Post 요청을 보낼 때 요청이 어느 주소에서 시작되었는지 나타내는 값

    이 값으로 요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 난다.

    Cookie : 쿠기 값 key-value로 표현된다. ex) attr1=value1; attr2=value2

     

     

    응답 헤더

    Location : 301, 302 상태코드일 떄만 볼 수 있는 헤더로 서버의 응답이 다른 곳에 있다고 알려주면서 해당 위치(URI)를 지정한다.

    Server : 웹서버의 종류 ex) nginx

    Age : max-age 시간내에서 얼마나 흘렀는지 초 단위로 알려주는 값

    Referrer-policy : 서버 referrer 정책을 알려주는 값 ex) origin, no-referrer, unsafe-url

    WWW-Authenticate : 사용자 인증이 필요한 자원을 요구할 시, 서버가 제공하는 인증 방식

    Proxy-Authenticate : 요청한 서버가 프록시 서버인 경우 유저 인증을 위한 값

     


    HTTP Body

    요청에 대한 실제 메시지를 전송

     

    Java Server Pages

    동적 페이지를 작성하는데 사용되는 자바의 표준 기술로서 응답(HTML, JSON XML, 바이너리 파일 등)을 생성해서 필요한 기능을 제공

    JSP를 이용해서 만든 프로그램을 실행하려면 톰캣, 제티(Jetty)같은 서버 프로그램이 필요하다.

    ● JSP는 서블릿을 기반으로 동작한다.

    ● JSP파일은 webapps폴더 하위에 위치 시켜야 한다.

     

    ● 기본 객체(Implict object)

        ▷ Request : 요청 파라미터 읽어오기

         Response : 응답 결과 전송하기

        ▷ session : 세션 처리하기

         application : 웹 어플리케이션 정보 읽어오기

         page등

     

    Request 기본 객체

    웹 브라우저 요청

    웹 브라우저에 웹 사이트 주소를 입력하면, 웹 브라우저는 해당 웹 서버에 연결한 후 요청 정보를 전송하는데, 이 요청 정보를 제공하는 것이 request기본 객체이다.

    클라이언트가 서버로 전달하는 메시지

     

    ● request기본 객체가 제공하는 기능

         웹 브라우저와 관련된 정보 읽기

         서버와 관련된 정보 읽기

         클라이언트가 전송한 요청 파라미터 읽기

         클라이언트가 전송한 요청 헤더 읽기

         클라이언트가 전송한 쿠키 읽기

         속성 처리 기능

     

    ● request기본 객체의 요청 파라미터

    request기본 객체는 웹 브라우저가 전송한 파라미터를 읽어올 수 있는 메서드를 제공하고 있다.

    request.getParameter(), request.getParameterValues(), request.getParameterNames(), request.getParameterMap()

    -> request에서 제공하는 함수임을 알 수 있다.

     

     

    Response 기본 객체

    웹 브라우저에 보내는 응답 정보를 담는다.

    요청에 대한 서버의 응답

     

    상태를 기억하는 방법

    상태를 기억하는 방법으로 쿠키, 세션, 토큰이 있다.

    그렇다면 쿠키는 왜 필요할까? 왜 생겨나게 되었을까?

    인터넷을 이용하기 위해 사용되는 기술인 HTTP를 알면 쿠키가 왜 사용되고, 필요한지 알 수 있다.

     

    [CS] HTTP HTTP/2 HTTPS QUIC

    HTTP Hypertext Transfer Protocol 클라이언트와 서버 간 통신을 위한 통신 규칙 세트 또는 프로토콜입니다. 사용자가 웹 사이트를 방문하면 사용자 브라우저가 웹 서버에 HTTP 요청을 전송하고 웹 서버는

    code-space.tistory.com

    HTTP는 인터넷에서 데이터를 주고받는데 사용되는 프로토콜 중 하나이다.

    HTTP의 특성으로 서버가 클라이언트를 식별할 수 없는 Stateless(무상태)가 있다. 

    클라이언트의 상태를 모른다는 것이다.

     

    쿠키

    쿠키는 웹 브라우저가 보관하는 데이터이다.

    웹 서버에서 요청을 보냈을 때 헤더에 담아서 전송한다.

    웹 브라우저는 쿠키가 삭제되기 전까지 웹 서버에 쿠키를 전송한다.

     

    장점

    - 클라이언트의 일정 폴더에 정보를 저장하기 때문에 서버의 부하를 줄일 수 있다.

     

    단점

    - 정보가 사용자 컴퓨터(로컬)에 저장되기 때문에 보안에 위협받을 수 있다.

    - 데이터 저장 용량에 한계가 있다.

    - 일반 사용자가 브라우저 내의 기능인 "쿠키 차단"을 사용했을 때 쿠키를 사용할 수 없다.

     

    동작 방식

    1. 쿠키 생성

    웹 서버에서 쿠키를 생성하고 쿠키에 응답 데이터를 담아서 웹 브라우저에 전송한다.

    2. 쿠키 저장

    웹 브라우저는 응답 데이터를 담고 있는 쿠키를 메모리나 파일로 저장한다.

    3. 쿠키 전송

    웹 브라우저는 쿠키 요청이 있을 때마다 웹 서버에 전송한다.

     

    쿠키 생성 및 사용 방식

    (1) 서버에서 쿠키 생성 후 response객체에 담아 클라이언트에 전송한다.

    Cookie cookie = new Cookie("cookieName", "value1"); //쿠키 생성
    cookie.setValue("value2"); //쿠키 값 재설정
    cookie.setMaxAge(60*2);    //쿠키 유지 시간 설정(초단위)
    response.addCookie(cookie) // 쿠키를 클라이언트로 전송
    • 쿠키 클래스를 이용해서 (key-value)쌍인 쿠키 객체를 생성합니다.
    • setMaxAge로 초단위의 쿠키 유지 시간을 설정할 수 있다.
    • setValue()메소드로 쿠키의 값을 재설정할 수 있다.

    (2) 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관한다.

     

    (3) 웹 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹 서버에 전송한다.

    String cookieCheck = request.getHeader("Cookie");
    if(cookieCheck != null) {
    	Cookie[] cookies = request.getCookies();
        for(Cookie cookie : cookies) {
        	cookie.getName(); // key 값 
            cookie.getValue(); // value 값
        }
    }

    request에 Cookie헤더를 담아서 보낸다.

     

    쿠키는 Set-Cookie헤더를 통해서 전달된다.

     

    세션

    서버는 세션을 사용해서 클라이언트 상태를 유지할 수 있음

     

    세션은 웹 컨테이너에 정보를 저장

    한 브라우저마다 한 세션 생성

    -> 웹 브라우저마다 세션이 따르 존재하기 때문에, 세션은 웹 브라우저와 관련된 정보를 저장하기 알맞은 장소

     

    세션 생성

    두 가지 방법이 있다.

    (1) page디렉티브의 session속성 값을 true로 설정

     <%@ page session = “true” %>

    <%@ page session = "true" %>
    <%= session.getId() %>  // 세션 ID 구함
    <% 	session.getCreateTime();    // 세션이 생성된 시간을 구함. 1970년 1월 1일 이후, 나노초
    	session.getLastAccessedTime(); // 웹 브라우저가 가장 마지막에 세션에 접근한 시간
    %>
    <%	session.setAttribute("MEMBERID", "ID");  // 세션에 값을 저장
        session.setAttribute("NAME","SEO"); 
    %>
    <%	String name = (String)session.getAttribute("ID"); //속성값 읽기
    %>

    최초 요청시 세션 생성 됨, 이후로는 이미 생성된 세션 사용

    session 기본객체도 request기본 객체와 마찬가지로 setAttribute(), getAttribute() 속성을 제공한다.

     

    웹 서버는 웹 브라우저에 세션 ID를 전송

    웹 브라우저는 웹 서버에 연결할 때마다 매번 세션ID를 보내서 웹서버를 어떤 세션을 사용할지 판단할 수 있게 한다.

    웹 브라우저는 세션ID만 가지고 있음

    → 웹 서버는 세션 ID를 이용해서 웹 브라우저를 위한 세션을 찾는다!

    → 세션ID를 공유하기 위해 쿠키를 사용!

    → JSESSIONID 쿠기가 세션 ID를 사용할 때 사용하는 쿠키!

       

    (2) request.getSession()을 이용한 세션 생성

    <% HttpSession HttpSession = request.getSession(); %>

    page디렉티브의 session속성값은 false로 지정한다.

    <%@ page session = "false" %>
    <% 
       HttpSession httpSession = request.getSession();  //session구하기
       List list = (List)httpSession.getAttribute("list");
       list.add(productId); 
     %>

     

     

     

    참고

    최범균의 JSP 2.3 웹 프로그래밍 : 기초부터 중급까지

    https://blog.naver.com/hj_kim97/222316679843

    https://victorydntmd.tistory.com/286

     

     

     

    728x90

    'Computer Science > CS' 카테고리의 다른 글

    [CS] Load balancing  (0) 2024.04.10
    [CS] Proxy Pattern  (0) 2024.04.09
    [CS] polling push pull  (0) 2024.04.02
    [CS] Design Pattern  (0) 2024.03.20
    [CS] 해시 충돌, Chaining, Open Addressing  (0) 2024.03.20

    댓글

© 2022. code-space ALL RIGHTS RESERVED.