Servlet의 동작 과정 및 생명주기

Posted by 알 수 없는 사용자
2015. 6. 21. 18:36 프로그래밍/웹 개발

Servlet

 서버에서 수행되는 소형 프로그램. 일반적으로 서버에 존재하며 사용자 입력에 의해 데이터베이스에 접근하는 프로그램은 공통 게이트웨이 인터페이스(CGI) 프로그램을 사용해 수행되데, 자바 서버 프로그램은 자바 프로그래밍 언어로 수행된다. CGI 프로그램보다 수행 속도가 빠르고, 프로그램 프로세스가 생성되는 것이 아니라 각 사용자 요청이 상주 프로그램(daemon)의 하나의 스레드(thread)로 수행된다. 추가(add-on) 모듈로 된 자바 서블릿은 넷스케이프 엔터프라이즈와 인터넷 정보 서버(IIS), 아파치 서버에서 수행된다.


즉, 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램이다.


Servlet 동작 과정

   [그림1] Servlet 동작 과정


1 클라이언트가 웹 브라우저에 URL을 입력하면 해당하는 HTTP Request를 해당하는 서버의 Servlet Container에 보낸다.

2. Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.

3. 클라이언트가 요청한 URL을 DD(배포서술자, Deplyment Descriptor)를 참조해서 분석하여 어느 서블릿에 대한 요청인지 찾는다.

4. Servlet Container는 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.

5. doGet() 또는 doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.

6. 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.



DD(Deployment Descriptor : 배포 서술자)

  : 웹 컨테이너에게 사용자가 지금 접근한 URL 주소가 서블릿 요청임을 인식하고 그 서블릿 클래스의 위치는 어디에 있다고

    알려주기 위해 필요한 정보들이 적혀 있는 파일이다. 주로 프로젝트의 WebContent/WEB-INF/web.xml 파일에 작성된다. 



 위의 코드는 web.xml 파일인데 이 파일을 보면 <sevlet>과 <servlet-mapping> 태그를 제외한 나머지 태그는 web.xml 에 기본으로 작성된다. 결국 우리가 직접 작성해야대는 부분은 <sevlet>과 <servlet-mapping>태그 이다.


<servlet-name> : <servlet>과 <servlet-mapping>을 연결해줄 수 있게 연결고리 같은 역할을 하며, xml 내부에서만 사용하는 이름이기 때문에 임의로 이름을 지정해준다.

<servlet-class> : 서블릿 클래스 파일을 호출할 수 하는 역할이며, 서블릿 클래스 파일의 위치와 클래스 파일명을 작성해준다. 예를 들어, a패키지안에 b.java 라는 java파일이 있다면 a.b 라고 입력해주면 된다.

<url-pattern> :  클라이언트가 요청한 URL의 주소형식이 명시된 URL 패턴과 동일한지 비교하는 역할입니다. 예를들어, www.abcd.com/Zitoo 라 요청하면 우리가 만든 서블릿 b.java가 실행되서 웹브라우저에 보여지게 된다. 


따라서, 웹 컨테이너가 인식하는 순서는

1. <servlet-mapping>에서 <url-pattern>을 통해 사용자가 요청한 URL과 비교한다.

2.  동일할 경우 <servlet-mapping>의 <servlet-name>을 통해 <servlet>내의 <servlet-name>과 일치하는 <servlet-name>을 찾는다.

3.  일치하는 <servlet-name>이 있을 경우 해당 <servlet-name>의 <servlet-class>를 호출한다.

이 과정을 URL과 Servlet을 Mapping한다고 한다.


Servlet 생명주기


[그림2] Servlet 생명주기


객체생성 : 서블릿이 처음으로 요청된경우에는 서블릿 클래스를 메모리에서 로딩하여 객체를 생성 한다. 생성된 객체는 메모리에 계속 존재하므로 이후부터는 서블릿 객체가 새로 생성되지 않고, 메모리에 있는 서블릿 객체로 사용한다.

init() : 객체가 생성되면서 init()이 최초에 한번 호출된다.

Service() : 클라이언트의 요청이 있을때 service()가 GET, POST 여부에 따라 실행된다. 여러 클라이언트가 동시에 요청을 하더라도 쓰레드가 생성되므로 동시에 service()가 실행이 되기 때문에 수행속도가 빠르다. 

destory() : 서블릿이 더 이상 필요로 하지 않을 경우 destory() 메소드가 호출되서 연결을 해지한다.


Servlet 예제





  


   Servlet으로도 예제에서 본 것처럼 JAVA기반으로 HTML은 문자열로 만들어서 출력 한다. 그런데 예제는 태그가 몇 개 안되지만 태그가 많은 HTML 페이지를 만들려고 한다면 매우 번거로울 것이다. 또한 작성 도중에 태그중에 에러가 발생한다면 찾는것도 매우 힘들것이다. 이러한 번거로움 때문에 JSP가 나왔는데, JSP는 HTML기반으로 작성이되고 동적처리를 담당하는 부분을 JAVA로 작성한다. JSP가 사용하기 편할듯 보이지만 동적인 부분이 많은 부분까지 JSP로 하기에는 무리가 있다. 그래서 Sevlet, JSP 둘 중에 하나만 사용하는 것이 아니라 각자의 장단점을 살려서 보여지는 부분은 HTML이 중심이 되는 JSP, 다른 JAVA 클래스에게 데이터를 넘겨주는등 동적인 부분은 Java 코드가 중심이 되는 Servlet으로 작성해서 둘을 혼용해서 사용하는 것이 바람직하다. 


출처 

구루비 지식창고 http://wiki.gurubee.net/pages/viewpage.action?pageId=26740202&



'프로그래밍 > 웹 개발' 카테고리의 다른 글

Kendo UI Grid  (5) 2015.06.02

python 람다(Lambda)

Posted by jungbbong
2015. 6. 20. 21:57 프로그래밍/Python





python에서는 람다(Lambda)라는게 있다


이는 간단하게 만들어 바로 사용하도록 하는것이다


아래는 일반함수이다



아래는 람다를 사용한 함수이다




위의 기능은 둘다 동일한 결과를 리턴하겠지만 Lambda를 사용하게 되면 간단하게 한줄로 표현할 수 있다


lambda를 사용하는 방법은 아래와 같다


lambda 인자 : 표현식



다시 위의 코드에서 살펴 보면 람다함수를 사용한 sum,sum2의 객체는 어떻게 나올까?

위와 같이 sum과 sum2는 같은 function 객체를 취하는것을 알 수 있다 (같은 기능이라고 봐도 무관)



위와같이 filter를 겹쳐서 사용할도 있다

위의코드는 0부터4까지의 x중 2로 나눈 나머지가 0인 것들만 찾아내는 함수이다


*보통 range함수나 list와 같이 이터레이블한 상태를 사용하여 간단한 데이터연산에 사용을 한다




CrackMe 문제풀이 (리버싱 기초)

Posted by 알 수 없는 사용자
2015. 6. 8. 21:30 네트워크및보안&해킹/보안&해킹

CrackMe 는 리버싱공부를 위해 만들어진 연습문제 실행파일이다.


아래에 첨부된 파일은 가장 기초적인 CrakckMe 파일중에 하나이다. 이 파일을 통하여 리버싱을 간단하게 보여주려고 한다.


01.exe


첨부된 파일을 실행시켜보자


            



HD를 CD-Rom으로 인식하도록 만들으라고 되어있고 확인을 누르면 오른쪽의 에러메시지가 나타난다.


이제 분석을 위해 OlluDbg를 이용하여 파일을 열어보자.




F7(Step into) 를 누르면 함수 호출부분에서 함수내부로 들어갈수 있고

F8(Step over)를 누르면 함수내부로 들어가지않고 다음명령어로 넘어간다.

F7을 여러번 눌러서 넘어가다보면




이런부분을 볼수있다.

창에 있는 내용을 보게되면 프로그램을 실행시켰을때 볼수 있었던 메시지들이

코멘트부분에 나타나는데 

이부분이 이프로그램의 메인함수 내부이다. 

여기서 F2키를 눌러서 BreakPoint를 설정하도록한다.


전에 봤던 메시지 두개 외에도 아래쪽에 보면

"Ok, I really ~~~~" 부분이 있는데 

먼저보았던 에러메시지를 출력하는 것 대신에 이부분이 호출되게 하는것이 목표이다.

여기서부터는 F7 을 막누르다보면 엉뚱한곳에 가서 헤맬수 있기때문에 

F8을 통하여 넘어가도록 한다


F8을 누르다보면 처음에보았던 메시지 박스가 하나 나오는데 확인 누르고 넘어가도록 하자.

F8을 계속 누르다보면 



빨간색 화상표 부분에서 에러메시지를 띄우고 프로그램이 종료되버린다.

당황하지말고 Ctrl+F2 를 눌려서 리셋하고 F9( BreakPoint를 만나기전까지 명령어 수행) 를 누른다.

 

다시 F8로 차근차근 넘어가보자



빨간 화살표 부분을 보면 

 CMP EAX,ESI  ( 레지스터의 EAX값과 ESI값을 비교하여 TRUE 혹은 FALSE값을 반환해준다. )

가 있다. 

여기서 registers 창(빨간 네모박스 부분)을 보면 ESI = 3 , EAX = 1 로 값이 다르므로 FALSE가 반환된다.


그리고 그 바로 아래 명령어를 보면

JE SHORT 01.0040103D ( 반환값이 True일경우 모듈01의 0040103D 주소로 Jump )

가 있다.

0040103D 주소( Address 부분에 동그라미) 를 찾아가보면 처음 목표로 잡았던 메시지를 출력해주는 부분이 나온다.

여기서 여러가지 방법을 생각할 수 있다.



두가지 모두 적용하는 방식은 같기때문에 2번 방법만 설명한다.

JE 명령어를 더블클릭하게되면 수정할수있다.



JE -> JMP로 바꾸고 Assemble 버튼을 누르면 바뀌는것을 볼 수 있다.


그리고 바뀐 실행파일을 저장하기위해 Disassembler창에서 우클릭 -> Copy to exexutable -> All modifications -> Copy all 을 클릭한다.



그럼 위와같이창이 하나뜨는데 그창위에 커서를 올리고 우클릭 -> save file -> 저장 

하게되면 바뀐내용의 exe파일이 저장된다.


그리고 바뀐내용의 파일을 실행시켜보면

 

    



에러메시지 대신에 오른쪽과 같은 창이 뜬다.


이것으로 가장쉬운 난이도의 CrackMe 문제를 풀어보았다.


http://codeengn.com/

위의 주소에 들어가보면 더많은 CrackMe자료들이 있으니 차근차근 풀어보면

리버싱을 공부하는데 도움이 될것이다.



'네트워크및보안&해킹 > 보안&해킹' 카테고리의 다른 글

[시스템해킹]버퍼오버플로우 실습  (329) 2015.08.28
CrackMe2 문제풀이  (6) 2015.07.17
DLL Injection  (6) 2015.06.21
리버스 엔지니어링  (3) 2015.06.08
버퍼오버플로우  (928) 2015.06.08