-
33일차 - 내장 객체와 쿠키백엔드(웹 서버, WAS)/JSP 2024. 3. 8. 15:33
Web
■ HTTP 프로토콜을 통해서 정보를 주고 받는 시스템을 말한다
Client-Server
■ 자바 쓰레드, 소켓 통신으로 클라이언트와 서버가 직접 통신하여 정보를 주고받았다 (Client-Server)
■ 하지만 이용자 수가 늘면서 클라이언트 측의 수많은 연결을 감당하기 어려워지고 서버가 부담해야하는 역할이 너무 많았다
□ 데이터 관리 : Database
□ 클라이언트 간의 연결과 요청 및 응답 관리 : Web Server
□ 요청에 대한 처리 : WAS
2Tier(Client - WAS - DB)
WAS(TOMCAT, WEB LOGIC, JEUS)
■ 1티어 구조에서 서비스를 제공하는 코드를 구현하기 어려웠던 점을 간단하게 웹으로 처리할 수 있는 JSP 사용한다 JSP 를 JAVA 코드로 자동으로 변환해주는 서버가 TOMCAT 이다
3Tier(Client - WEB SERVER - WAS - DB)
WEB SERVER (APACHE)
■ 클라이언트와 서버간의 연결을 관리하고 요청이 들어오면 WAS 에 처리를 요청한 후 응답을 다시 클라이언트에게 전달한다
WAS의 내부 동작과정
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>01_Start</display-name> <!-- 서버가 켜지자 마자 읽는 파일 web.xml --> <!-- 서버에 접근하자 마자 찾는 파일 welcome-file-list --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
1. 클라이언트가 아이피, 포트, 서비스 이름으로 서버에게 요청한다
2-1. 요청한 페이지를 내부 로직을 통해 처리한 후 페이지를 보여준다
■ 웹 서비스의 web.xml 확인해 페이지를 찾아간다
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>01_Start</display-name> <!-- 서버가 켜지자 마자 읽는 파일 web.xml --> <!-- 서버에 접근하자 마자 찾는 파일 welcome-file-list --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
■ server.xml 에서 web server 는 아니지만 tomcat 이 서버 포트나 수용가능한 최대 인원수 등을 설정할 수 있다
<Connector connectionTimeout="20000" maxParameterCount="1000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> <!-- path 형태로 URL이 들어온다면 docBase 로 연결해라 --> <Context docBase="06_Session" path="/06_Session" reloadable="true" source="org.eclipse.jst.jee.server:06_Session"/></Host>
2-2. 요청한 페이지가 서버에게 없는 경우 404ERROR 페이지를 보여준다
Java Server Page(JSP)
■ 주로 동적인 웹 컨텐츠를 처리하는 목적으로 만들어진 스크립트 언어이다 HTML 와 JAVA 코드를 섞여서 사용할 수 있다
■ JSP 는 별도의 구동이 필요없다 컴파일이 필요없어 새로고침 한번으로 수정 사항이 적용된다
■ JSP 파일에서 Servlet 으로 Class 파일로 바뀌어 클라이언트 요청에 대한 처리가 실행된다
ScriptLet
내장객체
■ 내장객체란 JSP 페이지에서 미리 자주 사용하는 객체들을 정의해둔 인스턴스를 의미한다
■ 별도의 선언문 import 문이 없이 자유롭게 사용할 수 있다
□ 그렇다고 해서 정적으로 선언된 객체라는것은 아니고 컨테이너에서 미리 생성한 인스턴스이다
Request
■ 클라이언트가 서버에게 요청한 내용이 담겨있는 객체이다
□ request.getParameter(<JSP 요소의 이름>);
GET & POST
■ GET 방식은 인코딩시 UTF 로 되어 한글이 깨지지 않지만 POST 는 request.setCharacterEncoding("utf-8"); 해줘야한다
// 클라이언트로부터 전달받은 내용을 변수에 저장했다 String userName = request.getParameter("userName"); // 하나의 키에 대해 여러개의 값을 입력 받는다면 getParameterValues 메소드로 받을 수 있다 String[] hobbies = request.getParameterValues("hobby"); - JS 영역 // 쿼터로 감싸지 않는다면 js 는 문자열이 아닌 숫자 불린으로 인식하기 때문에 // 들어오는 데이터 타입에 맞추어서 적절하게 사용해야한다 var name = '<%=request.getParameter("userName")%>'; var gender = '<%=request.getParameter("gender")%>';
Response
■ 클라이언트의 요청에 대한 응답 정보를 담겨 있고 페이지를 만들 수 있는 객체이다
페이지에 출력하기
■ Out 객체는 JSP 페이지에 출력할 내용을 담고 있는 출력 스트림이다
■ response를 이용해 만들어진것이 out 객체이므로 우선순위가 response 먼저이므로 출력이 더 빠르다
<!-- 페이지 출력은 총 3가지 방법이 있다 --> <%="<p>첫번째, 스크립틀릿 출력문을 이용한 방법</p>" %> <% out.print("<p>두번째, out 객체를 이용한 방법</p>"); %> <!-- response 객체로 이용한 방법이 속도가 빨라 먼저 출력되었다 --> <% response.getWriter().write("세번째, response 객체를 이용한 방법"); %> <!-- out 객체는 response 의 자식이다 그렇기 때문에 response 보다 느리다 스크립틀릿 출력문은 out 객체로 만들어졌다 그러므로 둘의 속도는 같다 그러므로 코드 순서에 따라서 위에 있는 스크립틀릿이 찍힌다 response > scriplet == out response, out, : java 영역 스크립틀릿 출력문 : html 영역 결론 -> 출력 방식을 섞어서 쓸때에는 순서에 주의하자 -->
페이지 이동하기
response.sendRedirect(<이동할 페이지 경로>);
Session
■ jsp 와 java 로 만 제어가능 하고(server side program) 클라이언트가 아닌 서버에 저장되어 보안성이 우수하다
■ 자바 오브젝트로 저장할 수 있어 모든 데이터타입이 들어갈 수 있어 처리하기 편리하다
■ 서버에 접속하면 세션이 생성되어서 따로 선언하지 않아도 된다
□ 세션 정보가 탈취되는 경우 세가지
1. 무작위 공격
2. 내부자 배신(되게 많다) <- 퇴사 후에 비밀번호 쳐봤는데 오 됏네?
3. 내부 네트워크에 연결된 클라이언트가 해킹당함
Session CRD
■ 세션은 서버에 접속하면 생성되어서 일련번호가 클라이언트에게 부여된다
■ 서버를 떠나거나 임의적으로 지울때까지 유지된다 또는 기본 30분이나 지정된 시간동안 아무런 동작을 하지 않으면 세션을 새로 부여한다
// -- 세션 생성 -- // 세션은 서버에 접속하면 생성되어서 일련번호가 클라이언트에게 부여된다 System.out.println(session.getId()); // -- 세션 유효시간 설정 -- session.setMaxInactiveInterval(10); System.out.println(session.getMaxInactiveInterval() + "초"); // -- 세션 초기화 -- // 세션 초기화의 경우는 완전히 다른 세션을 다시 받는다 session.invalidate(); // -- 세션에서 특정 키의 값을 저장 -- // session 에 name 이라는 이름으로 "kim,jeong-won" 이라는 값을 저장한다 // key 는 문자열로 value 는 자바의 어떤 데이터타입이든 넣을 수 있다 session.setAttribute("name", "kim, jeong-won"); // -- 세션에서 특정 키의 저장된 값 확인 -- // 세션에 저장된 값을 확인하는 방법 String name = (String) session.getAttribute("name"); // -- 세션에서 특정 키-값을 삭제 -- // session 으로부터 특정한 Attribute 를 삭제시킨다 session.removeAttribute("name");
Cookie
■ 브라우저를 닫거나 컴퓨터가 종료되어도 쿠키에 정보가 남는다 되게 위험하다 왜냐하면 다른 사용자가 이 컴퓨터를 사용하면 사이트에 로그인된 상태라면 마음대로 접속하기 때문에 공용으로 사용하는 PC에서는 보안에 취약하다
Cookie CRD
■ 클라이언트에 저장되어서 서버가 부담해야하는 자원이 줄어든다
■ 쿠키 생성시 값에 , 나 - 가 있으면 에러가 난다
□ 문자열, 문자열 배열로만 저장할 수 있어 문자열, 문자열 배열 key-vlaue 로 저장되기 떄문에 처리하는데에 제약이 있다
// -- 쿠키 생성 및 변경-- // cookie 는 PC에 저장이되므로 response 로 저장하고 request 로 가져온다 // 1. 쿠키 객체화(값에 , 나 - 가 있으면 에러가 난다) Cookie cookie = new Cookie("name","kim_jeong_won"); // key-value // 2. 쿠키의 유효 시간을 설정한다 cookie.setMaxAge(600); // 초 단위 // 3. 쿠키를 클라이언트(사용자 PC)에 저장 response.addCookie(cookie); // -- 쿠키 읽기 -- // 쿠키는 클라이언트로부터 받아와야하므로 request 로 불러와야한다 // 쿠키는 중복된 이름이 사용 불가능하여, 여러 이름으로 저장된다 Cookie[] cookies = request.getCookies(); for(Cookie cookie : cookies) { cookie.getValue() } // -- 쿠키 삭제 -- // 삭제할 쿠기 값을 임시로 담을 변수 String val = ""; // 1. 클라이언트에 저장되어 있는 쿠키들을 가져온다 F12 로 확인하자 Cookie[] cookies = request.getCookies(); // 2. 쿠키들 중에서 삭제할 쿠키를 찾는다 for (Cookie c : cookies) { if (c.getName().equals("lang")) { val = c.getValue(); // 2-1. 쿠키 삭제 (쿠키의 수명을 0초로 변경한다) c.setMaxAge(0); response.addCookie(c); break; } }
1. SERVER CLIENT 는?
클라이언트는 서버에게 요청하고 서버는 요청에 대한 정보를 처리한 후 다시 응답을 클라이언트에게 보낸다
2. REQUEST, RESPONSE 객체는 무엇인가요?
Request, 클라이언트와 요청 정보에 대한 모든 정보가 담겨있는 내장 객체이다 Response 는 반대이다
3. TOMCAT 이 뭐죠?
Web Application Server 중 하나이고 JSP 페이지에서 JAVA 코드를 자동으로 변환해준
4. 2티어 구조는?
브라우저 - WAS - DB
5. 6. web.xml 과 server.xml 의 내용은?
WEB.XML 에는 서버에 처음 접근할때 보여줄 페이지들의 목록이 담겨있다
SERVER.XML 에는 서버의 포트나 최대 수용가능한 이용자의 수를 설정할 수 있다
7. 스크립트릿 표현방식 네가지
<% %> 자바 코드의 영역이다
<%@ %> JSP 페이지의 속성을 정의할 수 있는 영역이다
<%! %> 주로 함수의 선언할 수 있는 영역이다 변수도 가능
<%= %> 변수와 함수의 출력, 반환 결과를 출력하는 영역이다
8. request 가 뭐죠?
클라이언트와 요청한 내용의 모든 정보를 담은 내장객체이다
9. request 가 담고 있는 내용은?
10.request.getParameter 가 여러개 못받아올때 어떤 메서드를 사용해야할까?
getParameterValues()
11. request 에서 쿼터를 어떤 경우에서는 감싸주고 아닌 경우는 둘다 설명하세요
감싸주고 있으면 String 으로 인식하고 반대의 경우는 정수형 아님 불린으로 인식한다
12. 내장객체란?
내장객체란 클라이언트와 서버간에 자주 주고 받는 정보들을 미리 객체화한 객체들을 의미한다
13. response 객체란?
14. response 출력시 우선순위는?
response 에서 출력과 관련된 속성과 기능들을 모아서 만든것이 out 객체이고 그 out 객체를 스크립트릿가 사용하기 때문에 response 가 우선순위가 먼저이므로 out 객체와 스크립틀릿이 나중에 출력된다
15. session 과 쿠키의 저장방식 차이점과 보안성은?
세션은 서버에 저장되어 악의적인 공격자가 서버를 해킹하는 방법말고는 없다 반대로 쿠키는 클라이언트에 저장되므로 다른 사용자가 피씨를 사용한다면 보안에 매우 취약하다
'백엔드(웹 서버, WAS) > JSP' 카테고리의 다른 글
JSP 토막 정리 (0) 2024.03.19 34일차 - scope, mvc, java bean (0) 2024.03.11 32일차 - JSP 환경 설치 (0) 2024.03.07