ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day49. 게시판 리뷰 기능, 쿠키/세션, JSP 주요객체
    기록 2022. 11. 14. 12:54

    글번호가 서버에 전달되어야 하는 이유 

    1. 리뷰 테이블에 글번호가 저장되어야 하기 때문에

    2. Board 테이블에 특정 글의 리뷰 갯수를 증가시켜 줘야 하기 떄문이다.

     

    확인해야 할 것

    1. form의 method와 action 확인

    method="post" action="addReview.jsp"

    2. 입력필드에 name이 뭐라고 되어 있는지 확인

    name=""

    3. submit 버튼이 무엇인지 확인

     

     

    항상 사용자가 보는 화면에서 서버로 요청을 보낸다.

    링크를 클릭하면 get방식의 요청

    입력폼에서 등록버튼을 클릭하면 post방식의 요청으로 요청메시지가 간다.

     

    모달창을 띄우는 경우에는 거의 대부분 게시글의 글 번호를 갖고 있어야 한다.

    어떤 게시글에 다는 리뷰인지가 필요하기 때문이다. 

    모달창의 hidden으로 boardNo가 전달되도록 함.

     


    HTTP 특징

    * 브라우저와 웹서버 사이에 교환되는 메세지의 형식을 정의한 프로토콜이다.

      * 요청메세지

        - 브라우저가 서버로 보내는 메세지

        - 요청라인(요청방식, 요청URL), 요청헤더(클라이언트 정보), 요청바디(폼입력값)로 구성된다.

      * 응답메세지

        - 웹서버가 브라우저로 보내는 메세지

        - 응답라인(응답코드), 응답헤더(웹서버 정보, 응답컨텐츠 정보), 응답바디(응답컨텐츠)로 구성된다.

    * 무상태(Stateless) 프로토콜이다.

      - 웹서버가 클라이언트의 정보를 유지하지 않는다.

      - 클라이언트가 요청을 보내고, 서버가 요청을 처리해서 응답을 보내고 나면 클라이언트와 웹서버간의 연결이 즉시 끊어진다. (클라이언트와 웹서버가 연결을 유지하지 않는다.)

      - 클라이언트는 요청을 보낼때마다 클라이언트의 정보(사용자를 식별할 수 있는 정보)를 서버로 보내야 한다.

         

    웹서버가 클라이언트의 정보를 유지하는 방법 제안

    * 쿠키

        - 서버에서 사용자 인증이 완료되면 해당 사용자정보를 쿠키로 만들어서 브라우저로 내려보내고, 브라우저는 쿠키정보(사용자정보)를 컴퓨터에 저장시킨다. 

        - 인증된 사용자 정보를 브라우저가 가지고 있다가, 요청을 할 때마다 매번 쿠키 정보(사용자정보)를 서버로 보내는 방식이다.

    * 세션

        - 서버에서 사용자 인증이 완료되면 해당 사용자정보를 세션객체에 담고, 해당 세션객체를 웹서버가 가지고 있는 방식이다. 브라우저에게 세션 아이디를 쿠키정보로 만들어서 내려보낸다.

        - 브라우저는 요청을 할 때마다 매번 세션아이디를 서버로 보내고, 웹서버에서는 세션아이디에 해당하는 세션객체를 조회해서 사용자정보를 획득하는 방식이다. 

        - 쿠키에 비해서 사용자 정보에 대한 보안이 우수하다. (세션아이디는 16진수 숫자로 되어있어서 훔쳐봤자 할 수 있는게 없다.)

     

    로그인하기 기능 (Cookie 방식) 

    login.jsp

    // 요청파라미터에서 아이디/비밀번호 조회한다.

    String id = request.getParameter("userid");

    String password = request.getParameter("userpassword");

    // 아이디로 사용자정보를 조회한다.

    UserDao userDao = new UserDao();

    User user = userDao.getUserById(id);

    // 사용자정보가 존재하지 않으면, 로그인 화면을 재요청하는 URL을 응답으로 보낸다.

    if (user == null) { 

       response.sendRedirect("loginform.jsp? error=fail");

       return;

    }

    // 비밀번호가 일치하지 않으면, 로그인 화면을 재요청하는 URL을 응답으로 보낸다.

    if (!user.getPassword().equals(password) {

        response.sendRedirect("loginform.jsp?error=fail");

        return;

    }

    // 쿠키를 생성해서 사용자정보를 저장하고, 응답으로 보낸다.

    Cookie cookie = new Cookie("loginId", id);          // Cookie cookie = new Cookie("쿠키 이름", "쿠키에 저장할 값")

    response.addCookie(cookie);

    // 로그인처리가 완료되면 재요청 URL을 응답으로 보낸다.

    response.sendRedirect("home.jsp");

    }

     

    * cookie는 Parameter와 달리 name, value 모두 하나씩밖에 담지 못한다.

    * cookie 형식은 보안에 취약하기 때문에 요즘은 로그인기능과 같은 개인정보를 주고받는 곳에 쓰이지 않는다.

    (yes24 최근 본 상품보기 등 노출되어도 상관없는 정보를 주고받는 곳에 쓰인다.)

    * 브라우저에서 응답을 받으면 쿠키정보를 파일로 저장한다.

      쿠키파일은 호스트정보와 만료시간을 같이 저장한다. 쿠키를 발행한 사이트를 접속할 때만 가져간다.

    * 처음에는 쿠키정보가 없지만 로그인을 하고 나면 쿠키정보를 내려받게 된다. 이후에는 요청(Request)을 할 때마다 쿠키정보(Cookie : loginId=hta)가 로드되어서 요청메세지에 담겨서 간다.

    그래서 한번만 로그인하면 그 다음부터는 아이디를 적을 필요가 없는 것이다.

    * 사용자의 컴퓨터에 인증된 사용자정보가 저장된다. 보안에 취약. 

     

    <title>sample-8</title>
    </head>
    <body>
    	<h1>쿠키를 이용해서 사용자정보를 서버로 전달하기</h1>
    	
    	<%
    		// 클라이언트에서 서버로 보낸 쿠키정보 조회하기
    		String searchOption = null;
    		String searchKeyword = null;
    		
    		// 요청객체에서 모든 쿠키정보를 조회한다.
    		Cookie[] cookies = request.getCookies();
    		// 조회된 모든 쿠키를 하나씩 검사한다.
    		for (Cookie cookie : cookies) {
    			// 쿠키의 이름을 조회한다.
    			String name = cookie.getName();
    			if (name.equals("search-opt")) {         // 쿠키의 이름이 search-option 인 경우
    				String value = cookie.getValue();    // 쿠키의 값을 조회한다.
    				searchOption = value;
    			} else if (name.equals("search-keyword")) {  // 쿠키의 이름이 search-keyword 인 경우
    				String value = cookie.getValue();        // 쿠키의 값을 조회한다.
    				searchKeyword = value;
    			}
    		}
    	%>
    	
    	<h3>최근 검색옵션과 검색어가 폼에 표시되도록하기(검색옵션과 검색어가 유지되게 하기)</h3>
    	<form method="get" action="sample-9.jsp">
    		<select name="opt">
    			<option value="" selected="selected" disabled="disabled"> 선택하세요</option>
    			<option value="title" <%="title".equals(searchOption) ? "selected" : "" %>> 제목</option>
    			<option value="author" <%="authoe".equals(searchOption) ? "selected" : "" %>> 저자</option>
    			<option value="publisher" <%="publisher".equals(searchOption) ? "selected" : "" %>> 출판사</option>
    			<option value="content" <%="content".equals(searchOption) ? "selected" : "" %>> 내용</option>
    		</select>
    		<input type="text" name="keyword" value="<%=searchKeyword != null ? searchKeyword : "" %>">
    		<button type="submit">검색</button>
    	</form>
    </body>
    <title>sample-9</title>
    </head>
    <body>
    	<h1>검색 결과를 출력한다.</h1>
    	
    	<%
    		String opt = request.getParameter("opt");
    	 	String keyword = request.getParameter("keyword");
    	 	
    	 	// 최근 검색옵션과 최근 검색어를 쿠키를 생성해서 저장한다.
    	 	Cookie cookie1 = new Cookie("search-opt", opt);
    	 	Cookie cookie2 = new Cookie("search-keyword", keyword);
    	 	
    	 	// 쿠키를 응답객체에 추가해서 응답메세지에 쿠키정보를 표현시킨다.
    	 	// 브라우저는 응답메세지로 전달받은 쿠키정보(최근 검색옵션과 검색어)를 쿠키파일로 저장한다.
    	 	// 브라우저는 쿠키만료되기 전까지 요청을 보낼 때마다 요청메세지에 쿠키정보를 포함해서 서버로 보낸다.
    	 	// 서버에서 실행중인 모든 JSP에서 필요한 쿠키정보를 조회해서 요청처리에 사용할 수 있다.
    	 	response.addCookie(cookie1);
    	 	response.addCookie(cookie2);
    	%>
    	
    	<h3>검색결과</h3>
    	<p>검색 옵션 : <%=opt %></p>
    	<p>검색 키워드 : <%=keyword %></p>
    </body>


    자바 서블릿 / jsp의 주요 객체

     

    애플리케이션 객체 : ServletContext

    - 웹서버가 시작될 때 생성되는 객체

    - 웹서버가 종료될 때 파괴되는 객체

    - 웹 애플리케이션 프로젝트 당 하나만 생성되는 객체

     

    세션 객체 : HttpSession

    - 클라이언트당 하나씩 생성되는 객체

    - 고유한 세션 아이디를 가지고 있다.

    - 해당 클라이언트에서만 자신의 세션객체를 사용할 수 있다.

    - 타임아웃 시간이 경과되면 파괴된다. 

     

    요청 객체 : HttpServletRequest, 응답객체 : HttpServletResponse 

    - 요청이 접수될 때 마다 생성되는 객체고, 응답이 완료되면 파괴된다.

    - 요청메세지와 응답메세지를 각각 담당한다.

    - 클라이언트가 서버로 보낸 요청메세지(요청정보, 요청헤더정보, 쿼리스트링, 폼입력값 등)는 톰캣이 분석해서 요청객체에 저장한다.

     

    페이지컨텍스트 객체 : PageContext

    - JSP 페이지당 하나 생성되는 객체다.

    - _jspService(request, response) 메소드 내부에서 생성되기 때문에 그 JSP에서만 사용할 수 있다. 

    - 위에서 나열한 다른 객체들을 제공하는 메소드가 있다. 

    - _jspService(request, response) 메소드 내부에서 PageContext객체를 먼저 생성하고, 그 이후에 ServletContext, HttpSession, ServletConfig, JspWriter등의 객체를 획득해서 변수에 저장한다.

    클라이언트의 고유한 객체인 세션아이디가 요청메세지에 들어있다.  

    HttpSession 객체를 새로 만들면 쿠키가 생성되고, 쿠키를 응답객체(HttpServletResponse)에 추가해서 브라우저에 내려보내면 쿠키파일을 생성한다.

    요청메세지의 헤더부분에서 세션아이디에 해당하는 HttpSession 객체가 있으면 getSession메소드는 session객체를 연결시킨다.

     

    처음 접속했을 때만 빼고 cookie가 있다.

    브라우저를 닫아버리면 즉시 쿠키파일(세션아이디)이 사라져버림. 만료시간이 정해져 있다.

    브라우저만 안닫으면 세션객체를 계속 사용할 수 있다.

    세션객체의 용도 - 인증된 사용자 정보를 담아놓는다. 

    은행의 경우 만료시간을 5분으로 잡아놓아서 로그아웃이 되어 있는 것임.

     

    회원가입, 로그인, 작성자 자동으로 입력되도록 만들어보는 것 내일 할 것임. 

     

    댓글

Designed by Tistory.