http 비연결성
tcp 연결성 : 프로세스 시작부터 종료까지 연결
2의 16승정도의 port 가 있고 1000개정도는 예약되어 있고,
연결되어 있으면 : client 가 요청을 보낼때 client 가 누군지 알고 있다.
http 는 : connectionless (비연결성이다)
요청할떄 연결이 된다. → client 에 응답을 보내면 연결이 끝는다.
서버입장에서는 누가 연결을 하는지 알 수가 없다.
http protocol 에서는 session , cookie 를 이용해서 처리를 한다.
웹기반 어플리케이션
HTTP 프로토콜의 특징
-
비연결성
- 요청을 보내고 응답을 받게 되면 서버와의 연결은 끊어진다.
- 서버로 재요청시 서버는 클라이언트가 누군지 알 수 있도록 session 과 cookie 를 이용한다.
-
웹브라우저는 서버로 요청시 해당 서버(도메인) 에 설정된 쿠키 값을 항상 같이 전송한다.
-
서버가 클라이언트가 누군지 식별할 때 사용
-
cookie : 브라우저에 저장되는 정보 : 누군지 알기 위한 규약으로 제공하는 것.
(쿠키 확인하는 법 개발자 도구 → application → Storage → Cookies )
-
-
java 기반 서버는 요청을 받게 되면 해당 요청의 쿠키 정보 중에
-
JSESSIONID 라는 쿠키가 있는지 확인한다.
-
JSESSIONID 쿠키가 없을 경우
서버는 신규 접속 요청이라고 판단, session 을 새롭게 만들고 응답을 생성할 때 session ID(SESSIONID) 를 응답 헤더에 포함하고
해당 응답을 받은 브라우저는 JSESSIONID 쿠키 값을 브라우저에 저장
-
JSESSION 쿠키가 있을 경우
JSESSIONID 에 해당하는 SESSION 을 사용 ( 기존 접속한 사용자로 인식한다. )
-
session 은 사용자다.
쿠키는 웹브라우저에 저장이 되고, 보안이 취약하다. delete 키를 통해서 지울 수도 있다.
-
동일한 웹브라우저에서 작업을 했지만 JSESSIONID 가 있고 없고에 따라서 새로운 사용자로 인식한다.
-
JSESSIONID 를 이름 변경할 수 있다.
-
웹에서 사용자(client) 란?
- 동일한 인물이 아니다.
- 웹에서 사용자란 웹브라우저를 의미한다.
- 시크릿모드 : 다른 유저로 인식을 한다.
- (탭추가는 제외 → 탭추가는 같은 유저로 인식을 한다. )
스코프 :
웹 어플리케이션에서 객체(속성)을 유지/공유하는 영역
속성 :
클라이언트의 요청을 처리하는 과정에서 SERVLET/JSP 사이에서 공유하는 정보(데이터를 공유하기 위해 사용)
- 기본스펙에서는 속성은 변경가능하지만 파라미터는 setPatameter 가 없다.
웹에서 제공하는 4개의 스코프
- page(pageContext) :
- jsp 페이지 내에서만 공유(유효한) 되는 영역(공간)
- (비유 : java 의 block 안에 선언된 지역변수 ex) 지역변수 if, for block 들)
- 해당 jsp 에만 유효한 공간
- request (HttpServletRequest) *****
- 요청이 처리될 때 까지만 유호한 공간
- 비유 : java에서의 지역변수
- 클라이언트의 정보가 유지되는 동안 공유되는 영역
- Dispatch (요청이 응답이 될 때까지 유효
- 비유 : page보다 더 넓은 범위의 지역변수
- session (HttpSession) *
- 세션이 유효한 동안만 유지되는 공간
- 클라이언트의 정보가 유지되는 동안 공유되는 영역(비유 : 인스턴스 변수)
- application (ServletContext) : 웹 어플리케이션 내에서 공유되는 객체의 영역 딱 1개만 유지되는 공간( 비유 : java 의 static 변수 )
실습
scope 객체 실습
실습 요구 사항
-
웹 브라우저로 다음 주소에 접속 localhost/scope(get방식)
-
해당 요청을 처리해줄 servlet 생성 ( kr.or.ddit.servlet.scope.Scope.java)
-
scopr.jsp 에서는 하나의 input xorm(name-scope) 와 submit 버튼 생성
-
전송 메소드는 post , 전송 주소는 /scope
-
Scope.java 의 dopost 에서는 요청 파라미터 중 scope 파라미터를 확인하여 request, session, application scope 에 다음과 같이 속성을 저장
request : 속성명 =request , 속성값 = scope파라미터값 + "_request" session : 속성명 =session , 속성값 = scope파라미터값 + "_session" application : 속성명 = application, 속성값=scope 파라미터값 + "_application"
-
속성 설정이 끝나면 webapp/jsp/scopeResult.jsp 로 forward
-
scopeResult.jsp 에서는 Scope servlet 에서 설정한 3개의 속성을 출화면에 출력하기
참고
scope 객체의 속성관련 메소드 속성 조회 : 스코프객체.getAttribute ("속성명") , 반환타입 : Object **비교 getParameter("파라미터명") , 반환타입 : String 속성 저장 : 스코프객체.setAttribute ("속성명" , "속성값" ), 반환타입 : void 속성 삭제 : 스코프객체.removeAttribute("속성명") , 반환타입 : void (규약에서는..) 속성 이름 검색 : 스코프객체.getAttributeNames() , 반환타입 : Enumeration (열거자) (참고 : iterator )
첫번째로 anotation - /scope 를 통해 Scope.java로 연결이 되면 doGet 메소드가 호출되어서 scope.jsp 로 이동한다.
scope.jsp
scope.jsp 에서 scope 값을 입력해서 form 타입을 doPost 로 보내주면 받은 값을 바탕으로 session 과 request 와 application 의 값을 설정해준다.
scope.result
scopeResult.jsp 로 가서 그 값을 출력해준다.
실습의 의미
-
봐야하는 값 : session, application , request 값이다.
-
각각이 가진 특징 :
session 값은
request : 요청이 끝나면 값은 사라진다.
application : java 에서 static 처럼 전체에 값이 공유된다.
session : 브라우저를 client 로 보고 브라우저를 변경하지 않는한 저장된다 ( 자동 session 값 소멸일때 제외하고 )
- 정상경로로 접근
- chrome 브라우저 접근
- localhost/scope 접속
- 최초 접속
- sujeong 값 입력 후 전송 버튼
- servlet 요청 → jsp 에서 값 얻기 → servlet 요청 → jsp 로 값 얻어오기
- servlet 요청없이 localhost/jsp/scopeResult.jsp 로 바로 요청
-
1번과 같이 Chrome 브라우저로 접근
-
localhost/jsp/scopeResult.jsp 로 바로 접속시
-
요청이 없음 null
-
session 은 같은 브라우저이기 때문에 저장이 됨
-
application : static 처럼 전체에 1개 저장이 되어 있다.
- 1번과 다른 edge 브라우저를 사용하여 접근
-
localhost/jsp/scopeResult.jsp 로 바로 접근시
-
요청은 없으니 null 저장된 session도 없어서 ( 새로운 브라우저는 새로운 client 로 인식) null
-
application 은 전역 1개로 인식
- 3번과 동일한 브라우저 사용 localhost/scope 로 접속
input 태그에 aurora 입력 후 전송
- 새로운 요청 생성 → request 도 입력한 이름을 반영
- session 도 새로운 client 로 인식( 새브라우저는 새로운 client)
- application 도 요청이 변경되서 새롭게 중첩되서 변경된다.
- 1번 브라우저와 동일한 브라우저 접속 ( 크롬 )
localhost/jsp/scopeResult.jsp 로 접속
- 요청이 없었고, session 은 같은 브라우저이기 때문에 저장된 값으로 쓰이고 application 은 저장된 값으로 만들어진다.
범위 참고
-클라이언트에서는 서버 사이드 변수 값을 활용할 수 있으나 서버 사이드 변수에 클라이언트 사이드 변수 값을 대입할 수는 없다.
<script>
var test = "<= request.getAttribute("request")" %> <br>
var test = "sally_application";
</script>
댓글
댓글 쓰기