IP주소를 얻기 위해 알아야할 이론적인 부분을 먼저 정리해 보았다.


Proxy(프락시) 서버

 프락시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터나 응용프로그램을 가리킨다. 서버와 클라이언트 사이에서 중계기로서 대리로 통신을 수행하는 기능을 'Proxy(프락시)', 그 중계기능을 하는 것을 프락시 서버라고 한다.


 프락시 서버는 요청된 내용들을 캐시를 이용하여 저장해둔다. 캐시 안에 있는 정보를 요구하는 요청에 대해, 원격 서버에 접속하여 데이터를 가져올 필요가 없게 되어서 전송 시간을 절약할 수 있다. 즉, 불필요하게 외부와의 연결을 하지 않아도 된다는 장점이 있다. 또한 외부와의 트래픽을 줄이게 됨으로써 네트워크 병목 현상을 방지하는 효과도 얻을 수 있게 된다.


출처 - 위키백과 https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%EC%84%9C%EB%B2%84




Proxy(프락시) 환경에서 client IP를 얻기 위한 X-Forwarded-For(XFF) http header

 XFF는 http 헤더 중 하나로, http server에 요청한 client의 IP를 식별하기 위한 사실상의 표준이다.


 웹 서버나 WAS 앞에 L4같은 로드밸런서, 프록시 서버, 캐싱서버 등이 있을 경우, 웹 서버/WAS에 http나 전용 프로토콜로 요청을 보낸 후에 받은 결과를 가곡하여 클라이언트에 재전송하게 된다. 이로 인해, 처리한 웹 서버나 WAS에서 request.getRemoteAddr() 등으로 클라이언트 IP를 얻을 경우 L4나 Proxy의 IP를 얻게 되는데 이는 원하는 결과가 아니다.


 X-Forwarded-For는 이 문제를 해결하기 위해 사용하는 http header이다. 콤마를 구분자로 client와 proxy IP가 들어가므로 첫 번째 IP를 가져오면 클라이언트를 식별할 수 있다.

1
X-Forwarded-For: client, proxy1, proxy2
cs


 Web Server, WAS, L4, proxy 종류에 상관없이 client IP를 잘 가져오기를 바란다면 다음과 같은 순서로 IP를 얻어내야 한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String ip = request.getHeader("X-Forwarded-For");
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("Proxy-Client-IP"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("WL-Proxy-Client-IP"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_CLIENT_IP"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getRemoteAddr(); 
 }
cs


출처 - https://www.lesstif.com/pages/viewpage.action?pageId=20775886

화면전환 없이 데이터를 전송하기 위해 ajax를 사용하는 경우가 많다.


1. JSON 형태로 데이터 전송

1
2
3
4
5
6
7
8
9
$.ajax({
    url: '데이터를 보낼 곳 url',
    type: 'form 태그의 method 속성(post 또는 get)',
    data: {"변수1""변수1의 값",
        "변수2""변수2의 값"},
    success: function (data) {
            alert("데이터 전송이 성공적으로 끝났을 때 실행");
        }
});
cs


읽을 때에는 request.getParameter로 읽으면 된다.

1
2
String str1 = request.getParameter("변수1");
String str2 = request.getParameter("변수2");
cs




2. 폼 데이터를 한꺼번에 전송

1
2
3
4
5
6
7
8
9
var queryString = $('#폼id').serialize();
$.ajax({
    url: '데이터를 보낼 곳 url',
    type: 'form 태그의 method 속성(post 또는 get)',
    data: {"폼 데이터 변수 이름": queryString},
    success: function (data) {
            alert("데이터 전송이 성공적으로 끝났을 때 실행");
        }
});
cs


읽을 때에는 폼의 각 데이터 name값으로 꺼내 읽으면 된다.

예를들어,

- form

1
2
3
4
5
6
7
<form id="form1">
    <input type="text" name="user_name">
    <input type="text" name="user_phone">
    <input type="radio" value="Y" name="agree">
    <input type="radio" value="N" name="agree">
    <button type="button" onclick="sendFormUsingAjax()">보내기</button>
</form>
cs

이런 형태의 폼 데이터를 보낸다고 하자.

보내기 버튼을 클릭하면 sendFormUsingAjax()라는 javascript 함수를 실행하게 되고, 그 안에 ajax로 데이터를 보내는 코드를 작성해두었다고 하면, 그 코드가 실행될 것이다.


보내진 곳에서 데이터를 읽는 코드는

1
2
3
String user_name      = request.getParameter("user_name");
String user_phone = request.getParameter("user_phone ");
String agree    = request.getParameter("agree");
cs

form 안의 각 요소들의 name속성의 값으로 읽으면 된다.



3. 체크박스 데이터 등 배열 형태로 데이터 전송

배열 형태의 데이터를 전송할 때에는 배열데이터를 직렬화하는 코드를 작성해야 한다. ( jQuery.ajaxSettings.traditional = true )

1
2
3
4
5
6
7
8
9
10
var array = {1,2,3,4,5};
jQuery.ajaxSettings.traditional = true;
$.ajax({
    url: '데이터를 보낼 곳 url',
    type: 'form 태그의 method 속성(post 또는 get)',
    data: {"배열변수": array},
    success: function (data) {
            alert("데이터 전송이 성공적으로 끝났을 때 실행");
        }
});
cs

이런 형식으로 보내고, 데이터를 읽을 때에는 배열형태의 변수를 만들고 같은 방식으로 읽으면 된다.

http://conol.tistory.com/23


http://www.homejjang.com/05/meta.php

'' 카테고리의 다른 글

[java]client IP(접속자 IP) 가져오기  (0) 2018.08.07
[ajax]데이터 전송  (0) 2018.07.16
[html]input text에서 엔터누를 때 새로고침  (0) 2018.07.11
[commons-fileupload]파일 업로드  (0) 2018.07.02
[html]a태그 onclick 사용하기  (0) 2018.06.29

엔터 클릭 시 특정 함수가 실행되게 하고싶으면 input태그 안에 onkeypress속성을 추가하면 된다.

1
<input type="text" onkeypress="if(event.keyCode==13){자바스크립트 함수 이름();}">
cs

키보드를 눌렀을 때, 그 키의 코드가 13번(엔터)이면, '자바스크립트 함수 이름'을 실행하라는 코드이다.


하지만 form 태그 안에 input(type=text) 태그가 한 개 들어있을 때, 엔터를 누르면 자동으로 submit되는 현상이 발생해서 화면이 새로고침 된다.

저 경우에도 함수 실행 후에 submit이 한 번 더 되어서 페이지가 새로고침 되었다.

이를 막기 위해서는 form 태그에 아래 코드처럼 onsubmit속성을 추가하면 된다.

1
2
3
<form onsubmit="return false">
    <input type="text" onkeypress="if(event.keyCode==13){자바스크립트 함수 이름();}">
</form>
cs


이렇게 하면 엔터키를 눌러도 submit이 자동으로 되지 않는다.


** input태그가 여러개 있을 때에는 엔터키 눌렀을 때 자동submit이 동작하지 않는다!!!

'' 카테고리의 다른 글

[ajax]데이터 전송  (0) 2018.07.16
[html]head태그 안의 meta태그(링크첨부)  (0) 2018.07.11
[commons-fileupload]파일 업로드  (0) 2018.07.02
[html]a태그 onclick 사용하기  (0) 2018.06.29
[html]html 특수문자 표(펌글)  (0) 2018.06.28

commons-fileupload 라이브러리를 통한 파일 업로드를 구현하기 위해서는 라브러리를 다운받아 lib폴더에 넣어주어야 한다.


commons-fileupload-버젼.jar    ( 주소 : http://commons.apache.org/proper/commons-fileupload/ )

commons-id-버젼.jar               ( 주소 : http://commons.apache.org/proper/commons-io/ )



1. 입력 폼 만들기

1
2
3
4
5
6
<form id="go_form" name="go_form" method="post" enctype="multipart/form-data" action="img-upload.jsp">
    이름<input type="text" placeholder="이름을 입력하세요" name="user_name" maxlength="20" id="user_name">
    파일<input type="file" id="user_img" name="user_img">
    <button type="button" id="delFile" onclick="del_file()">파일 삭제</button>
    <button type="submit">submit</button>
</form>
cs

- 입력폼의 method를 POST로 지정하고, enctype 속성의 값을 multipart/form-data로 설정한다.

  사진, 동영상 등 글자가 아닌 파일은 모두 Multipart 형식의 데이터이다. 따라서 파일 업로드 시 enctype 설정을 꼭 해야한다.

- 파일 업로드와 함께 텍스트 형식의 폼 데이터도 함께 전송한다.

- 파일 삭제 버튼을 누르면 업로드했던 파일이 삭제된다.


2. img-upload.jsp에서 요청을 받아 처리한다.

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
41
42
43
44
45
46
47
48
<%
    // request로 들어온 데이터 저장할 변수 선언
    Map<StringString> user = new HashMap<StringString>();
 
    // 이미지는 서버에 저장
    String saveDir = application.getRealPath("/image/"); // 저장할 경로 지정
 
    // 유효한 request인지 확인
    boolean isMultipart = FileUpload.isMultipartContent(request);
    String fileName = ""// 업로드한 파일의 이름을 저장할 변수 설정
 
    try {
        if(isMultipart) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
 
            // 파일 업로드 핸들러 생성
            ServletFileUpload upload = new ServletFileUpload(factory);
 
            // 한글 인코딩
            upload.setHeaderEncoding("UTF-8");
 
            // request parsing
            List<FileItem> items = upload.parseRequest(request);
            Iterator<FileItem> iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = iter.next();
 
                // 한글 인코딩
                item.getString("UTF-8");
 
                if (item.isFormField()) {
                    // file 형식이 아닐 때
                    String name = item.getFieldName(); // 필드 이름
                    String value = new String((item.getString()).getBytes("8859_1"),"utf-8"); // 필드 값, 한글 인코딩
                    user.put(name,value);
                } else {
                    // file 형식일 때
                    fileName = new File(item.getName()).getName();
                    File storeFile = new File(saveDir + "/"  + fileName);
                    user.put("user_img",fileName);
                    // saves the file on disk
                    item.write(storeFile);
                }
            }
        }
    }
    catch ( Exception e ) { System.out.println(e); }
%>
cs

- ServletFileUpload.isMultipartContent(request) : 전송된 데이터가 multipart/form-data형식으로 전송되었는지 여부 확인

- multipart/form-data 형식으로 넘어온 경우 기존의 request.getParameter("name") 방식으로 값을 꺼낼 수 없기때문에 위의 방법 사용

- FileItem 클래스는 multipart/form-data로 전송된 파라미터 또는 파일 정보를 저장하고 있는 클래스이다.



FileItem 클래스가 제공하는 메소드


메소드 

리턴타입 

설명 

isFormField() 

boolean 

파일이 아닌 일반적인 입력 파라미터일 경우  true를 리턴한다.

getFieldName()

String 

파라미터 이름을 구한다. 

getString()

String 

기본 캐릭터 셋을 사용하여 파라미터의 값을 구한다. 

getString(String encoding) 

String 

지정한 인코딩을 사용하여 파라미터의 값을 구한다.

getName() 

String 

업로드한 파일의 (경로를 제외한) 이름을 구한다.

getSize() 

long 

업로드한 파일의 크기를 구한다. 

write(File file) 

void 

업로드한 파일을 file이 나타내는 파일로 저장한다. 

getInputStream()

inputStream

업로드한 파일을 읽어오는 입력 스트림을 리턴한다.

get()

byte[]

업로드한 파일을 byte배열로 구한다.

isInMemory

boolean

업로드한 파일이 메모리에 저장된 상태인 경우 true를 리턴하고, 임시 디렉터리에 파일로 저장된 경우 false를 리턴한다. 

delete()

void

파일과 관련된 자원을 제거한다. 메모리에 저장된 경우 할당된 메모리를 반환하고 임시 파일로 저장된 경우 파일을 삭제한다.





참고 - https://m.blog.naver.com/PostView.nhn?blogId=javaking75&logNo=220056175936&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

a태그를 href가 아닌 onclick()을 사용하고자 할 때 방법 두 가지를 소개한다.


1. href를 막고 onclick 사용

<a href="javacsript:void(0); onclick='함수명(매개변수)'>a링크입니다</a>

href가 동작은 하지만 void(0)으로 사실상 동작을 안 하는 것처럼 보이고 onclick이 실행된다.



2. href에 경로설정을 하지 않고 onclick 속성 사용

<a href="#" onclick="함수명(매개변수);">a링크</a>

이런 형식으로 사용한다.


<a href="aaa.jsp" onclick="return 함수명(매개변수);">a링크</a>

이렇게 사용하는 경우, href에 설정한 경로로 이동하는 것보다 onclick이벤트가 먼저 실행된다. onclick 이벤트의 리턴값이 true이면 href로 연결된 링크로 이동하고, false이면 이동하지 않는다.




출처 - http://egloos.zum.com/pdw213/v/3493140

출처 - http://0taeng.tistory.com/31

HTML 상에서 특수문자가 제대로 나타나지 않을 수 있기 때문에 아래 문자들을 사용합니다.

표현문자

숫자표현

문자표현

설명

-

&#00;-&#08;

-

사용하지 않음

space

&#09;

-

수평탭

space

&#10;

-

줄 삽입

-

&#11;-&#31;

-

사용하지 않음

space

&#32;

-

여백

!

&#33;

-

느낌표

"

&#34;

&quot;

따옴표

#

&#35;

-

숫자기호

$

&#36;

-

달러

%

&#37;

-

백분율 기호

&

&#38;

&amp;

Ampersand

'

&#39;

-

작은 따옴표

(

&#40;

-

왼쪽 괄호

)

&#41;

-

오른쪽 괄호

*

&#42;

-

아스트릭

+

&#43;

-

더하기 기호

,

&#44;

-

쉼표

-

&#45;

-

Hyphen

.

&#46;

-

마침표

/

&#47;

-

Solidus (slash)

0 - 9

&#48;-&#57;

-

0부터 9까지

:

&#58;

-

콜론

;

&#59;

-

세미콜론

<

&#60;

&lt;

보다 작은

=

&#61;

-

등호

>

&#62;

&gt;

보다 큰

?

&#63;

-

물음표

@

&#64;

-

Commercial at

A - Z

&#65;-&#90;

-

A부터 Z까지

[

&#91;

-

왼쪽 대괄호

\

&#92;

-

역슬래쉬

]

&#93;

-

오른쪽 대괄호

^

&#94;

-

탈자부호

_

&#95;

-

수평선

`

&#96;

-

Acute accent

a - z

&#97;-&#122;

-

a부터 z까지

{

&#123;

-

왼쪽 중괄호

|

&#124;

-

수직선

}

&#125;

-

오른쪽 중괄호

~

&#126;

-

꼬리표

-

&#127;-&#159;

-

사용하지 않음

&#160;

&nbsp;

Non-breaking space

¡

&#161;

&iexcl;

거꾸로된 느낌표

&#162;

&cent;

센트 기호

&#163;

&pound;

파운드

¤

&#164;

&curren;

현재 환율

&#165;

&yen;

|

&#166;

&brvbar;

끊어진 수직선

§

&#167;

&sect;

섹션 기호

¨

&#168;

&uml;

움라우트

&#169;

&copy;

저작권

ª

&#170;

&ordf;

Feminine ordinal

&#171;

&laquo;

왼쪽 꺾인 괄호

&#172;

&not;

부정

­

&#173;

&shy;

Soft hyphen

?

&#174;

&reg;

등록상표

&hibar;

&#175;

&macr;

Macron accent

°

&#176;

&deg;

Degree sign

±

&#177;

&plusmn;

Plus or minus

²

&#178;

&sup2;

Superscript two

³

&#179;

&sup3;

Superscript three

´

&#180;

&acute;

Acute accent

μ

&#181;

&micro;

Micro sign (Mu)

&#182;

&para;

문단기호

·

&#183;

&middot;

Middle dot

¸

&#184;

&cedil;

Cedilla

¹

&#185;

&sup1;

Superscript one

º

&#186;

&ordm;

Masculine ordinal

&#187;

&raquo;

오른쪽 꺾인 괄호

¼

&#188;

&frac14;

4분의 1

½

&#189;

&frac12;

2분의 1

¾

&#190;

&frac34;

4분의 3

¿

&#191;

&iquest;

거꾸로된 물음표

A

&#192;

&Agrave;

Capital A, grave accent

A

&#193;

&Aacute;

Capital A, acute accent

A

&#194;

&Acirc;

Capital A, circumflex accent

A

&#195;

&Atilde;

Capital A, tilde

A

&#196;

&Auml;

Capital A, dieresis or umlaut mark

A

&#197;

&Aring;

Capital A, ring (Angstrom)

Æ

&#198;

&AElig;

Capital AE diphthong (ligature)

C

&#199;

&Ccedil;

Capital C, cedilla

E

&#200;

&Egrave;

Capital E, grave accent

E

&#201;

&Eacute;

Capital E, acute accent

E

&#202;

&Ecirc;

Capital E, circumflex accent

E

&#203;

&Euml;

Capital E, dieresis or umlaut mark

I

&#204;

&Igrave;

Capital I, grave accent

I

&#205;

&Iacute;

Capital I, acute accent

I

&#206;

&Icirc;

Capital I, circumflex accent

I

&#207;

&Iuml;

Capital I, dieresis or umlaut mark

Ð

&#208;

&ETH;

Capital Eth, Icelandic

N

&#209;

&Ntilde;

Capital N, tilde

O

&#210;

&Ograve;

Capital O, grave accent

O

&#211;

&Oacute;

Capital O, acute accent

O

&#212;

&Ocirc;

Capital O, circumflex accent

O

&#213;

&Otilde;

Capital O, tilde

O

&#214;

&Ouml;

Capital O, dieresis or umlaut mark

×

&#215;

&times;

Multiply sign

Ø

&#216;

&Oslash;

width="130"Capital O, slash

U

&#217;

&Ugrave;

Capital U, grave accent

U

&#218;

&Uacute;

Capital U, acute accent

U

&#219;

&Ucirc;

Capital U, circumflex accent

U

&#220;

&Uuml;

Capital U, dieresis or umlaut mark

Y

&#221;

&Yacute;

Capital Y, acute accent

Þ

&#222;

&THORN;

Capital Thorn, Icelandic

ß

&#223;

&szlig;

Small sharp s, German (sz ligature)

a

&#224;

&agrave;

Small a, grave accent

a

&#225;

&aacute;

Small a, acute accent

a

&#226;

&acirc;

Small a, circumflex accent

a

&#227;

&atilde;

Small a, tilde

a

&#228;

&auml;

Small a, dieresis or umlaut mark

a

&#229;

&aring;

Small a, ring

æ

&#230;

&aelig;

Small ae diphthong (ligature)

c

&#231;

&ccedil;

Small c, cedilla

e

&#232;

&egrave;

Small e, grave accent

e

&#233;

&eacute;

Small e, acute accent

e

&#234;

&ecirc;

Small e, circumflex accent

e

&#235;

&euml;

Small e, dieresis or umlaut mark

i

&#236;

&igrave;

Small i, grave accent

i

&#237;

&iacute;

Small i, acute accent

i

&#238;

&icirc;

Small i, circumflex accent

i

&#239;

&iuml;

Small i, dieresis or umlaut mark

ð

&#240;

&eth;

Small eth, Icelandic

n

&#241;

&ntilde;

Small n, tilde

o

&#242;

&ograve;

Small o, grave accent

o

&#243;

&oacute;

Small o, acute accent

o

&#244;

&ocirc;

Small o, circumflex accent

o

&#245;

&otilde;

Small o, tilde

o

&#246;

&ouml;

Small o, dieresis or umlaut mark

÷

&#247;

&divide;

Division sign

ø

&#248;

&oslash;

Small o, slash

u

&#249;

&ugrave;

Small u, grave accent

u

&#250;

&uacute;

Small u, acute accent

u

&#251;

&ucirc;

Small u, circumflex accent

u

&#252;

&uuml;

Small u, dieresis or umlaut mark

y

&#253;

&yacute;

Small y, acute accent

þ

&#254;

&thorn;

Small thorn, Icelandic

y

&#255;

&yuml;

Small y, dieresis or umlaut mark


'' 카테고리의 다른 글

[commons-fileupload]파일 업로드  (0) 2018.07.02
[html]a태그 onclick 사용하기  (0) 2018.06.29
[ASCII]아스키코드의 인코딩 값(펌글)  (0) 2018.06.28
[보안]xss와 sql injection  (0) 2018.06.15
[web server / was]아파치와 톰캣  (0) 2018.06.07

Character Encoding (ascii chart)


character encoding decimal
NULL %0 0
 %1 1
 %2 2
 %3 3
 %4 4
 %5 5
 %6 6
 %7 7
 %8 8
TAB %9 9
CR %A 10
%B 11
%C 12
LF %D 13
 %E 14
 %F 15
 %10 16
 %11 17
 %12 18
 %13 19
 %14 20
 %15 21
 %16 22
 %17 23
 %18 24
 %19 25
 %1A 26
 %1B 27
 %1C 28
 %1D 29
 %1E 30
 %1F 31
SPACE %20 32
! %21 33
%22 34
# %23 35
$ %24 36
% %25 37
& %26 38
%27 39
( %28 40
) %29 41
* %2A 42
+ %2B 43
, %2C 44
%2D 45
. %2E 46
/ %2F 47
0 %30 48
1 %31 49
2 %32 50
3 %33 51
4 %34 52
5 %35 53
6 %36 54
7 %37 55
8 %38 56
9 %39 57
: %3A 58
; %3B 59
< %3C 60
= %3D 61
> %3E 62
? %3F 63
@ %40 64
A %41 65
B %42 66
C %43 67
D %44 68
E %45 69
F %46 70
G %47 71
H %48 72
I %49 73
J %4A 74
K %4B 75
L %4C 76
M %4D 77
N %4E 78
O %4F 79
P %50 80
Q %51 81
R %52 82
S %53 83
T %54 84
U %55 85
V %56 86
W %57 87
X %58 88
Y %59 89
Z %5A 90
[ %5B 91
\ %5C 92
] %5D 93
^ %5E 94
_ %5F 95
` %60 96
a %61 97
b %62 98
c %63 99
d %64 100
e %65 101
f %66 102
g %67 103
h %68 104
i %69 105
j %6A 106
k %6B 107
l %6C 108
m %6D 109
n %6E 110
o %6F 111
p %70 112
q %71 113
r %72 114
s %73 115
t %74 116
u %75 117
v %76 118
w %77 119
x %78 120
y %79 121
z %7A 122
{ %7B 123
| %7C 124
} %7D 125
~ %7E 126
&127; %7F 127
%80 128
 %81 129
%82 130
ƒ %83 131
%84 132
%85 133
%86 134
%87 135
ˆ %88 136
%89 137
Š %8A 138
%8B 139
Œ %8C 140
 %8D 141
Ž %8E 142
 %8F 143
 %90 144
%91 145
%92 146
%93 147
%94 148
%95 149
%96 150
%97 151
˜ %98 152
%99 153
š %9A 154
%9B 155
œ %9C 156
 %9D 157
ž %9E 158
Ÿ %9F 159
%A0 160
¡ %A1 161
¢ %A2 162
£ %A3 163
¤ %A4 164
¥ %A5 165
¦ %A6 166
§ %A7 167
¨ %A8 168
© %A9 169
ª %AA 170
« %AB 171
¬ %AC 172
%AD 173
® %AE 174
¯ %AF 175
° %B0 176
± %B1 177
² %B2 178
³ %B3 179
´ %B4 180
µ %B5 181
%B6 182
· %B7 183
¸ %B8 184
¹ %B9 185
º %BA 186
» %BB 187
¼ %BC 188
½ %BD 189
¾ %BE 190
¿ %BF 191
À %C0 192
Á %C1 193
 %C2 194
à %C3 195
Ä %C4 196
Å %C5 197
Æ %C6 198
Ç %C7 199
È %C8 200
É %C9 201
Ê %CA 202
Ë %CB 203
Ì %CC 204
Í %CD 205
Î %CE 206
Ï %CF 207
Ð %D0 208
Ñ %D1 209
Ò %D2 210
Ó %D3 211
Ô %D4 212
Õ %D5 213
Ö %D6 214
× %D7 215
Ø %D8 216
Ù %D9 217
Ú %DA 218
Û %DB 219
Ü %DC 220
Ý %DD 221
Þ %DE 222
ß %DF 223
à %E0 224
á %E1 225
â %E2 226
ã %E3 227
ä %E4 228
å %E5 229
æ %E6 230
ç %E7 231
è %E8 232
é %E9 233
ê %EA 234
ë %EB 235
ì %EC 236
í %ED 237
î %EE 238
ï %EF 239
ð %F0 240
ñ %F1 241
ò %F2 242
ó %F3 243
ô %F4 244
õ %F5 245
ö %F6 246
÷ %F7 247
ø %F8 248
ù %F9 249
ú %FA 250
û %FB 251
ü %FC 252
ý %FD 253
þ %FE 254
ÿ %FF 255


출처 - https://grox.net/utils/encoding.html

'' 카테고리의 다른 글

[html]a태그 onclick 사용하기  (0) 2018.06.29
[html]html 특수문자 표(펌글)  (0) 2018.06.28
[보안]xss와 sql injection  (0) 2018.06.15
[web server / was]아파치와 톰캣  (0) 2018.06.07
[CORS-크로스 도메인]프로토콜 문제  (0) 2018.06.05

xss공격과 sql injection은 웹 해킹의 대표적인 기법이다. 이 두 가지 보안이슈에 대해 알아보았다.



XSS 공격 (Cross Site Scripting)

 CSS라고 말하는 곳도 있지만 CSS는 이미 Cascading Style Sheets의 약어로 쓰이고 있기 때문에 혼동을 방지하고자 보통 XSS라고 한다. XSS는 공격하고자 하는 사이트에 악의적인 스크립트를 삽입하여 비정상적인 페이지가 보이게 함으로써 타 사용자의 사용을 방해하거나 쿠키 및 기타 개인정보를 탈취하는 기버법이다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 메일과 같은 매체를 통해서도 전파된다.


 간단하게 id를 입력하면 해당 id를 출력해주는 사이트가 있다고 가정하자. 보통의 사용자는 id만을 입력하겠지만 입력창에 <script>alert(1);</script>를 입력하면 그대로 script가 실행되는것을 볼 수 있다. 이러한 형식으로 해커들은 쿠키정보 및 세션ID 획득, 악성코드 다운로드, 개인정보를 빼가는 거짓 페이지를 노출하는 등의 해킹을 할 수 있다.



SQL-Injection

 말 그대로 sql문에 의도적인 쿼리를 삽입하여 공격자가 원하는 데이터를 얻는 기법이다. 대표적으로 아이디와 패스워드를 입력하는 로그인 페이지를 타겟으로 sql 쿼리문의 true/false의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 true의 결과값이 나오게 하여 인증을 무력화시키는 기법이 있다. 로그인을 할 때 입력창에

' or 1=1--

' or 1=1#

' or 2>1--

등을 입력하면 이를 막아놓지 않은 사이트에서는 쿼리문이 항상 true가 되어 아이디와 비밀번호를 몰라도 로그인을 할 수 있게 된다.


 이외에도 많은 방법으로 데이터를 해킹한다. 아래 링크를 참고하면 좋을 것 같다.


참고 - http://mrrootable.tistory.com/25

웹 서버 - Web Server

클라이언트가 서버에 전달한 request를 받아 정적인 컨텐츠를 제곡하는 서버이다. 

ex) html, css를 통해 이미지를 띄우는 경우


request를 받아 가장 앞에서 요청에 대한 처리를 한다. 요청이 많을 경우 웹 서버에서는 웹 문서를, WAS에서는 JSP 페이지를 양분하여 처리해 서버의 부담을 줄여주는 역할도 한다.



WAS - Web Application Server

동적인 컨텐츠를 제공하는 서버이다. JSP 등의 처리를 한다.

ex) DB연동을 통해 데이터를 주고받거나 프로그램으로 데이터 조작이 필요한 경우

<출처 : http://mindols.tistory.com/86>



웹 서버 동작 프로세스

1. 클라이언트가 요청을 보낸다.

2. 웹 서버는 요청을 받고 정적인 컨텐츠이면 웹 서버에서 처리해 응답을 클라이언트에게 보낸다.


<동적인 컨텐츠 처리>

3. 정적인 컨텐츠가 아니라면 WAS로 요청을 보낸다.

4. 웹 서버로부터 요청이 오면 컨테이너가 받아서 처리한다.


<컨테이너가 받아서 처리하는 프로세스>

5. 컨테이너는 web.xml을 참조하여 해당 서블릿에 대한 쓰레드를 생성하고 httpServletRequest와 httpServletResponse객체를 생성하여 전달한다.

6. 컨테이너는 서블릿을 호출한다.

7. 호출된 서블릿의 작업을 담당하는 쓰레드(5번)는 doPost()또는 doGet()을 호출한다.

8. 호출된 doPost(), doGet() 메소드는 생성된 동적 페이지를 Response객체에 담아 컨테이너에 전달한다.

9. 컨테이너는 전달받은 Response객체를 HTTPResponse형태로 바꿔 웹 서버에 전달후 생성했던 쓰레드를 종료하고 httpServletRequest, httpServletResponse 객체를 소멸시킨다.


10. WAS에서 처리한 컨텐츠를 웹 서버가 받아 클라이언트에게 응답한다.



아파치 - Apache

 아파치는 소프트웨어 단체이다. 우리가 사용하는 '아파치 서버'는 아파치에서 후원하는 오픈소스 프로젝트 커뮤니티에서 만든 http 웹 서버를 지칭하는 것이다. html 등의 정적인 컨텐츠를 처리할 때 사용하는 웹 서버 중 하나이다.



톰캣 - Tomcat

 jsp 등의 처리를 할 때 사용하는 WAS중 하나이다. 즉, 동적인 컨텐츠를 처리할 때 사용한다. 톰캣에는 아파치의 기능(웹 서비스 데몬, Httpd)를 포함하고 있다.


<참고>

http://sungbine.github.io/tech/post/2015/02/15/tomcat%EA%B3%BC%20apache%EC%9D%98%20%EC%97%B0%EB%8F%99.html

http://jeong-pro.tistory.com/84

http://mindols.tistory.com/86

+ Recent posts