달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2015. 11. 5. 15:09

Convert JSON string to Map – Jackson Enjoy/JSP2015. 11. 5. 15:09

출처 : http://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/


In this tutorial, we will show you few Jackson examples to convert JSON string to/from a Map.

P.S All examples are tested with Jackson 2.6.3

1. JSON string to Map

JsonMapExample.java
package com.mkyong.json;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonMapExample {

	public static void main(String[] args) {

		try {

			ObjectMapper mapper = new ObjectMapper();
			String json = "{\"name\":\"mkyong\", \"age\":29}";

			Map<String, Object> map = new HashMap<String, Object>();

			// convert JSON string to Map
			map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});

			System.out.println(map);

		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Output

{name=mkyong, age=29}

2. Map to JSON string

Example to convert the Map to JSON string.

MapJsonExample.java
package com.mkyong.json;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class MapJsonExample{

	public static void main(String[] args) {

		try {

			ObjectMapper mapper = new ObjectMapper();
			String json = "";

			Map<String, Object> map = new HashMap<String, Object>();
			map.put("name", "mkyong");
			map.put("age", 29);

			// convert map to JSON string
			json = mapper.writeValueAsString(map);

			System.out.println(json);

			json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);

			// pretty print
			System.out.println(json);

		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Output

{"name":"mkyong","age":29}
{
  "name" : "mkyong",
  "age" : 29
}

3. Map to JSON File

JsonMapFileExample.java
package com.mkyong.json;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonMapFileExample {

	public static void main(String[] args) {

		try {

			ObjectMapper mapper = new ObjectMapper();

			Map<String, Object> map = new HashMap<String, Object>();
			map.put("name", "mkyong");
			map.put("age", 29);

			List<Object> list = new ArrayList<>();
			list.add("msg 1");
			list.add("msg 2");
			list.add("msg 3");

			map.put("messages", list);

			// write JSON to a file
			mapper.writeValue(new File("c:\\user.json"), map);

		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
c:\\user.json
{"name":"mkyong","messages":["msg 1","msg 2","msg 3"],"age":29}

4. JSON file to Map

JsonFileMapExample.java
package com.mkyong.json;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Jackson2Example {

	public static void main(String[] args) {

		try {

			ObjectMapper mapper = new ObjectMapper();

			// read JSON from a file
			Map<String, Object> map = mapper.readValue(
					new File("c:\\user.json"), 
					new TypeReference<Map<String, Object>>() {
			});

			System.out.println(map.get("name"));
			System.out.println(map.get("age"));

			@SuppressWarnings("unchecked")
			ArrayList<String> list = (ArrayList<String>) map.get("messages");

			for (String msg : list) {
				System.out.println(msg);
			}

		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Output

mkyong
29
msg 1
msg 2
msg 3

References

  1. Wikipedia : JSON
  2. Jackson – High-performance JSON processor
  3. Jackson 2 – Object to / from JSON


:
Posted by 라면스프
2015. 11. 5. 14:28

ObjectMapper (FasterXML/jackson) Enjoy/JSP2015. 11. 5. 14:28

출처 : http://noritersand.tistory.com/240


라이브러리 다운로드

http://wiki.fasterxml.com/JacksonDownload


 jackson-annotations-2.2.3.jar

 jackson-core-2.2.3.jar

 jackson-databind-2.2.3.jar


Map - JSON 변환



writeValueAsString( value )

  • value: String 타입으로 변환할 대상


readValue( arg, type )

  • arg: 지정된 타입으로 변환할 대상
  • type: 대상을 어떤 타입으로 변환할것인지 클래스를 명시한다. Class객체, TypeReference객체가 올 수 있다.

ex)

mapper.readValue(arg, ArrayList.class);

mapper.readValue(argnew ArrayList<HashMap<String, String>>().getClass());

mapper.readValue(arg, new TypeReference<ArrayList<HashMap<String, String>>>(){});


● Map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class Test2 {
    public static void main(String[] args) throws Exception {
 
        ObjectMapper mapper = new ObjectMapper();
 
        HashMap<StringString> map = new HashMap<StringString>();
        map.put("name""steave");
        map.put("age""32");
        map.put("job""baker");
 
        System.out.println(map);
        System.out.println(mapper.writeValueAsString(map));
    }
}
 
// {age=32, name=steave, job=baker}
// {"age":"32","name":"steave","job":"baker"}
cs

맵 타입이 JSON 형식의 String 타입으로 변환된다. 자바스크립트에 JSON을 넘겨줄 때 유용하다. 


이와 반대로 JSON을 맵 타입으로 변환하려면 다음처럼 작성한다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class Test2 {
    public static void main(String[] args) throws Exception {
 
        ObjectMapper mapper = new ObjectMapper();
        HashMap<StringString> map = new HashMap<StringString>();
 
        String jsn = "{\"age\":\"32\",\"name\":\"steave\",\"job\":\"baker\"}";
        
        map = mapper.readValue(jsn, 
                new TypeReference<HashMap<StringString>>() {});        
        
        System.out.println(map);
    }
}
 
// {name=steave, age=32, job=baker}
cs


● List<Map>

다음은 view에 전달할 model이 List<map<?, ?>> 타입일 때 이를 JSON으로 변환하는 방법이다.

사용방법은 크게 다르지 않고 writeValueAsString, readValue 메서드를 사용하되 타입 명시만 달리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class Test2 {
    public static void main(String[] args) throws Exception {
 
        ObjectMapper mapper = new ObjectMapper();
 
        // map -> json
        ArrayList<HashMap<StringString>> list 
                = new ArrayList<HashMap<String,String>>(); 
        
        HashMap<StringString> map = new HashMap<StringString>();
        map.put("name""steave");
        map.put("age""32");
        map.put("job""baker");
        list.add(map);
        
        map = new HashMap<StringString>();
        map.put("name""matt");
        map.put("age""25");
        map.put("job""soldier");
        list.add(map);
        
        System.out.println(mapper.writeValueAsString(list));
 
        
        // json -> map
        String jsn = "[{\"age\":\"32\",\"name\":\"steave\",\"job\":\"baker\"},"
                + "{\"age\":\"25\",\"name\":\"matt\",\"job\":\"soldier\"}]";
        list = mapper.readValue(jsn, 
                new TypeReference<ArrayList<HashMap<StringString>>>() {});        
        
        System.out.println(list);
    }
}
 
 
// [{"age":"32","name":"steave","job":"baker"},{"age":"25","name":"matt","job":"soldier"}]
// [{name=steave, age=32, job=baker}, {name=matt, age=25, job=soldier}]
cs






:
Posted by 라면스프
2012. 12. 11. 10:40

tomcat 메모리 CATALINA_OPTS 설정 Enjoy/JSP2012. 12. 11. 10:40

tomcat 에 힙사이즈 설정


catalina.sh 파일에 아래 내용 추가


export CATALINA_OPTS="-Djava.awt.headless=true -server -Xms2048m -Xmx2048m -Xmn1024m

                      -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m 

                      -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

                      -XX:SurvivorRatio=4 -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError"


  • CATALINA_OPTS="-server -Xss256k -Xms256m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:SurvivorRatio=5 -XX:ReservedCodeCacheSize=128m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true "

-Xmx1024m -Xms1024m -XX:MaxNewSize=384m -XX:MaxPermSize=128m

힙덤프

-XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof

GC 옵션

-XX:ParallelGCThreads=2 -XX:-UseConcMarkSweepGC

GC 로그 옵션

-XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -XX:-TraceClassUnloading -XX:-TraceClassLoading

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/logs




http://helloworld.naver.com/helloworld/184615

표 3 모니터링 후 옵션변경 예시

종류

옵션

동작 모드

-sever

전체 힙 크기

-Xms와 –Xmx의 값을 같게

New 영역 크기

-XX:NewRatio

2~4 정도의 값

-XX:NewSize=? –XX:MaxNewSize=?

NewRatio 대신 NewSize를 지정하는 것도 좋다.

Perm 크기

-XX:PermSize=256m

-XX:MaxPermSize=256m

성능에 영향을 미치지 않으므로 동작에 문제가 없을 정도만 지정한다.

GC 로그

-Xloggc:$CATALINA_BASE/logs/gc.log

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

GC로그를 남기는 것은 특별히 Java 애플리케이션 수행 성능에 영향을 미치지 않는다. 가급적이면 GC 로그를 남기는 것이 좋다.

GC 알고리즘

-XX:+UseParNewGC

-XX:+CMSParallelRemarkEnabled

-XX:+UseConcMarkSweepGC

-XX:CMSInitiatingOccupancyFraction=75

일반적으로 권할만한 설정일 뿐이다. 애플리케이션 특성에 따라 다른 선택이 더 좋을 수 있다.

OOM 에러 발생 시 힙 덤프 생성

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/logs

OOM 발생 이후 조치

-XX:OnOutOfMemoryError=$CATALINA_HOME/bin/stop.sh

또는

-XX:OnOutOfMemoryError=$CATALINA_HOME/bin/restart.sh

힙 덤프를 남긴 뒤, 관리 정책에 맞게 적합한 동작을 취할 수 있도록 한다.





:
Posted by 라면스프
2012. 7. 20. 15:36

1 Tomcat 2 Service Enjoy/JSP2012. 7. 20. 15:36



두개의 Tomcat을 설치하여 server.xml의 포트 부분을 변경하는 방법도 있지만 

너무 번거러운 관계로 server.xml에서 service 부분만 추가하여 포트를 변경하는 방법이다.


<Service name="Catalina">

    <Connector 

        port="8080"

        redirectPort="8443"

        minSpareThreads="25"

        connectionTimeout="20000"

        maxThreads="500"

        maxSpareThreads="75">

    </Connector>

    <Connector

        port="8009"

        redirectPort="8443"

        protocol="AJP/1.3">

    </Connector>

    <Engine

        defaultHost="localhost"

        name="Catalina">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>

      <Host

          appBase="webapps"

          name="localhost">

       <!-- 아래의 Context 부분은 Tomcat 버전에 따라 따로 설정할 수 있다. -->

       <!--<Context path="/test" docBase="C:\text" debug="0" reloadable="true"/>-->

      </Host>

    </Engine>

  </Service>



  <Service name="Catalina2">

    <Connector

        port="8081"

        redirectPort="8444"

        minSpareThreads="25"

        connectionTimeout="20000"

        maxThreads="500"

        maxSpareThreads="75">

    </Connector>

    <Connector

        port="8010"

        redirectPort="8444"

        protocol="AJP/1.3">

    </Connector>

    <Engine

        defaultHost="localhost"

        name="Catalina2">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>

      <Host

          appBase="webapps"

          name="localhost">

       <!-- 아래의 Context 부분은 Tomcat 버전에 따라 따로 설정할 수 있다. -->

       <!--<Context path="/test" docBase="C:\text" debug="0" reloadable="true"/>-->

       </Host>

    </Engine>

  </Service>


:
Posted by 라면스프

출저 : http://cafe.naver.com/junes81/1619



XSS (Cross Site Script)

 

 

 

발생원인은 Cookie , Session 사용, Html TAG 사용 가능, 사용자의 입력값을 Filtering 하지 않아 발생

 

사용자의 입력내용을 포함하는 HTTP요청에 대해 동적으로 HTML을 생성하는 어플리케이션(CGI)이 공격대상이 됩니다.

 

정적인 웹페이지, 즉 일반적인 HTML로 작성된 웹페이지에서는 이 문제는 일어나지 않습니다.

 

보통 게시판에 글을 클릭하거나 자료를 봤을때 다른 페이지로 이동을 하거나 화면이 자동 리플레쉬가 되는 현상

 

이 발생합니다.

 

script 와 암호화 되지 않은 쿠키 정보를 그대로 다른 서버에 가져갑니다.

 

더욱이 피싱사고를 유발 할 수 있죠

 

 

이해를 돕기위해 간단한 예제를 보겠습니다.

 


그림과 같이 텍스트을 입력받는란이 있어 여기에 사용자가 임의의 문자열을 입력한후 "전송하기"버튼을 누르면 사용자의

 

입력한 문자열을 웹페이지에 출력해주는 cgi 프로그램이 있다고 하면 결과는 다음과 같을것입니다. 

 

 

 

화면에서 굵은폰트속성을 나타내는 HTML 태그를 사용하여 "안녕하세요 <B>jakehong</B>님!"이라고 입력해 본다면

 

결과가 어떻게 나올것 같나요?

 

만약 다음과 같은 페이지가 표시된다면 해당 사이트는 XSS의 공격대상이 됩니다.

 

 

 

이렇게 된다면, 입력란에 "<SCRIPT>alert("까꿍!");</SCRIPT>"라고  입력해 보면 아래 그림과 같이 "까꿍!" 이라고

 

써진 다이얼로그박스가 나타납니다.

 

응용해서 악한 마음을 가진 사람들이  <SCRIPT> 를 이용하여 사용자의 쿠키정보나 특정사이트로의 강제 이동등의

 

공격을 가할 수 있습니다.

 
 
--------------------<< XSS 공격유형 >>--------------------
 
<IMG SRC="실행 페이지 OR 실행 EXE 프로그램" >
 
<SCRIPT SRC="http://ha.ckers.org/xss.js" >
 
<iframe src="http://ha.ckers.org/scriptlet.html">
 
외의 SCRIPT를 사용할 수 있는 모든 기능들...

 

* 대처방안-------------------------------------------------------------------------------------

 

1. 중요한 정보는 쿠키에 저장하지 않아야 하며 사용자 식별 같은 부분은 쿠키에 담지 않아야 한다.

 

2. 스크립트 코드에 사용되는 특수 문자에 대한 이해와 정확한 필터링을 해야 한다.

  

가장 효과적인 방법은 사용자가 입력 가능한 문자(예를 들어, 알파벳, 숫자 및 몇 개의 특수문자) 만을 정해 놓고

 

그 문자열이 아닌 경우는 모두 필터링해야 합니다.

 

------------샘플코드------------------------

 

 public static String toFilterString(String in) {

     if(in == null || in.length()<1)
            return in;
     
     StringBuffer out = new StringBuffer();

     for (int i = 0; in != null && i < in.length(); i++) {
            char c = in.charAt(i);       
              if (c == '\'') {
                out.append("");
            } else if (c == '\"') {
                out.append("");
            } else if (c == '<') {
                out.append("&lt;");
            } else if (c == '>') {
                out.append("&gt;");
            } else if (c == '&') {
                out.append("&amp;");
            } else  if (c == '(') {
                out.append("&#40;");
            } else if (c == ')') {
                out.append("&#41;");
            } else {
                out.append(c);
            }
            out.append(c);
        }
        return out.toString();
    }

 

--------------------------------------------

 

이 방법은 추가적인 XSS 취약점에 사용되는 특수 문자를 애초부터 막을 수 있다는 장점이 있습니다.

 

3. 꼭 필요한 경우가 아니라면 게시판에 HTML 포멧의 입력을 사용할 수 없도록 설정합니다.

         

4. 스크립트 대체 및 무효화 javascript라고 들어오는 문자열을 무조건 'x-javascript'와  같이 대체를 하여 스크립트 실행을

 

무효화시키는 방법도 있습니다. -> 이 방법 보다는 < 와 > 기호를 &lt; 와 &gt; 로 치환하는 것이 나을 듯

:
Posted by 라면스프
2011. 3. 3. 13:45

웹개발 시 보안체크리스트 20 Enjoy/JSP2011. 3. 3. 13:45


웹개발 시 보안체크리스트 20

Guide 1. 세션유지를 위해서 Cookie를 사용할경우, 위/변조에 대비해야 한다.

■보안 수단없이 쿠키에 인증정보를 저장해서 사용할 경우 해당값들의 위,변조가 가능하며, 이로 인하여 다른 사용자로 위장 또는

  권한상승 등의 문제가 생길 수 있다. 따라서 쿠키를 사용할 경우, 쿠키값의 불법 위/변조가 불가능하도록 구현해야 한다.

 

■점검방법 : 사이트에 로그인한 후, 웹브라우저의 주소창에 javascript:document.cookie;  입력해서 내용을 확인한후,

   해당 세션 쿠키를 사용하는 웹어플리케이션 소스 점검을 통해 불법 변조탐지루틴이 있는지 확인한다.

 

■조치방법 : 아래 방법들 중에서 가능한 것을 선택해서 적용함.
1) 쿠키값 암호화를 통한 쿠키불법 변조방지(서버에서 전송받은 쿠키를 복호화 한후, 위/변조 되었는지 확인)
2) 쿠키값에 대한 Message Digest(예, MD5, SHA-1 등) 값의 첨부 및 검증을 통한위,변조탐지(아래예제참조)
3) 쿠키에 세션값을 저장하는 대신어플리케이션서버세션사용(사용하는웹어플리케이션서버가지원하는지확인필요)
<php 예제>
$secret_word = ‘lgcard_secret_value’;
// 쿠키설정하기
$id = ‘lgcard’;
$hash = md5($secret_word . $id);
setcookie('id', $id . '-‘. $hash);
// 받은 쿠키가 변조되었는지 확인하기
list($cookie_id,$cookie_hash) = explode('-',$_COOKIE['id']);
if (md5($secret_word.$cookie_id) == $cookie_hash) {
$id = $cookie_id;
} else {
  die('Invalid cookie !');
}
<asp 예제>
<!--#include virtual="/crypto/MD5.asp"-->
secret_word = “lgcard_secret_value”
// 쿠키설정하기
id = “lgcard”
hash = md5(secret_word & id);
Response.Cookie(“id”) = id
Response.Cookie(“id_hash”) = hash
// 받은쿠키가변조되었는지확인하기
cookie_id = Request.Cookie(“id”)
cookie_hash = Request.Cookie(“id_hash”)
If md5(secret_word & cookie_id) = cookie_hash) Then
   ‘Cookie 값이변조되지않았으므로, 세션ID 값설정
   id = cookie_id
Else
   ‘Cookie 값이 변조되었기 때문에, 오류처리
End
<jsp예제>
String secret_word = “lgcard_secret_value”;
// 쿠키설정하기
String id = “lgcard”;
String id_hash = CryptoUtil.md5(secret_word + id);
Cookie userCookie= new Cookie(“id”, id + “-”+ id_hash);
Response.addCookie(userCookie);
// 받은쿠키가변조되었는지확인하기
Cookie[] cookies = request.getCookies();
for(inti=0; i<cookies.length; i++) {
  Cookie thisCookie= cookies[i];
  if (thisCookie.getName().equals(“id”)) {
    String cookie_value = thisCookie.getValue();
    StringTokenizerst= new StringTokenzier(cookie_value, “-”);
    String cookie_id = st.nextToken();
    String cookie_hash = st.nextToken();
    if (CryptoUtil.md5(secret_word + cookie_id).equals(cookie_hash)) {
      id = cookie_id;
    } else {
      // Cookie 값이 변조되었기 때문에, 오류처리
    }
  }
   //다른쿠키에대한처리루틴
}
* 쿠키에대한 Hash 값을만들때, 공격자가 해당Hash 값을 불법으로 생성하는것을 막기위해서, 웹 사용자에게 공개 되지않는
secret_word 값을함께 사용한다. 이값은 해당웹어플리케이션에서 사용할수있도록 공용 설정파일등에 저장해서 사용하는것을 권장한다.
Guide 2. 접근제어가 필요한 모든 페이지에 로그인 체크 및 권한 체크를 구현하자.
■접근제어가 필요한 페이지 및 모듈들에는 모두 통제수단(로그인체크, 권한체크)이 적용되어야 한다. 
  특히, 하나의 프로세스가 여러 개의 페이지 또는 모듈로 이뤄져 있을때 권한 체크가 누락 되었을 경우, 설정된 접근권한을 우회해서
  트랜젝션을 실행할 수 있는 위험이 존재한다.
■점검방법: 소스리뷰
■조치방법
1) 접근권한이 필요한 모든페이지/모듈에 해당루틴 구현
2) 이를위해서 공통 모듈을 사용하는 것을 권장한다.
Guide 3. 첨부파일 업로드 기능을 통한 스크립트 업로드 및 실행을 금지하자.
■ 게시판 첨부파일 업로드, 사진 업로드 모듈등 사용자가 임의의 파일을 서버로 전송할 수 있는 기능을 이용해서 공격자가 작성한
   악의적인스크립트를 서버에 업로드한후, 이를 실행시킬 수 있다면 해당 서버에서 임의의 명령어실행, Web DB 불법접근및
   해당 Application Server와 신뢰관계를 맺고있는 서버들(예, Web DB서버, 내부 연동서버등)을 공격할 수 있는 위험이 있다.
  본 취약점은 게시판 업로드 모듈뿐아니라 그림 파일을 올리는 기능을 통해서도 발견되고 있기때문에, 사용자가 파일을 업로드할
  수 있는 모든 모듈에 적용된다.
■점검방법 : 해당Application Server가 지원하는 Script 파일을 업로드한 후, 이를 웹브라우저로 직접 접근해서 실행이 되는지
                 확인한다.
■조치방법
1) 해당 Application Server에서Script로 실행될 수 있는 확장자(예, .jsp, .asp, .php, .inc 등)로된 파일의 업로드를 차단한다.
2) 첨부파일을 웹디렉터리가 아닌 곳에 저장한후, 다운로드 스크립트를 사용해서 사용자에게 전달할 수 있게한다.
3) 다운로드 스크립트를 구성할때, 파일명을 Parameter로 받는것보다 파일이름은 DB에 저장하고 해당index만을 Parameter로
    받아서 사용하면 더 안전하다.
※주의사항
1) 확장자를 비교할경우, 대소문자를 무시한 문자열비교를 해야만한다. 이를 적용하지않으면 공격자는
   “malcious.Jsp ”,  “malicious.jSp ”,  “malicious.jsP ” 등과 같은 파일명을 사용해서 통제루틴을 우회할 수 있기 때문이다.
2) 웹어플리케이션 서버에서 실행 스크립트로 설정한 모든 확장자에 대해서 점검해야하며, 이들 확장자 목록은 웹 서버 관리자에게
   문의해서 확인해야 한다.
Guide 4. 첨부파일 다운로드스크립트를 악용한 서버파일유출을 방지하자.
■첨부파일 다운로드 스크립트에 파일 경로를 포함한 parameter를 사용할 경우, 원하는 디렉터리를 벋어나서 임의의 파일을 다운로드
  할수 있는 취약점이 있다. 이로 인하여 공격자는서버의 중요파일 또는 웹어플리케이션 소스파일등에 접근이 가능하다.
■점검방법: http://localhost/download.jsp ? file=lgsec.txt와같이 구현되어있는 웹 어플리케이션이 있다고하자.
1) Application Server가Unix/Linux인경우
    http://localhost/download.jsp ? file=../../../../../../../etc/passwd를 입력했을때 Application Server의 /etc/passwd 파일을
    획득할 수 없어야 한다.
2) Application Server가 Windows 계열인 경우
   http://localhost/download.asp ? file=../../../winnt/win.ini를 입력했을때 win.ini 파일을 획득할 수 없어야 한다. 
■조치방법 : 사용자로 부터 전송받은 디렉터리이름, 파일이름값에 “../ ” 또는 “..\ ”이 존재하면 오류처리 한다. 
Guide 5. SQL Injection 공격에 대비하자.
■사용자로 부터 입력 받은값을 DB query에 사용할 경우, 공격자는 원하는query 문을 injection할 수 있는 취약점이 있다.
  로그인 모듈이 SQL Injection에 취약할 경우, 사용자의 비밀번호를 몰라도 정상적으로 로그인할 수 있는 위험이 있으며, 게시판 등의
  모듈이 취약할 경우 DB 내용이 외부로 유출 또는 임의의 DB Query가 실행될 수 있다.
■원리
ID, PASSWORD를 받아서 로그인 성공 여부를 처리하는 예를 들어보자.
id = request(“id”);
passwd= request(“passwd”);
query = “select * from MEMBER where id = ‘” + id + “’ and passwd= ‘” + passwd+ “’”;
로 되어있어서 결과Record가 있을 경우 회원 로그인 성공처리하는 경우, Id에 ‘ or 1=1 –- 입력할 경우 비밀번호에 상관없이
다음과 같은query가 만들어진다. (여기서passwd가123으로 입력되었다고 하자)
Select * from MEMBER where id = ‘ ’ or 1=1 –-‘ and passwd=  ‘123 ’
Oracle DB에서 –- 부분은 주석으로 처리되기 때문에 위 쿼리의 결과는 항상 첫 번째 레코드가 반환되며, 단순하게 레코드 반환 여부만을
점검 하는식으로 인증이 구현되어 있다면, 로그인이 성공적으로 처리되게 된다. 이를 응용하면 원하는 사용자ID로 로그인이 가능할 수
도 있다.
또한 이와같은 원리를 사용해서 사용자 입력값의 조작으로 임의의 DB Query를 실행시킬 수 있는 위험이 존재한다.
■점검방법: 
1) 검색어 필드 및 로그인ID, PASSWD  필드에 큰따옴표(“), 작은따옴표( ‘), 세미콜론(;) 등을 입력한후, DB error가 일어나는지
   확인하자.
2) 로그인모듈점검
A. MS SQL인 경우: ID 필드에[ ‘ or 1=1 ;--], 비밀번호필드에는 아무값이나 입력한 후 로그인을 시도한다.
B. Oracle인 경우: ID 필드에[ ‘ or 1=1 --], 비밀번호 필드에는 아무값이나 입력한 후 로그인을 시도한다.
C. 기타: ID 필드에[‘ or ‘’=‘], 비밀번호필드에[‘ or  ‘’=‘]을 입력한후 로그인을 시도한다.
* 위예제이외에도다양한방법이가능하기때문에, 로그인및사용자입력값을사용하는소스에서DB Query 생성방식을직접
점검해야한다.
■조치방법
1) 사용자로부터 입력 받은값에 큰따옴표(“), 작은따옴표( ‘), 세미콜론(;) 문자가있으면 이를제거 또는 사용하는 DB에 맞게 변환
한후, DB query문장에 사용하도록한다.
Guide 6. Cross-Site Scripting 공격에대비하자.
■사용자가 입력한 내용을 기반으로 페이지를 동적으로 생성하는 웹어플리케이션을 악용하면, 해당페이지를 보는 사용자의
웹브라우저에서 임의의코드를 실행할 수 있다. 이는 로그인세션 hijacking, 악성 프로그램설치등의 client hacking이 가능하다.
■점검방법: 게시판의제목, 내용 필드등에 <script>alert( “XSS 취약함 ”);</script> 입력한후, 내용을조회했을때, 해당스크립트가
실행되면 취약하다.
■점검방법: 게시판의 제목, 내용 필드등에 <script>alert( “XSS 취약함 ”);</script> 입력한 후, 내용을 조회했을때, 해당스크립트가
실행되면 취약하다.
■조치방법: 사용자로부터 입력받은 내용을 기반으로 페이지를 생성할경우, “<“,  “> ”는각각“&lt; ”,  “&gt; ”로 변경한 후 생성한다.
1) PHP의경우, htmlspecialchars() 함수를 사용해서입력받은값을변환할수있다. 
2) Java 1.4 API 이상
content = content.replaceAll("<",  “&lt;");  // 사용자가입력한내용이content 변수(String 객체)에저장되어있다고가정
content = content.replaceAll(">",  “&gt;");
3) Java 1.3 API 이하
intlocation;
do {
  location = content.indexOf('<');
  if (location > 0) content = content.substring(0, location) +  “&lt;" + content.substring(location+ 1);
  location = content.indexOf('>');
  if (location > 0) content = content.substring(0, location) +  “&gt;" + content.substring(location+ 1);
} while(content.indexOf('<') != -1 || content.indexOf('>') != -1);     
* 주의사항 만약 HTML Tag의 입력을 허용하는 모듈일경우, 위의변환규칙대신<script, </script>, <iframe>을 각각<!--script, </script--!>, <! —iframe> 
으로 변경하며, 이때 대소문자를 무시한 패턴매칭 (Java의경우String 클래스의toLowerCase()  및 substring() 사용)을 적용해야만 한다.
Guide 7. 사용자에게 전달된값(HIDDEN form 필드, parameter)을 재사용할경우 신뢰해서는 안된다.
■주로 회원정보변경 모듈에 사용자의 key값(예, id)를 hidden form 필드로 전송한 후, 이를 다시받아서 update에 사용하는 경우가
  있는데, 공격자가 이값을 변경할경우 다른 사용자의 정보를 변경할 수 있는 취약점이 존재한다.
■점검방법: HTML 소스에서 FORM 필드 확인 후, 해당값이 어떻게 사용되는지를 소스에서 확인해야 한다.
■조치방법: 해당값의 무결성을 검사 할수있는루틴(예, 해쉬값비교) 추가 또는 서버세션을 사용한다.`
Guide 8. 최종 통제메커니즘은 반드시 서버에서 수행 되어야한다. (Client-Site Security is NOT secure!!)
■JavaScript, VBScript 등을 사용한 사용자 입력값 점검루틴은 우회될 수 있기때문에, 서버에서 최종 점검하는것이 필요하다.
물론 서버의 부하를 줄이기위해서 1차적으로 클라이언트 레벨에서 점검할 수 있으나, 보안 통제수단으로 사용할 수 없다.
첨부파일 업로드 기능에 스크립트 파일의 전송제한하기 위해서 파일확장자검사를 script를 사용해서 웹브라우저 레벨에서
수행할 경우, 공격자는 해당script를 우회해서 서버에 원하는 스크립트파일을 전송할 수 있다.
■점검방법: HTML 및 웹어플리케이션 소스리뷰
Guide 9. 클라이언트에게 중요정보를 전달하지말자.
■Java Applet, ActiveX를 사용해서 C/S 어플리케이션을 작성하는경우, 클라이언트에서 실행되는 컴포넌트에 중요정보를 하드코딩
해서는 안된다. Cookie에중요정보를 전달할경우, 암호화를 사용해야 한다.
■점검방법
1) HTML 소스리뷰
2) URL 주소에javascript:document.cookie; 입력해서 쿠키내용 확인
Guide 10. 중요정보전송시POST method 및 SSL을 적용해야한다.
■사용자로부터 중요정보를 받을때는 POST method를 사용해야하며, 그 중요도에 따라 SSL을 사용한 암호화통신을 적용해야한다.
SSL은 자료전송시 암호화를 지원하므로, 민감한정보는 어플리케이션 레벨의 암호화를 고려해야한다.
■점검방법: 중요정보전달 FORM ACTION에 사용된 프로토콜이 “HTTPS”, Xecure로 되어있는지 확인함
Guide 11. 중요한 트렌젝션이 일어나는 프로세스에 사용자의 비밀번호를 재확인 하도록 하자.
■사용자의개인정보변경프로세스에비밀번호를재확인하는루틴을추가할경우불법적인위장으로인한추가피해를줄일수있다.
■점검방법: 해당프로세스확인
Guide 12. 중요정보를 보여주는 페이지는 캐쉬를 못하게 설정하자.
■중요정보를 보여주는 화면에 no-cache 설정을 하지않을경우, 로그아웃을한 이후에도 [뒤로가기] 버튼을 사용해서 해당내용을
볼 수 있는 위험이 존재한다.
■점검방법: 중요 정보페이지를 열어본 후, 로그아웃을 한다. 웹브라우저의 “뒤로”버튼을 눌렀을때 이전내용이 보이는지 확인.
■조치방법: no-cache 설정을위해서HTML HEAD 부분에 아래내용을 추가한다.
<meta HTTP-EQUIV=“Pragma”CONTENT=“no-cache”>
Guide 13. 암호화를 올바르게 이해하고 사용하자.
■자체개발한 암호화 알고리즘 사용을지양하며, 공인된 암호화알고리즘(3DES, SEED, AES 등)을 사용하는것을 고려한다.
암호화키를 사용하지 않는 알고리즘은 암호화알고리즘이 아니라, 단순인코딩 알고리즘으로 기밀성을 보장할 수 없다.
암호화키는 소스에 hard-coding되어서는 안되며, 제한된 사람만이 접근이 가능하도록 해야한다.
Guide 14. 관리자 페이지는 내부에서만 접근이 가능하도록 하자.
■웹 사이트관리자를  위한  페이지가 존재할경우, 외부에서 접근이불필요하다면 내부특정IP에서만 접근할 수 있도록 통제해야한다.
■이를위해서 특정Directory에 관리자페이지들을 구성하고, 해당Directory에 접근제한을 적용한다.
■조치방법: Apache Web Server를 사용하는경우 httpd.conf에 아래내용을추가하면된다.
(관리자페이지가/lgsec/admin 아래저장되어있고, 관리자IP가192.168.0.101 인경우)
<Directory “/lgsec/admin”>
Deny from all
Allow from 192.168.0.101
</Directory>
Guide 15. 각언어에서 제공하는 보안수단을 이해한후 사용한다.
■Java
1) Java Class 역컴파일문제
Java 언어의Byte-code 특성으로 인하여Java class는 쉽게역컴파일이가능하다. 만약Java Applet에 중요정보(예, 원격지접속
을 위한ID/PASSWORD, DB Query, 직접제작한 암호화알고리즘, 프로그램로직 등) 를hard-coding 했다면, 이를 발견한공격자
는 해당정보를 악용할 수 있는위험이 존재한다. 따라서 외부로 전송되는 Java class 파일에는 중요정보를 hard-coding하는것을
지양해야 한다.
2) Secure Code guidelines (Sun Microsystems) -http://www.java.sun.com/security/seccodeguide.html
Sun Microsystems에서는Java 프로그램 개발시고려해야할 다양한 보안사항을 제공하고있다.
■ASP(Visual Basic, C++, C# 등을사용한모든ASP에적용)
1) include 파일을보호하자
2) Server.HTMLEncode
-용도: 특정문자열에 대한 HTML  encoding을 수행한다. 사용자가 입력한값으로 HTML 페이지를 구성하기전에 사용하면
Cross-Site Scripting 공격등에 효과적이다.
-적용가능한IIS : IIS 5.0 이상
-사용법
<%= Server.HTMLEncode(“<script>alert(document.cookie);</script>”) %>
-결과
&lt;script&gt;alert(document.cookie); &lt;/script&gt;
3) Server.URLEncode
4) Session.Abandon
-용도: Session 객체에 저장되어 있는 모든 정보를 삭제한다. 사용자 로그아웃 프로세스에 사용해서 기존세션정보를
보호하기위해서 사용할 수 있다.
-적용가능한IIS : IIS 5.0 이상
-사용법
<% Session.Abandon %>
■PHP
1) [PHP 4 이상] 환경설정(php.ini) 내용중register_global을 “on”으로 설정할 경우, PHP 스크립트의 변수값을 임의로 변경할 수
있는 취약성이 있다. 따라서 register_global은“off”로 설정한 후, $_GET, $_POST 문을 사용해서 사용자가 전달한값을 얻어야
한다.
register_global = off
2) PHP 스크립트오류를 사용자에게 보내지 않기 위해서 PHP 환경설정파일(php.ini)에서 아래와 같이설정한다.
log_errors = On
display_errors = Off
3) utf8_decode()
-용도: UTF-8 형식의입력값을ISO-8859-1 형식으로전환해준다. 필터링규칙을적용하기전에사용할것을권장한다.
-적용가능한PHP : PHP 3.0.6 이상
4) strip_tags()
-용도: 문자열로부터HTML 테그와PHP 테그를없앤다. 사용자가입력한값을HTML 화면에출력할경우사용해서
Cross-Site Scripting 공격을 대비할 수 있다.
-적용가능한PHP : PHP 3.0.8 이상
-사용법
A. strip_tags(‘<script>’); : 모든HTLL, PHP 테그를제거한다.
B. strip_tags(‘<script>’, ‘<script><iframe>’) : 첫번째인자로전달된문자열에서두번째인자로지정된테그를제거한다.
5) htmlspecialchars()
-용도: 특정문자열에 대한 HTML encoding을 수행한다. 사용자가 입력한값으로 HTML 페이지를 구성하기전에 사용하면
Cross-Site Scripting 공격대비를위해서사용할수있다.
-적용가능한PHP : PHP 3 이상
-사용법
htmlspecialchars(“<a href=‘test’>Test</a>”)
-결과
&lt;ahref=‘test’&gt;Test&lt;/a&gt;
6) addslashes()
-용도: DB Query와같이인용된부분앞에역슬래쉬를붙여서반환한다. 해당문자에는작은따옴표, 큰따옴표, 역슬래쉬,
NULL 이있다. SQL Injection 공격을위해서사용한다.
-적용가능한PHP : PHP 3 이상
7) include 파일을보호하자.
8) session_destroy
-용도: Session 객체에 저장되어있는 모든정보를 삭제한다. 사용자 로그아웃프로세스에 사용해서 기존세션정보를
보호하기 위해서 사용할 수 있다.
-적용가능한PHP : PHP 4 이상
Guide 16. 슈퍼 유저 계정을 사용한 코딩 금지
반드시 필요한 경우가 아니면 관리자 및 슈퍼 유저 계정을 사용하여 코딩을 하여서는 안 되며 개발 초기 단계에서 개발하고자 하는
어플리케이션에 특화된 계정을 사용하여 개발하여야 한다. 예를 들어 SQL 서버에 접속하는 어플리케이션일 경우 ‘sa’ 계정보다는
새로운 사용자 계정을 생성하여 개발하여야 한다.
Guide 17. 버퍼 오버플로우
대부분의 보안 취약점은 버퍼오버플로우 문제로 인해 발생한다. 버퍼오버플로우는 고정된 길이의 버퍼에 값을 쓸 때 버퍼의 경계값을 넘어서면서
발생하게 되는데 사용자 입력 값을 읽을 때나 프로그램 내에서 처리하는 중간에 발생한다. C언어와 C++언어는 버퍼오버플로우에 대한 보호기능을
제공하지 않으므로 CGI 프로그램을 작성할 때 아래의 사항들을 준수하여야 한다.
- strcpy(), strcat(), sprintf(), vsprintf(), gets()와 같은 함수는 경계값을 체크하지 않으므로 strncpy(), strncat(), snprintf(), fget()과 같은 함수로 대체하여야 한다.
- realpath(), getopt(), getpass(), streadd()와 같은 함수의 사용은 자제하고 최소한의 PATH_MAX 바이트 길이를 정해주는 getwd() 함수를 사용하도록 한다.
- scanf(), sscanf(), fscanf() 함수 사용시에는 읽어들일 수 있는 최고의 버퍼 길이를 명시해야 한다.
¤ 취약한 사용 예
char buffer[256];
int num;
num = fscanf( stdio, “%s”, buffer );
¤ 안전한 사용 예
char buffer[256];
int num;
num = fscanf( stdio, “%255s”, buffer );
- memcpy() 함수를 사용할 경우에는 복사할 대상의 크기를 체크하여야 한다.
¤ 취약한 사용 예
unsigned long copyaddress( struct hosten *hp )
{
unsigned long address;
memcpy( &address, hp->h_addr_list[0], hp->h_length );
}
¤ 안전한 사용 예
unsigned long copyaddress( struct hosten *hp )
{
unsigned long address;
if ( hp->h_length > sizeof( address ) )
return 0;
memcpy( &address, hp->h_addr_list[0], hp->h_length );
return address;
}
:
Posted by 라면스프
2010. 10. 3. 10:23

Tomcat과 Servlet, JSP의 관계 Enjoy/JSP2010. 10. 3. 10:23

출처 : http://blog.jidolstar.com/363


RPC(Remote Procedure Call)
다른 서버에 있는 함수를 호출해서 결과값을 리턴 받는 방식
참고 : 
http://en.wikipedia.org/wiki/Remote_procedure_call

RTMP(Real Time Messaging Protocol)
Adobe Flash Player와 서버간에 오디오, 비디오, 데이타를 스트리밍 하기 위해 개발된 프로토콜이다. 
참고 : 
http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol

SOAP(Simple Object Access Protocol)
일반적으로 널리 알려진 HTTP,HTTPS,SMTP등을 사용하여 XML기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 형태의 프로토콜이다. SOAP은 웹 서비스(Web Service)에서 기본적인 메시지를 전달하는 기반이 된다
참고 : 
http://ko.wikipedia.org/wiki/SOAP

AMF(Action Message Format)

BlazeDS와 LCDS에서 RemoteObject와 메시지 서비스는 AMF3(Action Message Format version 3)를 이용해 통신하게 된다. AMF는 Flash Player에서 리모팅 및 메시징 기술에 빠른 통신방법을 제공하기 위한 일종의 바이너리 데이타 형태라고 생각하면 되겠다. 그러므로 서버에 제작된 Java Beans 함수를 호출하여 그 결과를 객체(바이너리 형태)로 받을 수 있다.

AMF3를 이용하는 RemoteObject는 XML등을 이용하는 HttpService나 WebService보다 대용량 데이터 처리가 우수하다. 속도 테스트에 관련된 내용은 예전에 내가 쓴 
"수행속도종합테스트"를 참고하자.

참고 : 
http://en.wikipedia.org/wiki/Action_Message_Format

HttpService
- RPC통신방식으로 HTTP환경에서 GET/POST방식으로 서버에 요청에 따라 XML과 같은 Text형태의 데이터를 받는 방법
- ASP/JSP/PHP든 어떤 서버사이드 스크립트 언어를 써도 상관없다.

WebService
- RPC통신방식으로 HTTP환경에서 XML로 된 SOAP 메시지를 결과로 리턴받는 개방형 방식, WSDL규정에 따라 데이터를 얻어온다.
- 웹서비스가 가능한 애플리케이션과 연동된다.

Remote Service
- RPC통신 방식으로 HTTP환경에서 Java Bean를 호출하여 AMF방식을 통해 객체 데이터를 주고 받는 형식
- 대용량 데이터를 고속 처리하는데 적합하며 암호화가 가능함
- LCDS나 BlazeDS와 같은 웹애플리케이션이 돌아갈 수 있는 WAS환경에서만 가능

Message Service
- 클라이언트의 요청없이 서버에서 클라이언트 쪽으로 데이터를 보내줄 수 있는 방식
- 새로운 뉴스 리포팅이나 실시간 자동 데이타 업데이트 등에 쓰일 수 있다.
- RTMP환경에서 AMF방식으로 데이타를 주고 받는다.
- BlazeDS나 LCDS가 있어야 사용할 수 있다.

Data Management Service
- 클라이언트와 서버간에 데이터를 쉽게 동기화하기 위한 서비스다.
- 클라이언트가 수정한 데이터를 즉시 서버에 반영할 수 있다. 
- 서버에 수정된 데이터는 다른 클라이언트에도 즉시 반영된다.
- RTMP 및 HTTP 환경에서 AMF방식으로 데이터를 주고 받는다.
- LCDS가 있어야 사용할 수 있다.


JEE(Java Enterprise Edition) : Servlet/JSP,Mail,MQ,Corba,EJB,WS
JSE(Java Standard Edition) : JRE+JDK
J2EE는 JEE의 윗버전으로 Java 2 Enterprise Edition을 지칭한다.

WAS에 대해서 살펴보자. 도데체 Tomcat이 WAS인가 헷갈릴 때가 많은데 간단하게 정리하면 보통 WAS는 J2EE규약을 준수하여 구현했는가 일부만 구현했는가에 따라서 결정하게 된다.

WAS(Web Application Server) : JEE규약을 준수한 구현체, 종류로는 웹스피어, Web Logic, Sun JEE서버등
Web Container : JEE규약의 일부분(Servlet/JSP) 구현체, 종류로는 Tomcat, Resin,JRun 등

WAS의 중요한 기능중  Servlet/JSP Container와 EJB Container이 있는데 EJB Container로서의 역할비중이 크다. 하지만 Tomcat은 EJB Container에 대한 구현을 안했기 때문에 엄밀히 말해서 WAS라고는 하지 않는 것이 보통이다. 

WAS의 역할은 Web Server와 DB Server 사에 존재하는 미들웨어 역할을 하며 그 중간에 Web Application을 탑재하여 DB Server의 데이타를 사용목적에 맞게 가공하여 Web Server에 보내주는 역할을 한다. 

WAS를 사용하는 또 다른 이유는 분산환경을 만들기 위해서이며 분산환경의 가장 큰 이슈인 트렌잭션 처리를 적은 비용으로 효과적으로 처리하는 것을 목적으로 한다.


JDK와 JRE?

Tomcat 설치 중에 JRE 설치 경로를 설정하는 부분이 있을 것이다. 여기서 JDK와 JRE의 의미를 명확히 알아보자.

① JDK

    - Java Development Kit
    - 자바 애플릿이나 각종 응용 프로그램(어플리케이션)을 개발자들이 쉽게 만들 수 있도록 
       해주는 개발자용 도구.
    - 여러 운영체제 및 응용 프로그램(어플리케이션)과 연결시킬 수 있는 자바 응용 프로그램
      인터페이스(API)와 클래스 라이브러리, 자바 가상 머신 등을 포함.
    - 자바를 사용해서 자바 응용 프로그램을 개발할 수 있도록 해주는 도구입니다. 
    - 자바 파일을 컴파일할 수 있는 컴파일러를 포함한 부분

② JRE

    - Java Runtime Environment
    - 컴파일된 자바 프로그램을 실행할 수 있도록 해주는 환경. 
    - 자바 언어로 개발된 소프트웨어를 실행하기 위해 필요한 플랫폼. 
    - 자바를 이용해 개발된 소프트웨어는 어떤 플랫폼으로부터도 독립적인 형식
       (자바 바이트 코드)으로 배포되지만, 이것을 실행하려면 그 플랫폼을 해석할 수 있는 형식
       (native code)으로 변환해야 한다. 즉, 자바 실행 환경(JRE)은 이 변환과 실행을 행하는 
       자바 가상 머신과 그 주변의 소프트웨어이다.

요약하자면 JDK는 자바개발을 위한 도구이며 JRE는 자바로 작성된 응용프로그램을 실행하기 위한 환경이다. 

JDK = JRE + 개발에 필요한 실행파일(javac.exe등)
JRE = JVM(자바가상머신) + 클래스라이브러리(Java API) 

그러므로 JDK가 설치되면 JRE는 필요 없다고 해도 무방하며 Tomcat의 경우 설치하는 과정으로부터 JRE가 설치되어있어야 동작한다는 것을 알 수 있다.




Tomcat과 Servlet, JSP의 관계

Servlet과 JSP는 PHP와 ASP와 같이 서버에서 동작하며 DB에 접근하든지 비지니스 로직처리를 수행하기 위한 Java언어를 사용하는 Server Side Script 언어이다. 

Tomcat은 웹서버상에서 Java코드를 이용하기 위한 엔진 혹은 컨테이너이다. 즉, Java기반인 JSP, Servlet을 이해하기 위해 Tomcat과 같은 자바를 이용하는 엔진이 필요한 것이다.

Servlet은 Tomcat이 이해할 수 있는 순수 Java 코드로만 이루어진 웹서버용 클래스이다. 일반적인 Java 코드와 같으며 HTML형태로 출력하기 위해 print() 메소드 같은 것을 사용한다. 이 때문에 Servlet은 PHP와 ASP에 비해 코딩하기가 복잡하다. 이러한 단점을 보완하기 위해 나온것이 JSP이다. JSP는 PHP나 ASP처럼 HTML코드와 혼용되서 사용한다. Tomcat은 JSP코드를 컴파일할때 Servlet코드로 전환하여 컴파일을 진행하게 된다. 그래서 Tomcat을 Servlet/JSP 컨테이너라고 한다.





:
Posted by 라면스프
2010. 5. 18. 12:22

JSP 웹서버 세팅(tomcat6.0+apache2.2연동) Enjoy/JSP2010. 5. 18. 12:22


원문 : http://www.cyworld.com/CHERRY_PINK82/2661345





우선 기본적으로 apche2.2와 tomcat6.0이 설치 되어 있다는 전재하에 설명을 시작한다.

아참..그리고 이거대로 한다고 100% 다 되는건 아니다.. 꼭 자기 개발환경에 맞게 참고하여

수정하는게 중요하니 똑같이 뱃겨놓고 안되요...이러는건 아마츄어에요!ㅋㅋㅋ

 

1. apache2.2 Install

Apache 란? – 정적 파일의 웹 서비스를 담당하는 웹서버

Tomcat 자체적으로도 정적 파일 웹 서비스 기능이 있으나 속도가 느리기 때문에 정적 파일만을 전문으로

서비스하는 Apache 와 연동하여 역할을 분담하는 방식으로 주로 사용한다.

 


2. tomcat6.0  Install
Tomcat 이란? – 가장 유명한 JSP, Servlet Container
(Tomcat 을 설치하기 전에 반드시 먼저 JDK 가 설치되어 있어야 함)

 

 

3. JK 1.2 Install
JK Connector 란? - Apache + Tomcat 연동 프로그램

JK설치에는 동적모듈방식, 정적,모듈방식  두 가지 방법이 있는데 후자의 경우가 성능이 좋으나
지금 설치는 동적모듈 방식으로 설명한다.

 

www.apache.org ==> tomcat ==> tomcat_connectors ==> Binary Releases 에서
원하는 서버에 맞는 버젼을 다운받아 아래와 같이 "mod_jk.so"로 이름 변경 후  Apache2.2/modules 에 복사해 놓는다.

mod_jk-1.2.27-httpd-2.0.63.so ==> mod_jk.so 
mod_jk-1.2.27-httpd-2.2.10.so ==> mod_jk.so

 

4. workers.properties 생성
---------------------------------------------------------------------------------------------------------------------------
Apache2.2/conf 폴더안에  workers.properties 파일생성 후 아래 내용을 작성한다.
---------------------------------------------------------------------------------------------------------------------------
workers.tomcat_home="C:/Program Files/Apache Software Foundation/Tomcat 6.0"
workers.java_home="C:/Program Files/Java/jdk1.5.0_07"
ps=/

worker.list=ajp12, ajp13
worker.ajp12.port=8007
worker.ajp12.host=localhost
worker.ajp12.type=ajp12
worker.ajp12.lbfactor=1

worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp12, ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
worker.inprocess.cmd_line=start
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stder

 

 

5. mod_jk.conf 파일 생성
---------------------------------------------------------------------------------------------------------------------------
Apache2.2/conf 폴더안에  mod_jk.conf  파일생성 후 아래 내용을 작성한다.
---------------------------------------------------------------------------------------------------------------------------
JkWorkersFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/workers.properties"
JkLogFile "C:/Program Files/Apache Software Foundation/Tomcat 6.0/logs/mod_jk.log"
JkLogLevel debug
JkAutoAlias "C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps"
JkMount /* ajp13
JkUnmount /images/* ajp13
<Directory "C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps">
    Options Indexes FollowSymLinks
    allow from all
</Directory>

 

 

6. httpd-vhosts.conf(가상호스트 설정방법) 수정
---------------------------------------------------------------------------------------------------------------------------
Apache2.2/conf/extra 폴더안에  httpd-vhosts.conf 파일안에 내용추가
---------------------------------------------------------------------------------------------------------------------------
<VirtualHost 127.0.0.1:80>
    ServerAdmin hja1028@naver.com
    DocumentRoot "C:/workspace/rvsystem/web/"
    ServerName dev.rvsystem.com
    ErrorLog "logs/rvsystem-error.log"
    CustomLog "logs/rvsystem-access.log" common
 JkUnmount /images/* ajp13
 JkUnmount /scripts/* ajp13
 JkUnmount /css/* ajp13
 JkMount /* ajp13
</VirtualHost>

 

<주의사항>

  • 처음설정은 디폴트 호스트(DocumentRoot)로써 주로 비워두거나 테스트용도로 설정한다.
  •  [주의] 가상호스트로 사용하기 위해선 반드시 위에서 설정한 <Directory “/workspace”> 을 확인해야한다.
      이를 설정하지 않는다면 모든 가상호스트들 접속시 403에러(접근권한에러)가 난다.
  •  이후 추가되는 가상호스트는 같은 형식으로 추가 후 DocumentRoot와 ServerName만 수정

 

7. httpd.conf수정
---------------------------------------------------------------------------------------------------------------------------
Apache2.2/conf폴더안에  httpd.conf 파일안에 내용추가
---------------------------------------------------------------------------------------------------------------------------
<Directory "/workspace") - 접근권한 디렉토리명 변경

LoadModule jk_module modules/mod_jk.so


<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Satisfy all
</Directory>


Include conf/mod_jk.conf

 

 

8. server.xml 수정
<Connector port="8080"> 모두 주석처리 (아파치와의 커넥터(ajp13)만 사용)
<Connector port="8009"> URIEncoding="UTF-8" 추가. (GET request 한글처리)

 

첨부파일은 참고만 하세요 현재 제꺼에 맞춰논것들이라 그냥 쓰면 에러가 ~_~!

참 mod_jk.so 다운받으실 때 1.2.24버전 이후꺼 받으세여!ㅋㅋ

전 1.2.27버전이랍니다..

:
Posted by 라면스프
2009. 11. 6. 17:53

WshShell.Run Enjoy/JSP2009. 11. 6. 17:53


출처 : http://nazelm.egloos.com/938351

WshShell.Run
Dim WshShell : Set WshShell = WScript.CreateObject("WScript.Shell")
intError = WshShell.Run (strCommand [, intWindowStyle] [, bWaitOnReturn])
WshShell.Run strCommand [, intWindowStyle] [, bWaitOnReturn]
' cf, 반환값 없이 단독 실행시에는 괄호로 묶지 않는다.

- intError : Error code (실행결과로 해당 명령줄에 의해 실행된 프로그램이 반환하는 정수값)
- strCommand : 명령줄 문장
- intWindowStyle : Optional. ([]로 묶인 항목은 전부 선택항목)
0    Hides the window and activates another window.
1    Activates and displays a window.
     If the window is minimized or maximized, the system restores it to its original size and position.
     An application should specify this flag when displaying the window for the first time.
2   Activates the window and displays it as a minimized window. 
3   Activates the window and displays it as a maximized window. 
4   Displays a window in its most recent size and position.
     The active window remains active.
5   Activates the window and displays it in its current size and position.
6   Minimizes the specified window and activates the next top-level window in the Z order.
7   Displays the window as a minimized window. The active window remains active.
8   Displays the window in its current state. The active window remains active.
9   Activates and displays the window.
    If the window is minimized or maximized, the system restores it to its original size and position.
     An application should specify this flag when restoring a minimized window.
10  Sets the show-state based on the state of the program that started the application.

- bWaitOnReturn : Optional. Boolean Value(True / False, default is False)
명령줄에 의한 프로그램 실행이 완료될 때까지 기다릴 것인지 여부.
기본값은 False 이며, 생략시 해당 명령줄에 의한 프로그램 실행 여부와 상관없이
자동으로 0을 반환하고, 다음 스크립트가 계속 진행된다. (cf, 에러코드가 아닌 0을 반환)
cf, SendKey 메소드 등과 같이 쓸 때 True(기다림) 옵션을 적용해도 다음 스크립트가
    계속 진행된다. (SendKeys 에서의 순차실행 트릭 - 아래 Do While문 참조..)

WshShell.Run "%windir%\notepad" & WScript.ScriptFullName
intError = WshShell.Run("notepad " & WScript.ScriptFullName, 1, True)

Dim WshShell : Set WshShell = WScript.CreateObject ("WScript.Shell")
Dim oExec : Set oExec = WshShell.Exec("calc")

' 순차 실행 트릭 (Do While 문으로 Status 가 0 일 경우,
' = 프로그램 실행중 일 경우 Sleep으로 계속 창이 떠 있게 한다.)
Do While oExec.Status = 0
     WScript.Sleep 100
Loop

WScript.Echo oExec.Status
'  Status =  0  : The job is still running.
'  Status =  1  : The job has completed.


* 비교 : Run 과 Exec
'=> Run 은 실행만 하지만, Exec는 실행과 동시에 개체(object)를 생성한다.
'    따라서 Exec를 통한 실행은 생성된 개체를 이용한 후속 작업이 용이하다.

Set WshShell = Wscript.CreateObject("Wscript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
TempName = FSO.GetTempName
TempFile = TempName

WshShell.Run "cmd /c ping -n 3 -w 1000 157.59.0.1 >" & TempFile, 0, True
Set TextFile = FSO.OpenTextFile(TempFile, 1)
Do While TextFile.AtEndOfStream <> True
    strText = TextFile.ReadLine
    If Instr(strText, "Reply") > 0 Then
        Wscript.Echo "Reply received."
        Exit Do
    End If
Loop

TextFile.Close
FSO.DeleteFile(TempFile)


' 아래는 동일한 결과는 가지는 Exec 를 통한 실행이다.
' 실행을 통해 반환되는 StdOut 에 접근하기위해 임시파일 만들고 할 필요가 없다.

Dim WshShell : Set WshShell = WScript.CreateObject("WScript.Shell")
Dim ExecObject : Set ExecObject = WshShell.Exec ("cmd /c ping -n 3 -w 1000 157.59.0.1")
Do While Not ExecObject.StdOut.AtEndOfStream
    strText = ExecObject.StdOut.ReadLine
Loop

by 영산 | 2007/10/31 18:31 | WSH
:
Posted by 라면스프
2008. 11. 28. 11:12

[JSP&Servlet] web.xml Enjoy/JSP2008. 11. 28. 11:12

[2008.08.04] XML 구성#

icon?
display-name?
description?
distributable?
context-param*
filter*
filter-mapping*
listener*
servlet*
servlet-mapping*
session-config?
mime-mapping*
welcome-file-list?
error-page*
taglib*
resource-env-ref*
resource-ref*
security-constraint*
login-config?
security-role*
env-entry*
ejb-ref*
ejb-local-ref*

<resource-ref>#

<resource-ref>      
        <description>DB Connection</description>      
        <res-ref-name>jdbc/mte</res-ref-name>      
        <res-type>javax.sql.DataSource</res-type>      
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>


<servlet>, <servlet-mapping>#

<servlet>
    <servlet-name>pdmcis</servlet-name>
    <servlet-class>com.mococo.trace.PDMCISServlet</servlet-class>
    <init-param>
        <param-name>properties</param-name>
        <param-value>/WEB-INF/conf/velocity.properties</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>pdmcis</servlet-name>
    <url-pattern>/pdmcis/*</url-pattern>
</servlet-mapping>


<error-page>#

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/ErrorMsg.jsp</location>
</error-page>

<error-page>
    <error-code>500</error-code>
    <location>/ErrorMsg.jsp</location>
</error-page>


<session-config>#

<session-config>
    <session-timeout>20</session-timeout>
</session-config>

:
Posted by 라면스프