2020-11-26 TIL

2 minute read

favicon.ioc

  • eclipse workspace-.meta-plugins-servercore-tmp-root 아래에 둔다

GET 요청

  • 웹 브라우저에 URL을 입력한 후 엔터를 치면 GET 요청을 보낸다.

  • 웹 페이지에서 링크를 클릭하면(자바스크립트 처리하지 않은 상태) GET 요청을 보낸다.

  • 웹 페이지의 폼(method=’GET’ 일 때)에서 전송 버튼을 클릭하면 GET 요청을 보낸다.

웹브라우저에서 웹서버의 자원을 요청하는 방법

  • 1) 서블릿 클래스를 실행하고 싶을 때

=> 서블릿 클래스의 실제 위치:

톰캣배치폴더/wtpwebapps/eomcs-java-web/WEB-INF/classes/com/eomcs/web/ex04/Servlet01.class

=> 요청:

해당 서블릿을 서버에 등록할 때 사용한 URL을 지정해야 한다.

http://localhost:9999/eomcs-java-web/ex04/s1

  • 2) HTML, CSS, JavaScript, JPEG 등 정적 파일을 받고 싶을 때

=> 정적 파일의 실제 위치:

톰캣배치폴더/wtpwebapps/eomcs-java-web/ex04/test01.html

=> 요청:

http://localhost:9999/eomcs-java-web/ex04/test01.html

  • 3) /WEB-INF/ 폴더에 있는 정적 파일을 받고 싶을 때

=> 정적 파일의 실제 위치:

톰캣배치폴더/wtpwebapps/eomcs-java-web/WEB-INF/ex04/test01.html

=> 요청:

/WEB-INF 폴더 아래에 있는 파일은 클라이언트에서 요청할 수 없다!

웹 애플리케이션의 정보를 두는 폴더로 보안상 중요한 정보가 포함되어 있기 때문에 요청하지 못하도록 막아두었다.

Static resource는 두지 않도록 한다.

url 인코딩/디코딩

  • url에는 특수문자나 공백이 들어갈 수 없기 때문에 입력값을 url을 통해 나타낼 때 특수문자나 공백을 다른 것으로 대체해서 보여주는 것을 말한다.
  • 서버에서 리턴해줄때도 디코딩을 해서 보내준다.
  • a b?c+d / 100 입력시 ?name=a+b%3Fc%2Bd&age=100 라고 나온다.

절대경로 / 상대경로

image-20201130114743669

경로

<form action="s2" method="post"> 
  • root로 시작하는 것은 다 절대 경로이다.
  • 상대 경로를 쓰면 같은 폴더 내에 포함된 것들은 다 경로를 지정해주지 않아도 된다.
  • 서블릿 소스의 애노테이션에서 지정하는 루트는 현재 웹 어플리케이션 루트를 말한다.
    • 웹 어플리케이션 루트 = 컨텍스트 루트
      • @WebServlet(“/ex04/s2”)
      • localhost:9999/bitcamp-web-project/
  • html 루트는 localhost:9999/ 를 말한다.
  • http(프로토콜)://localhost:(서버주소)9999(포트번호)/(서버루트)bitcamp-web-project/(컨텍스트 루트 = 웹 앱 루트)ex04/test02.html(리소스 패스)
    • 리소스는 정적/동적으로 나뉜다.
      • 정적 = static
        • html.gif
      • 동적 = dynamic
        • servlet

image-20201130114831813

실무서버 구성

image-20201130114930148

POST 요청

  • 웹 페이지의 폼(method=’POST’ 일 때)에서 전송 버튼을 클릭하면 POST 요청을 보낸다.

​ 웹 브라우저가 보낸 데이터 읽기

​ => 데이터를 읽을 때는 GET 요청과 POST 요청이 같다.

​ ServletRequest.getParameter(“파라미터이름”)

​ => POST 요청으로 보낸 데이터는 기본으로 영어(ISO-8859-1)라고 간주한다.

​ 그래서 영어 코드를 UCS2(UTF-16) 문자 코드로 변환한다.

​ 예) “ABC가각”을 보낸다고 가정하자.

​ 실제 웹 브라우저가 “ABC가각” 문자열을 보낼 때 다음과 같이 UTF-8 코드를 보낸다.

​ 41 42 43 EA B0 80 EA B0 81

​ 그런데 서블릿에서는 이 코드 값을 ISO-8859-1 코드라고 간주한다.

​ 그래서 getParameter()를 호출하여 값을 꺼내면

​ 위의 코드를 UTF-16으로 바꿔서 리턴한다.

​ 즉 각 바이트에 그냥 00을 붙여 문자열을 만든 후 리턴한다.

​ 왜? 영어(ISO-8859-1)를 2바이트 유니코드로 바꿀 때 그냥 앞에 00 1바이트를 붙이면 되기 때문이다.

​ 위의 코드를 UTF-16으로 바꾸면 다음과 같다.

​ 0041 0042 0043 00EA 00B0 0080 00EA 00B0 0081

​ 이렇게 변환된 코드를 화면에 출력하면 다음 폰트로 보인다.

​ ABC가각

​ 클라이언트가 보낸 한글을 읽을 때 깨지는 문제 해결?

​ => 원리

​ getParameter()를 최초로 호출하기 전에 먼저

​ 클라이언트 보낸 데이터의 인코딩 형식이 어떤 문자표로 되어 있는지 알려줘야 한다.

​ => 주의!

​ 반드시 getParamter()를 최초로 호출하기 전이어야 한다.

​ 한 번 getParameter()를 호출한 후에는 소용없다.

get과 post의 차이

  • 겟 방식은 url 영역을 사용

    • 리퀘스트url에 보내기 때문에 바이너리 데이터를 보낼 수 없다.
    • 주소 자체를 캐쉬(내부적으로 히스토리)에 보관하기 때문에 url에 포함된다면 중요한 정보가 캐쉬되기 때문에 노출될 수도 있다.
  • 포스트 방식은 메시지 바디 영역을 사용

    • 그렇기 때문에 바이너리 데이터를 보낼 수 있다.
    • 데이터의 한계가 정해져있지 않다.
    • 데이터의 내용이 노출되지 않기 때문에 보안이 더 좋다.

정적 자원과 동적 자원 서비스

  • 웹브라우저 -(요청)-> 웹 서버 -(요청)-> 서블릿 컨테이너
    • 웹 서버 + 서블릿 컨테이너 = 톰캣서버
  • 정적 자원을 웹 브라우저로 요청했을 때 웹 브라우저의 요청을 받아 웹 서버가 정적 리소스를 읽어서 리턴해준다.
  • 다이나믹 자원(서블릿, 실행하는 자원)을 웹 브라우저를 통해 요청받으면 웹 서버는 그 요청을 서블릿 컨테이너로 넘겨서 서블릿 컨테이너가 서블릿을 읽어 리턴해준다.
  • <action =”s2”> 를 했을 때
    • 웹 서버가 먼저 localhost:9999/bitcamp-web-project/ex04/ 에서 s2가 있는지 찾아보고
    • 없으면 서블릿 컨테이너로 위임한다.

한글 깨짐 문제 처리

image-20201130114944135

  • Request.getParameter()를 실행하기 전에 UTF-8

webapp을 서버에 이미 배포한 이후에 만들었을 때

  • 설정 파일에 webapp이 포함되어 있지 않기 때문에 gradle eclipse를 실행해서 설정 파일에 webapp을 등록해줘야 한다.
  • 이후에 배포하면 된다.

Categories:

Updated: