일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- object
- toString
- Keep-Alive
- clone
- unmodifiableList
- Transfer-Encoding
- singleton
- Session
- Reference
- Java
- http/1.1
- Content-Length
- urlclassloader
- cookie
- InvocationHandler
- http
- chunked
- getRequestURI
- reflection
- Proxy
- Today
- Total
pungjoo
Cookie, Session 그대의 의미는.. 본문
http는 비연결 지향적인 protocol인 관계로 client와 server가 서로를 인지할 수 없는 구조입니다. 이런 비연결 상태에서 client와 server간에 "너가 너냐"라는 것을 알수 있게 다음과 같은 방법이 생겼습니다.
예) http:// localhost/view.jsp?id=pungjoo
예) set-cookie: id=pungjoo / cookie: id=pungjoo;
예) set-cookie: JSESSIONID=GI4DEMBYGU2DAMRQ;
설명드리려 하는 부분은 2~3번에 해당 하는 항목이며, 이는 Web 보안이라는 화두속에서는 항상 언급되는 사항입니다.
위 2~3번 항목을 통해서 login 정보를 취득해 비정상적으로 login을 시켜 보고 이런 문제점을 보완하는 방법을 알아 보겠습니다.
1. Request의 header/body
web browser의 주소창에 url을 입력하거나 link를 click시에 server로 전송되는 내용을 request라고 합니다. 또한 request를 약간 세부적으로 분리해 보면, request는 header와 body로 나뉘어지는데 header는 target이 되는 server에 요청하고자하는 location 등등이 들어가며 body에는 form tag의 method가 post의 경우일때 입력된 값을 담게 됩니다.
예를 들어 보겠습니다. http:// siyeon/view.jsp?id=pungjoo 일 경우 아래와 같이 세부적으로 보내지게됩니다.
우선 붉은 색으로 표기된 부분만 생각해 보면
GET
http:// siyeon.com/view.jsp?id=pungjoo <-- 녹색 처럼 요청될 수도 있습니다. 즉 /view.jsp?id=pungjoo
HTTP/1.1
Host : siyeon.com
위와 같이 web browser에서 header를 만들어 siyeon.com server의 80port에 값을 전달하게됩니다. 그럼 이제 form tag의 POST method로 보낼 경우는 어떻게 세부적으로 보내는지 보겠습니다.
GET방식하고 비슷하나 차이가 2개가 나타납니다.
- GET /view.jsp?id=pungjoo 부분이 POST /view.jsp 로 parameter가 없고
- 하단에 body영역이라는 부분에 id=pungjoo 즉, parameter로 구분되어 보내지게됩니다.
여기서 주목해야할 사항이 있습니다. ( 본 글은 protocol을 설명하는 글이 아니므로 깊은 내용은 향후에 작성해 올리 겠습니다. )
- get 방식으로 값을 전달할 때는 길이의 제한이 있더라..
경험상으로 첨부file을 보낼 때는 우리네들은 get가 아닌 post로 그래서 보내지요 - get 방식으로 보낼 때 한글이 깨지는데 POST로 보내면 한글이 깨지지 않더라
2. Response의 header/body
request가 server에 도착해서 어떤 가공이되어 client로 보내질 내용을 response라고 하는데 이 response도 header/body로 분리되어 전송되게 됩니다. header에는 일반적으로 statue code, set-cookie 등등의 정보가 기술되고 body부분에는 우리가 눈으로 자주 접하는 html code가 전송되게 됩니다.
위 내용은 아래와 같이 browser에서 표기됩니다.
3. Request/ Response에서의 cookie
cookie를 생성하는 곳은 client에서도 가능하고 server에서도 가능합니다. client에서 cookie를 생성하게 될 경우는 별도의 server와 생성을 위한 교류는 필요하지 않지만 server단에서 cookie를 생성하게 되면 아래 푸른색으로 표기된것과 같이 Set-Cookie라는 정보를 header를 통해서 client에 전송하게 됩니다.
즉, client는 response에 Set-Cookie라는 부분이 있으면 browser에 cookie 정보를 설정합니다.
반대로 client에서 갖고 있는 cookie는 server로 어떻게 전송되는지 보겠습니다.
Response에서 Set-Cookie: JSESSIONID=05E3694A27BF433163FE3BF45472A2E6를 보내고 browser는 특별한 경우가 아니라면 아래 푸른색 처럼 사용자가 원하지 않더라도 browser는 강제로 매번 server에 전송할 header에 넣어서 보내게 됩니다. 매번..
4. WAS에서의 session & cookie
was는 client(browser)가 접근하면 was에서 발행하는 cookie key를 찾고 key가 없으면 가급적 강제로 cookie를 하나 생성합니다. 일반적으로 그 key의 name은 JSESSIONID(java계열)로 칭하게되나 name은 임의 변경이 가능합니다. 발행한 cookie와 was에서 관리하는 session과 mapping을 합니다.( 이 부분은 was engine이 알아서 하는 부분입니다. )
이렇게 하므로 code에서 session 객체에 정보를 담았을 경우 다음번 request에 대해서 동일한 client라고 인지하고 적법한 session 객체에 접근 할수 있도록 유도해 줍니다.
흐름을 그려 보면 아래와 같습니다.
5. 정리
어쩌구 저쩌구.. 진행중..