2022년 6월 21일 화요일

JSP 6강 - 세션(Session)

 1. 세션이란?

클라이언트가 웹 브라우저를 통해 서버에 접속한 후, 용무를 처리하고, 웹 브라우저를 닫아 서버와의 접속을 종료하는 하나의 단위를 세션이라고 한다.

세션은 웹 브라우저를 실행할 때마다 새롭게 생성된다. 설정된 유지 시간 동안 유지되며, 유지 시간이 만료되기 전에 새로운 요청이 들어오면 수명이 계속 연장된다.

(예 - 은행 사이트는 보통 10분의 로그인을 유지하며 활동이 없으면 자동 로그아웃)

유지 시간 이전이라도 웹 브라우저를 닫으면 세션는 종료 된다.(탭 종료는 유지 됨)


2. 세션 설정, 확인, 삭제

1) 유지 시간 설정 방법 2가지

- /WEB-INF/web.xml 에서 설정법 

  <!-- 세션 유지 시간 설정(20분으로 설정) -->

  <session-config>

    <session-timeout>20</session-timeout>

  </session-config>

-JSP 파일에서 session 내장 객체가 제공하는 setMaxInactiveInterval()을 사용

<%

session.setMaxInactiveInterval(1800); //1800초로 설정, 30분

%>

2) 세션 확인법

<%@ page import="java.util.Date"%>

<%@ page import="java.text.SimpleDateFormat"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");  // 날짜 표시 형식


long creationTime = session.getCreationTime();  // 최초 요청(세션 생성) 시각

String creationTimeStr = dateFormat.format(new Date(creationTime));


long lastTime = session.getLastAccessedTime();  // 마지막 요청 시각

String lastTimeStr = dateFormat.format(new Date(lastTime));

%>

<html>

<head><title>Session</title></head>

<body>

    <h2>Session 설정 확인</h2>

    <ul>

        <li>세션 유지 시간 : <%= session.getMaxInactiveInterval() %></li>

        <li>세션 아이디 : <%= session.getId() %></li>

        <li>최초 요청 시각 : <%= creationTimeStr %></li>

        <li>마지막 요청 시각 : <%= lastTimeStr %></li>

    </ul>

</body>

</html>

3) 세션 삭제

세션은 웹 브라우저를 닫으면 종료되지만, 웹 브라우저 설정에서 모든 쿠키를 삭제해 세션을 삭제할 수도 있다.


3. 세션과 DB를 이용한 로그인 구현

1) 로그인 페이지 구현

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<html>

<head><title>Session</title></head>

<body>

<jsp:include page="../Common/Link.jsp" />

    <h2>로그인 페이지</h2>

    <span style="color: red; font-size: 1.2em;"> 

        <%= request.getAttribute("LoginErrMsg") == null ?

                "" : request.getAttribute("LoginErrMsg") %>

    </span>

    <%

    if (session.getAttribute("UserId") == null) {  // 로그인 상태 확인

        // 로그아웃 상태

    %>

    <script>

    function validateForm(form) {

        if (!form.user_id.value) {

            alert("아이디를 입력하세요.");

            return false;

        }

        if (form.user_pw.value == "") {

            alert("패스워드를 입력하세요.");

            return false;

        }

    }

    </script>

    <form action="LoginProcess.jsp" method="post" name="loginFrm"

        onsubmit="return validateForm(this);">

        아이디 : <input type="text" name="user_id" /><br />

        패스워드 : <input type="password" name="user_pw" /><br />

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

    </form>

    <%

    } else { // 로그인된 상태

    %>

        <%= session.getAttribute("UserName") %> 회원님, 로그인하셨습니다.<br />

        <a href="Logout.jsp">[로그아웃]</a>

    <%

    }

    %>

</body>

</html>

2) DB 연동

데이터를 주고 받기 위해서는 DTO 클래스와 테이블에 접근하기 위한 DAO 클래스를 만들어야 한다.

   - DTO(Data Transfer Object) 

계층 사이에서 데이터를 교환하기 위해 생성하는 객체.

별도의 로직 없이 속성(멤버 변수)와 그 속성을 접근하기 위한 게터/세터 메서드만 갖춘 객체.

   - DAO(Data Access Object) 

데이터베이스의 데이터를 접근하기 위한 객체. 보통 JDBC를 통해 구현하며, 하나의 테이블에서 수행할 수 있는 CRUD를 전담. (CRUD - 생성, 읽기, 갱신, 삭제)

--DTO 클래스 (DB와 동일하게 생성) --

package membership;


public class MemberDTO {

    // 멤버 변수 선언

    private String id;

    private String pass;

    private String name;

    private String regidate;


    // 멤버 변수별 게터와 세터

    public String getId() {

        return id;

    }

    public void setId(String id) {

        this.id = id;

    }

    public String getPass() {

        return pass;

    }

    public void setPass(String pass) {

        this.pass = pass;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getRegidate() {

        return regidate;

    }

    public void setRegidate(String regidate) {

        this.regidate = regidate;

    }

}

--DAO 클래스  --

package membership;

import common.JDBConnect;


public class MemberDAO extends JDBConnect {

    // 명시한 데이터베이스로의 연결이 완료된 MemberDAO 객체를 생성합니다.

    public MemberDAO(String drv, String url, String id, String pw) {

        super(drv, url, id, pw);

    }


    // 명시한 아이디/패스워드와 일치하는 회원 정보를 반환합니다.

    public MemberDTO getMemberDTO(String uid, String upass) {

        MemberDTO dto = new MemberDTO();  // 회원 정보 DTO 객체 생성

        String query = "SELECT * FROM member WHERE id=? AND pass=?";  // 쿼리문 템플릿

        try {

            // 쿼리 실행

            psmt = con.prepareStatement(query); // 동적 쿼리문 준비

            psmt.setString(1, uid);    // 쿼리문의 첫 번째 인파라미터에 값 설정

            psmt.setString(2, upass);  // 쿼리문의 두 번째 인파라미터에 값 설정

            rs = psmt.executeQuery();  // 쿼리문 실행

            // 결과 처리

            if (rs.next()) {

                // 쿼리 결과로 얻은 회원 정보를 DTO 객체에 저장

                dto.setId(rs.getString("id"));

                dto.setPass(rs.getString("pass"));

                dto.setName(rs.getString(3));

                dto.setRegidate(rs.getString(4));

            }

        }

        catch (Exception e) {

            e.printStackTrace();

        }

        return dto;  // DTO 객체 반환

    }

}

3) 로그인 처리 JSP 구현
<%@ page import="membership.MemberDTO"%>
<%@ page import="membership.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 로그인 폼으로부터 받은 아이디와 패스워드
String userId = request.getParameter("user_id"); 
String userPwd = request.getParameter("user_pw");  

// web.xml에서 가져온 데이터베이스 연결 정보
String oracleDriver = application.getInitParameter("OracleDriver");
String oracleURL = application.getInitParameter("OracleURL");
String oracleId = application.getInitParameter("OracleId");
String oraclePwd = application.getInitParameter("OraclePwd");

// 회원 테이블 DAO를 통해 회원 정보 DTO 획득
MemberDAO dao = new MemberDAO(oracleDriver, oracleURL, oracleId, oraclePwd);
MemberDTO memberDTO = dao.getMemberDTO(userId, userPwd);
dao.close();

// 로그인 성공 여부에 따른 처리
if (memberDTO.getId() != null) {
    // 로그인 성공
    session.setAttribute("UserId", memberDTO.getId()); 
    session.setAttribute("UserName", memberDTO.getName()); 
    response.sendRedirect("LoginForm.jsp");
}
else {
    // 로그인 실패
    request.setAttribute("LoginErrMsg", "로그인 오류입니다."); 
    request.getRequestDispatcher("LoginForm.jsp").forward(request, response);
}
%>

4. 로그아웃 처리
로그 아웃은 세션 영역에 저장된 로그인 관련 속성을 모두 지워주기만 하면 된다.
속성을 지우는 방법은 두 가지다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 방법 1: 회원 인증 정보 속성 삭제 
session.removeAttribute("UserId");
session.removeAttribute("UserName");

// 방법 2: 모든 속성 한꺼번에 삭제 
session.invalidate();

// 속성 삭제 후 페이지 이동 
response.sendRedirect("LoginForm.jsp");
%>

5. 쿠키 vs 세션

---쿠키---
저장 위치/형식 : 클라이언트 PC에 text로 저장
보안 : 클라이언트에 저장하여 보안에 취약
자원 속도 : 서버 자원을 사용하지 않으므로 세션보다 빠름
용량 : 용량의 제한이 있음
유지 시간 : 쿠키 생성 시 설정함, 설정된 시간이 경과 되면 삭제

---세션---
저장 위치/형식 : 웹 서버에 Object 타입으로 저장
보안 : 서버에 저장되기에 보안에 안전
자원 속도 : 서버 자원을 사용하여 쿠키보다 느림
용량 : 서버가 허용하는 한 제한이 없음.
유지 시간 : 서버의 web.xml에서 설정, 설정된 시간 내라도 동작이 있으면 삭제 되지 않고 유지


댓글 없음:

댓글 쓰기