Project/myweb_JAVA

08. 회원 관리 ② (세션, 쿠키, 로그인, 로그아웃 )

개발개발빈이 2022. 8. 3. 21:16

○ 세션 (참고 : JSP내부객체 및 내부변수)

    - 로그아웃 전까지 모든 페이지에서 로그인 된 상태를 유지하기 위해 로그인 시에 session에 로그인 정보를 저장함

 

○ 쿠키 (cookie)

    - cookie : 웹서버가 사용자PC에 저장하는 텍스트 파일로 된 정보

    - 각 브라우저 쿠키 삭제의 영향을 받는다
    - 보안에 취약하다

    - 사용예 : 아이디 저장, 오늘 창 그만보기, 클릭한 상품 목록

 

○ 로그인 및 로그아웃하기

    ① DAO : MemberDAO.java (참고: 회원 관리 ① DTO, DAO)

        - loginProc() : 탈퇴 회원(F1)을 제외한 회원 중 입력한 아이디와 패스워드가 모두 DB와 일치할 때 로그인 진행

public String loginProc(MemberDTO dto) {
    String mlevel=null;
    try {
        con=dbopen.getConnection();//DB연결

        sql=new StringBuilder();
        sql.append(" SELECT mlevel ");
        sql.append(" FROM member ");
        sql.append(" WHERE id=? AND passwd=? ");
        sql.append(" AND mlevel IN ('A1', 'B1', 'C1', 'D1') ");

        pstmt = con.prepareStatement(sql.toString());
        pstmt.setString(1, dto.getId());
        pstmt.setString(2, dto.getPasswd());
        rs = pstmt.executeQuery();

        if(rs.next()) {
            mlevel=rs.getString("mlevel");
        }//if end

    } catch (Exception e) {
        System.out.println("로그인 실패: " + e);
    }finally{
        DBclose.close(con, pstmt, rs);;
    }//try end
    return mlevel;
}//loginProc() end

 

    ② 뷰단 : main/webapp/member/loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="auth.jsp"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 loginForm.jsp -->
<div class="container">
<%if(s_id.equals("guest") || s_passwd.equals("guest") || s_mlevel.equals("guest")){
    //로그인이 되어있지 않은 상태 → form을 보여줌 

    //아이디저장 쿠키 확인	
    //사용자PC에 저장된 모든 쿠키값 가져오기
    Cookie[] cookies=request.getCookies();//사용자 PC에 저장된 모든 쿠키값 가져오기
    String c_id="";
	
    if(cookies!=null){//쿠키가 존재하는지?
        for(int i=0; i<cookies.length; i++){ //모든 쿠키값을 검색함
            Cookie cookie=cookies[i];        //쿠키 하나씩 가져오기
            if(cookie.getName().equals("c_id")==true){
                c_id=cookie.getValue();      //쿠키변수값 가져오기
            }//if end
        }//for end
    }//if end
%>
    <img src="../images/login.png" style="margin: auto; width: 300px" >
    <form name="loginfrm" id="loginfrm" method="post" 
          action="loginProc.jsp" onsubmit="return loginCheck()">
      <table class="table table-bordered" id="login_table">
      <tr>
        <td>
          <input type="text" name="id" id="id" value="<%=c_id%>" class="form-control" 
                 placeholder="아이디" maxlength="10" required>
        </td>
        <td rowspan="2" width="90px">
          <input type="image" src="../images/login_btn_bk.png" width="85px">		   
        </td>
      </tr>
      <tr>
        <td>
          <input type="password" name="passwd" id="passwd" class="form-control" 
                 placeholder="비밀번호" maxlength="10" required>
        </td>
      </tr>

      <tr>
        <td colspan="2">
          <label>
            <input type="checkbox" name="c_id" 
                   value="SAVE" <%if(!c_id.isEmpty()){out.print("checked");} %>> 아이디 저장
          </label>	  
          &nbsp;&nbsp;&nbsp;
          <a href="agreement.jsp">회원가입</a>
          &nbsp;&nbsp;&nbsp;
          <a href="findID.jsp">아이디/비밀번호찾기</a>
        </td>
      </tr>		  
      </table>	
    </form>
<%
    }else{//로그인이 되어있는 상태 → logout 버튼을 보여줌
		
      out.println("<img src='../images/logout.png' style='margin: auto; width: 250px'><br><br>");
      out.println("<strong>" + s_id + "</strong> 님");
      out.println("<a href='logout.jsp'>[로그아웃]</a>");
      out.println("<br><br>");
      out.println("<a href='memberModify.jsp'>[회원정보수정]</a>");
      out.println("&nbsp;&nbsp;");
      out.println("<a href='memberWithdraw.jsp'>[회원탈퇴]</a>");
				
    }//if end
%>	
	
</div>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

 

    ③ 뷰단 : main/webapp/member/loginProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 loginProc.jsp -->
<h3>로 그 인 결 과</h3>
<div class="container">
<% 
  String id     =request.getParameter("id").trim();
  String passwd =request.getParameter("passwd").trim();
  dto.setId(id);
  dto.setPasswd(passwd);
	
  String mlevel=dao.loginProc(dto);

  if(mlevel==null){
    out.println("<p>아이디/비밀번호를 다시 한번 확인해주세요</p>");
    out.println("<p><a href='javascript:history.back()'><img src='../images/history_back.JPG' style='margin: auto; width: 200px' ></a></p>");		
  }else{
    //로그인 성공
    //다른페이지에서 로그인 상태정보를 공유할 수 있도록(session)
    session.setAttribute("s_id", id);
    session.setAttribute("s_passwd", passwd);
    session.setAttribute("s_mlevel", mlevel);

    //<input type="checkbox" name="c_id" value="SAVE"> 값 가져오기 (체크하면 SAVE, 안 하면 null)		
    String c_id=Utility.checkNull(request.getParameter("c_id"));	
    Cookie cookie=null;
    if(c_id.equals("SAVE")){//아이디 저장에 체크를 했다면
			
    //쿠키변수선언 new Cookie("변수명", 값)
    cookie=new Cookie("c_id", id);
			
    //쿠키의 생존기간 1개월
    cookie.setMaxAge(60*60*24*30);	//각 브라우저 쿠키 삭제의 영향을 받는다
			
  }else{
    cookie=new Cookie("c_id", "");
    cookie.setMaxAge(0);
  }//if end
		
    response.addCookie(cookie);	//요청한 사용자 PC에 쿠키값을 저장
		
    //첫페이지로 이동
    String root=Utility.getRoot();	// /myweb반환
    response.sendRedirect(root+"/index.jsp");
		
  }//if end

%>
</div>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

 

    ④ Utility.java

package net.utility;

public class Utility {
  // 서비스시에는 도메인으로 변경됨.
  private static final String root = "/myweb";

  public static synchronized String getRoot() {
    return root;
  }
  
}

   

    ⑤ 로그인 유효성 검사 : myscript.js

function loginCheck(){ //로그인 유효성검사(아이디, 비번)

    //1) 아이디 5~10글자 이내인지 검사
	var id=document.getElementById("id").value;
    id=id.trim();
    if(!(id.length>=5 && id.length<=10)){
        alert("아이디는 5~10글자 이내로 입력해 주세요");
        document.getElementById("id").focus();
        return false;   
    }//if end
 

    //2) 비밀번호 5~10글자 이내인지 검사
	var passwd=document.getElementById("passwd").value;
    passwd=passwd.trim();
    if(!(passwd.length>=5 && passwd.length<=10)){
        alert("비밀번호는 5~10글자 이내로 입력해 주세요");
        document.getElementById("passwd").focus();
        return false;   
    }//if end

    return true;

}//loginCheck() end

    ⑥ 로그아웃 : logout.jsp

        - 로그인 상태에서 loginForm.jsp로 이동 시 로그아웃 링크 노출

        - 로그아웃 클릭시 logout.jsp로 이동

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

<%-- logout.jsp 공통코드 --%>

<%
	//세션변수 제거
	session.removeAttribute("s_id");
	session.removeAttribute("s_passwd");
	session.removeAttribute("s_mlevel");
	
	//페이지 이동
	response.sendRedirect("loginForm.jsp");

%>