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>
<a href="agreement.jsp">회원가입</a>
<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(" ");
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");
%>