WebStorage

  • HTML5 API로 브라우저에 데이터를 저장하는 기술

1.기본 개념

1) 종류

  • SessionStorage : 처음 웹 애플리케이션에 접속했을 때 생성되고 브라우저를 종료하면 소멸되는 저장소
  • LocalStorage : 한 번 저장하면 브라우저 창을 닫더라도 계속 유지되는 저장소

2) 쿠키와 다른점

  • 쿠키는 사용할 때 마다 서버로 전송을 해야 하지만 스토리지는 서버로 전송할 필요가 없습니다.(서버가 알 필요가 없는 경우, 오프 라인 상태에서도 가능)
  • 쿠키는 서로 다른 언어가 사용해야 하기 때문에 문자열만 저장이 가능하지만 스토리지는 자바스크립트 만이 사용하기 때문에 자바스크립트의 모든 객체를 저장할 수 있습니다.
  • 스토리지는 크기에 제한도 없습니다.

3) 생성을 할 필요가 없습니다.

  • 자바스크립트 코드 안에서 sessionStorage, localStorage 라는 이름으로 사용하면 됩니다.

4) 메소드

  • 데이터 저장 : localStorage["키이름"] = 데이터
  • 데이터 읽기 : localStorage["키이름"]
  • 데이터 수정은 존재하는 키이름에 데이터를 대입하면 됩니다.
  • 삭제 : delete localStorage["키이름"]
  • 전체 삭제 : localStorage.clear()

5) Storage는 하나의 객체를 가지고 데이터를 계속 저장하기 때문에 많은 양의 데이터를 저장하면 성능이 저하됩니다.

  • 많은 양의 데이터를 저장해야 한다면 Indexed DB를 권장
  • 예전에는 WebSQL 도 사용이 되었지만 존재하지 않는 브라우저도 있고 성능도 떨어져서 비추천

2.웹 스토리지를 이용한 아이디 저장

1) index.jsp 파일에 웹 스토리지를 이용한 파일의 링크를 생성

<a href="./webstorage/login.jsp">웹 스토리지를 이용한 아이디 저장</a><br/>

2) WebContent 디렉토리에 webstorage 디렉토리를 만들고 login.jsp 파일을 생성하고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="./loginprocess.jsp" method="post" id="loginform">
        <label for="id">아이디</label>
        <input type="text" name="id" required="required" id="id"/>
        <br/>

        <label for="pw">비밀번호</label>
        <input type="password" name="pw" required="required" /><br/>

        <input type="checkbox" name="idsave" id="idsave" />아이디 저장<br/>
        <input type="submit" value="로그인" />
    </form>

    <script>
        //body에 있는 태그 찾아오기
        var loginform = document.getElementById("loginform");
        var ids = document.getElementById("id");
        var idsave = document.getElementById("idsave");

        //폼의 데이터를 submit 할 때 
        loginform.addEventListener("submit", function(e){
            //아이디 저장란에 체크가 되어 있으면 아이디 입력값을 로컬 스토리지에 저장
            //아이디 저장란에 체크가 되어 있지 않으면 아이디 입력값을 로컬 스토리지에서 제거
            if(idsave.checked == true){
                localStorage["id"] = ids.value;
            }else{
                delete localStorage["id"];
            }
        });

        //윈도우가 로드될 때 아이디 저장 여부를 확인해서 존재하면 표시
        window.addEventListener("load", function(e){
            if(localStorage["id"]){
                ids.value = localStorage["id"];
                idsave.checked = true;
            }else{
                ids.value = "";
                idsave.checked = false;
            }
        })

    </script>
</body>
</html>

Session

  • 서버에 저장할 수 있는 내장 객체
  • jsp에서는 session이라는 이름으로 사용하면 되고 그 이외의 영역에서는 request객체.getSession() 이라는 메소드를 호출하면 HttpSession 타입의 객체를 리턴해 줍니다.
  • 세션은 일반적으로 브라우저 당 1개씩 생성
  • 처음 웹 애플리케이션에 접속하면 1개가 만들어지고 브라우저를 종료하면 세션이 소멸됩니다.
  • 세션을 사용하는 목적은 브라우저가 접속되어 있는 동안 유지해야 하는 정보를 저장하거나 redirect 할 때 데이터를 전달
  • 로그인을 했을 때 로그인 여부를 세션에 저장합니다.

1.세션에 데이터를 저장하고 읽어내기

void setAttribute(String name, Object value)

Object getAttribute(String name)

void removeAttribute(String name)

2.그 이외 메소드

메소드 내용
String getId() Session의 ID 리턴
long getCreationTime() 세션이 생성된 시간
long getLastAccessedTime() 세션을 마지막으로 사용한 시간
void setMaxInactiveInterval(int second) 세션을 사용하지 않았을 때 자동으로 소멸되는 시간을 설정
int getMaxInactiveInterval()
void invalidate() 세션을 소멸

3.세션 만료 시간을 web.xml 파일에 설정

  • 설정한 시간동안 세션을 사용하지 않으면 자동으로 세션이 소멸됩니다.
  • 일정시간동안 아무런 동작도 취하지 않으면 로그아웃 되는 기능 구현에 이용
<session-config>
    <session-timeout>분단위 숫자</session-timeout>
</session-config>

실습 : 네이버 로그인 창과 유사한 형태 만들기

1) index.jsp 파일에 로그인 창으로 이동하는 링크 설정

<div id="content">
    <%
        out.println("<a href='login.jsp'>로그인</a><br/>");
    %>
</div>

2) WebContent 디렉토리에 login.jsp 파일을 생성하고 작성

  • 아이디와 비밀번호 입력란을 만들고 로그인 버튼과 잘못입력해서 돌아온 경우 메시지를 출력할 영역을 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
<style>
    #disp{
        color:red;
    }
</style>
</head>
<body>
    <%
        //세션에서 msg 키의 값을 가져옵니다.
        Object msg = session.getAttribute("msg");
        //값이 있다면 div를 만들어서 출력하고 삭제
        if(msg != null){
            out.println("<div id='disp'>" + msg + "</div>");
            session.removeAttribute("msg");
        }
    %>
    <form action="process.jsp" method="post">
        <label for="id">아이디</label>
        <input type="text" name="id" required="required"/><br/>

        <label for="pw">비밀번호</label>
        <input type="password" name="pw" required="required" /><br/>

        <input type="submit" value="로그인" />
    </form>

</body>
</html>

3) 로그인을 처리하는 process.jsp 파일을 만들고 작성

  • id 가 root 이고 pw가 1234 인 경우 로그인 성공으로 처리하고 나머지 경우는 로그인 실패로 처리
  • 데이터베이스에서 데이터를 찾아서 비교한 후 회원 정보를 가져와야 합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 처리</title>
</head>
<body>
    <%
        //파라미터 읽기
        String id = request.getParameter("id");
        String pw = request.getParameter("pw");

        if("root".equals(id) && "1234".equals(pw)){
            //로그인 성공 - 회원정보를 세션에 저장하고 결과 페이지로 redirect
            session.setAttribute("id", "root");
            session.setAttribute("nickname", "관리자");

            //메인 페이지로 리다이렉트
            response.sendRedirect("./");

        }else{
            //로그인 실패 - 메시지를 세션에 저장하고 로그인 페이지로 redirect
            session.setAttribute("msg", "없는 아이디이거나 잘못된 비밀번호입니다.");
            response.sendRedirect("./login.jsp");    
        }    
    %>
</body>
</html>

4) index.jsp 에서 로그인 된 경우와 그렇지 않은 경우 출력을 다르게 하기 위해서 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javaweb0213</title>
</head>
<body>
    <a href="./cookie/cookiecreate.jsp">쿠키 생성</a><br/>
    <a href="./cookie/login.jsp">쿠키를 이용한 아이디 저장</a><br/>
    <a href="./webstorage/login.jsp">웹 스토리지를 이용한 아이디 저장</a><br/>
    <div id="content">
    <%
        //로그인 여부는 session의 id에 데이터가 있으면 로그인 한 것이고 없으면 로그인 안한 것입니다.
        Object id = session.getAttribute("id");
        if(id == null){
            out.println("<a href='login.jsp'>로그인</a><br/>");
        }else{
            out.println("<p>" + session.getAttribute("nickname") + "님 </p>");
            out.println("<p><a href='./logout.jsp'>로그아웃</a></p>");
        }
    %>
    </div>
</body>
</html>

로그아웃 처리

  • 세션을 클리어하는 것으로 처리합니다.
  • 로그인 되어 있다는 사실을 세션에 id 키에 데이터가 있다는 것으로 안 것이기 때문에 세션의 데이터를 전부 지우면 id 키의 데이터도 지워지므로 로그인이 되지 않은 것으로 간주

실습 : 로그아웃 처리

1) logout.jsp 파일을 만들고 로그아웃 처리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        //세션 삭제
        session.invalidate();
        //보통은 로그아웃하면 메인 페이지로 리다이렉트
        //response.sendRedirect("./");
    %>

    <h3>로그아웃 하셨습니다.</h3>
    <h4>5초 후에 메인 페이지로 이동합니다.</h4>
    <script>
        //5초 후에 ./ 로 이동
        setTimeout(function(){
            location.href = "./";
        }, 5000)
    </script>
</body>
</html>

일정 시간 동안 세션을 사용하지 않으면 자동으로 세션을 초기화

  • web.xml 파일에 session-config를 설정하면 됩니다.
  • 2분동안 세션을 사용하지 않으면 세션이 자동으로 초기화되도록 web.xml 파일에 작성
<!-- 세션 초기화 시간 설정 -->
  <session-config>
      <session-timeout>2</session-timeout>
  </session-config>

로그인 한 정보를 무조건 세션에 저장?

  • 로그인 한 정보를 세션에 무조건 저장하는 것은 고려를 해봐야 합니다.

    로그인 한 회원이 많다면 세션에 저장하는 것은 서버에 부담을 가중시키게 됩니다.
    세션은 서버에 저장을 합니다.
    동시 접속자가 많은 경우에는 세션에는 구분하기 위한 키 값만 저장하고 나머지 정보는 데이터베이스에 저장해서 필요할 때 마다 데이터베이스에서 불러오는 형태로 만듭니다.

results matching ""

    No results matching ""