본문 바로가기

보안/보안기본

웹 해킹 이해를 위한 웹 이해

반응형

Servlet

웹 기반의 요청에 대한 동적인 처리가 가능한 하나의 클래스이다.

Server Side에서 돌아가는 Java Program
개발자가 작성해야 하는 부분

클라이언트의 요청이 들어오면 WAS는 해당 요청에 맞는 Servlet이 메모리에 있는지 확인
  ↳ if. 메모리에 X, 해당 Servlet Class를 메모리에 올린 후(Servlet 객체 생성) init 메서드 실행 → service 메서드를 실행 

  ↳ else if. 메모리에 O, 바로 service 메서드 실행



init()
한 번만 수행된다.
클라이언트(browser)의 요청에 따라 적절한 Servlet이 생성되고 이 Servlet이 메모리에 로드될 때 init() 메서드가 호출
역할 : Servlet 객체를 초기화


service(request, response)
 - 응답에 대한 모든 내용은 service() 메서드에 구현해야 한다.
 - Servlet이 수신한 모든 request에 대해 service() 메서드가 호출
 - HttpServlet을 상속받은 Servlet 클래스(이하 하위 클래스)에서 service() 메서드를 오버라이드하지 않았다면, 

   그 부모인 HttpServlet의 service()가 호출된다.
 - HttpServlet의 service() 메서드는 템플릿 메서드 패턴으로 구현되어 있다.
 - service() 메서드는 request의 type(HTTP Method: GET, POST, PUT, DELETE 등)에 따라 적절한 메서드

   (doGet, doPost, doPut, doDelete 등)를 호출한다.

   즉, 하위 클래스에서 doGet, doPost 등의 메서드를 오버라이드해두면 HttpServlet의 service() 메서드가 요청에 맞는

   메서드(하위 클래스에서 오버라이드한 메서드)를 알아서 호출할 수 있게 됨
 - 메서드가 return하면 해당 thread는 제거된다.


destroy()
한 번만 수행된다.
Web Application이 갱신되거나 WAS가 종료될 때 호출된다.
역할 : Servlet 객체를 메모리에서 제거

 

1. src
   개발자가 작성한 Servlet 코드가 저장된다.
2. Libraries
   - Servlet이나 JSP에서 추가로 사용하는 라이브러리 또는 드라이버
   - jar로 압축한 파일이어야 한다.
3. WebContent
   - Deploy할 때 WebContent 디렉터리 전체가 .war로 묶어서 보내진다.
   - WEB-INF
      ㄴ lib : 추가한 모든 라이브러리 또는 드라이버가 이곳에 모두 저장
      ㄴ classes : 작성한 Java Servlet 파일이 나중에 .class로 이곳에 모두 저장된다.
      ㄴ web.xml : SUN에서 정해놓은 규칙에 맞게 작성해야 하며 모든 WAS에 대하여 작성 방법이 동일

 

web.xml

더보기

web.xml 기본 설정

 

개념
  web application의 설정을 위한 deployment descriptor
역할
 - Deploy할 때 Servlet의 정보를 설정해준다.
 - 브라우저가 Java Servlet에 접근하기 위해서는 WAS(Ex. Tomcat)에 필요한 정보를 알려줘야

   해당하는 Servlet을 호출할 수 있다.
   정보 1) 배포할 Servlet이 무엇인지
   정보 2) 해당 Servlet이 어떤 URL에 매핑되는지

<web-app>

    <!-- 1. aliases 설정 -->
    <servlet>
        <servlet-name>welcome</servlet-name>
        <servlet-class>servlets.WelcomeServlet</servlet-class>
    </servlet>

    <!-- 2. 매핑 -->
    <servlet-mapping>
        <servlet-name>welcome</servlet-name>
        <url-pattern>/welcome</url-pattern>
    </servlet-mapping>

</web-app>

정보 1) aliases 설정
서블릿 이름을 실제 서블릿 클래스에 연결
<servlet-name>welcome</servlet-name>과 아래 매핑 설정에서의 servlet-name은 반드시 같아야 함
<servlet-class>servlets.WelcomeServlet</servlet-class>은 개발자에 의해 작성된 실제 클래스 이름으로 설정
Ex. (패키지 이름).(서블릿 클래스 이름)


정보 2) 매핑
URL을 서블릿 이름에 연결
<url-pattern>/welcome</url-pattern>은 클라이언트(browser)의 요청 URL에서 앱(프로젝트) 이름 뒤에 오는 부분으로, 슬래시(‘/’)로 시작해야 한다.

 

※ 클라이언트(browser)가 요청하는 URL 정보
  요청을 보낼 서버의 IP 주소 : Port 번호 / App 이름 / 달라고 요청하는 HTML
  Ex. localhost:8080/FormHandlingServlet/LoginForm.html


.html 파일들
관련된 HTML 소스를 저장한다.
Ex) WebContent - views Directory - index.html는 http://localhost/helloLogin/views/index.html와 매핑된다.

 

1) Web Server는 웹 브라우저 클라이언트로부터 HTTP 요청을 받는다.
2) Web Server는 클라이언트의 요청(Request)을 WAS에 보낸다.
3) WAS는 관련된 Servlet을 메모리에 올린다.
4) WAS는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성한다. (Thread Pool 이용)
5) HttpServletRequest와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.
   5-1) Thread는 Servlet의 service() 메서드를 호출한다.
   5-2) service() 메서드는 요청에 맞게 doGet() 또는 doPost() 메서드를 호출한다.
6) protected doGet(HttpServletRequest request, HttpServletResponse response)

   doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에 전달한다.
7) WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달한다.
8) 생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.


출처 : https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html