조컴퓨터

201104 JSP 13 - JSP 미니 프로젝트 (로그인_쿠키) 본문

자바 웹개발자 과정/JSP

201104 JSP 13 - JSP 미니 프로젝트 (로그인_쿠키)

챠오위 2020. 11. 5. 22:29

1. Cookie 클래스

- javax.servlet.http.Cookie 클래스를 이용

- Tomcat 서버가 client에 저장하는 텍스트 파일로 된 정보

 

- 보안성이 없으므로 계정과 패스워드를 동시에 쿠키에 저장하면, 쿠키의 내용을 전부 편집기로 열어볼 수 있으기 때문에 보안에 문제가 될 수 있다.

 

- 4kb까지 저장할 수 있다. 네트워크 트래픽이 많아지므로 1kb 안쪽으로 사용을 권장한다.

 

- 쿠키는 웹페이지 접속시 서버로 자동으로 전송되고 서버에 의해서 클라이언트에 쓰여지므로 쿠키를 사용하지 않는 옵션을 브라우저에서 지정 가능하다.

 

- setMaxAge( )

쿠키의 생존 기간 초 지정, 12시간의 경우 12*60*60

브라우저는 시간이 지난 쿠키를 서버로 전송하지 않고 자동으로 삭제하며 사용자가 직접 삭제도 가능하다.

쿠키는 브라우저가 사용하는 데이터이다.

 

- 쿠키변수 선언 및 초기값

Cookie cname=new Cookie(쿠키변수명, 쿠키값);

예) Cookie cname=new Cookie("cname", "user1");

 

- 접속자의 브라우저 옵션에서 쿠키를 사용할 수 없도록 하면 쿠키는 작동되지 않으므로 중요한 기능은 세션이나 데이터베이스를 이용한다.

 

- 쿠키에 쇼핑 카트 등의 사용은 주의하는 것이 좋다.

 

 

 

2. 로그인 구현

 

1) SQL문으로 테이블 생성하기

-- 회원 테이블
CREATE TABLE member (
    id       VARCHAR(10)  NOT NULL, -- 아이디, 중복 안됨, 레코드를 구분하는 컬럼 
    passwd   VARCHAR(10)  NOT NULL, -- 패스워드
    mname    VARCHAR(20)  NOT NULL, -- 성명
    tel      VARCHAR(14)  NULL,     -- 전화번호
    email    VARCHAR(50)  NOT NULL  UNIQUE, -- 전자우편 주소, 중복 안됨
    zipcode  VARCHAR(7)   NULL,     -- 우편번호, 12345
    address1 VARCHAR(255) NULL,     -- 주소 1
    address2 VARCHAR(255) NULL,     -- 주소 2(나머지주소)
    job      VARCHAR(20)  NOT NULL, -- 직업
    mlevel   CHAR(2)      NOT NULL, -- 회원 등급, A1, B1, C1, D1, E1, F1
    mdate    DATE         NOT NULL, -- 가입일    
    PRIMARY KEY (id)
);


-- 테스트용 행추가
insert into member(id, passwd, mname, tel, email, zipcode, address1, address2, job, mlevel, mdate)
values('webmaster', '12341234', '솔데스크'
       , '123-4567', 'soldesk3@naver.com'
       , '12345', '서울시 종로구 관철동', '코아빌딩5층'
       , 'A02', 'A1', sysdate);

insert into member(id, passwd, mname, tel, email, zipcode, address1, address2, job, mlevel, mdate)
values('soldesk', '12341234', '솔데스크'
       , '123-4567', 'soldesk@naver.com'
       , '12345', '서울시 종로구 관철동', '코아빌딩5층'
       , 'A01', 'D1', sysdate);
       
insert into member(id, passwd, mname, tel, email, zipcode, address1, address2, job, mlevel, mdate)
values('user1', '12341234', '솔데스크'
       , '123-4567', 'user1@naver.com'
       , '12345', '서울시 종로구 관철동', '코아빌딩5층'
       , 'A01', 'D1', sysdate);

insert into member(id, passwd, mname, tel, email, zipcode, address1, address2, job, mlevel, mdate)
values('user0', '12341234', '솔데스크'
       , '123-4567', 'user@naver.com'
       , '12345', '서울시 종로구 관철동', '코아빌딩5층'
       , 'A01', 'F1', sysdate);

       
-- 아이디 중복 확인
select count(*) from member where id='webmaste';


-- 로그인 성공하면 회원등급 가져오기
-- (단, 비회원(E1), 탈퇴회원(F1)은 제외) 
select mlevel
from member
where id='soldesk' and passwd='12341234' 
and mlevel in ('A1', 'B1', 'C1', 'D1');

commit; --커밋

 

 

2) 서버단 설계하기

DAO, DTO

 

1) memberDAO

package net.member;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import net.bbs.BbsDTO;
import net.utility.DBClose;
import net.utility.DBOpen;

public class MemberDAO {

	private DBOpen dbopen=null;
	private Connection con=null;
	private PreparedStatement pstmt=null;
	private ResultSet rs=null;
	private StringBuilder sql=null;
	
	public MemberDAO() {
		dbopen=new DBOpen();
	}
	
	
	public String loginProc(MemberDTO dto) {
		String mlevel = null;
		
		try {
        		//1) DB연결
			con=dbopen.getConnection();
			sql=new StringBuilder();
			
            		//2) SELECT SQL문 작성
			sql.append(" SELECT mlevel ");
			sql.append(" FROM member ");
			sql.append(" WHERE id=? AND passwd=? ");
			sql.append(" AND mlevel IN ('A1', 'B1', 'C1', 'D1') ");
			
           		//3) SQL문 변환
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, dto.getId());
			pstmt.setString(2, dto.getPasswd());
			
            		//4) SQL문의 결과를 rs에 저장, ResultSet은 결과를 저장하는 집합
			rs = pstmt.executeQuery();
            
            		//5) rs의 내용을 cursor 형태로 읽기
			if(rs.next()) {
				mlevel = rs.getString("mlevel");
			}else {
				mlevel=null;
			}//if end
			
		} catch (Exception e) {
			System.out.println("로그인 실패:"+e);
		}finally {
			DBClose.close(con, pstmt, rs);
		}//end

		return mlevel;
		
	}//loginProc() end
	
}//class end

 

 

2) memberDTO

package net.member;

public class MemberDTO {
	private String id;
	private String passwd;
	private String mname;
	private String tel;
	private String email;
	private String zipcode;
	private String address1;
	private String address2;
	private String job;
	private String mlevel;
	private String mdate;
	
	
	public MemberDTO() {}

	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPasswd() {
		return passwd;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	public String getMname() {
		return mname;
	}

	public void setMname(String mname) {
		this.mname = mname;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getAddress1() {
		return address1;
	}

	public void setAddress1(String address1) {
		this.address1 = address1;
	}

	public String getAddress2() {
		return address2;
	}

	public void setAddress2(String address2) {
		this.address2 = address2;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public String getMlevel() {
		return mlevel;
	}

	public void setMlevel(String mlevel) {
		this.mlevel = mlevel;
	}

	public String getMdate() {
		return mdate;
	}

	public void setMdate(String mdate) {
		this.mdate = mdate;
	}

	
	@Override
	public String toString() {
		return "MemberDTO [id=" + id + ", passwd=" + passwd + ", mname=" + mname + ", tel=" + tel + ", email=" + email
				+ ", zipcode=" + zipcode + ", address1=" + address1 + ", address2=" + address2 + ", job=" + job
				+ ", mlevel=" + mlevel + ", mdate=" + mdate + "]";
	}
	
}//class end

 

 

3. 로그인 폼 작성하기

 

1) loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ include file="ssi.jsp" %>
<%@ include file="auth.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 loginForm.jsp -->
<h3>* 로 그 인 *</h3>
<br>

<%
	if(s_id.equals("guest")||s_passwd.equals("guest")||s_mlevel.equals("guest")){
		//로그인을 하지 않은 경우
		
		//쿠키-------------------------------------
		//사용자 PC에 저장된 모든 쿠키값 가져오기
		Cookie[] cookies=request.getCookies();
		String c_id="";
		if(cookies!=null){ //쿠키가 존재하는지?
			for(int i=0; i<cookies.length; i++){
				Cookie cookie=cookies[i];
				//쿠키변수 c_id가 있는지?
				if(cookie.getName().equals("c_id")==true){
					c_id=cookie.getValue();//쿠키변수값 가져오기
				}//if end
			}//for end
		}//if end
		//----------------------------------------
%>
	<form name="memfrm" id="memfrm"
	      method="post"
	      action="loginProc.jsp" 
	      onsubmit="return loginCheck()"><!-- myscript.js 코딩 -->
	<table class="table">
	<tr>
		<td>
			<input type="text" name="id" id="id" value="<%=c_id%>" placeholder="아이디" maxlength="10" required>
		</td>
	</tr>
	<tr>
		<td>
			<input type="password" name="passwd" id="passwd" placeholder="비밀번호" maxlength="10" required>
		</td>
	</tr>
	<tr>
		<td>
			<input type="submit" style="width: 185pt; height: 30pt;" value="로그인">
		</td>
	</tr>
	<tr>
		<td colspan="2">
			<input type="checkbox" name="c_id" value="SAVE" <%if(!(c_id.isEmpty())) { out.print("checked"); } %>>
			아이디저장
			&nbsp;&nbsp;&nbsp;
			<a href="agreement.jsp">회원가입</a>
			&nbsp;&nbsp;&nbsp;
			<a href="findIdForm.jsp">아이디</a>/<a href="findPasswordForm.jsp">비번찾기</a>
		</td>
	</tr>
	</table>
	</form>
<%
	}else{
		//로그인 성공했다면
		out.println("<strong>" + s_id + "</strong>님");
		out.println("<a href='logout.jsp'>[로그아웃]</a>");
		out.println("<br><br>");
		out.println("<a href='updateId.jsp'>[회원정보수정]</a>");
		out.println("<a href='deleteId.jsp'>[회원탈퇴]</a>");
	}//if end
%>
	
<!--  본문 끝 -->
<%@ include file="../footer.jsp" %>

 

 

2) loginProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>

<!-- 본문 시작 template.jsp -->
<h3>* 로 그 인 결과 *</h3>
<%
	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()'>[다시시도]</a></p>");
	}else{
		//로그인 성공
		//out.print(mlevel);
		//다른 페이지에서 로그인 상태 정보를 공유할 수 있도록
		session.setAttribute("s_id", id);
		session.setAttribute("s_passwd", passwd);
		session.setAttribute("s_mlevel", mlevel);
		
	//쿠키 시작-----------------------------------
		//-> 서버가 사용자 PC에 저장하는 텍스트 파일로 된 정보
		//-> 각 브라우저의 쿠키 삭제의 영향을 받는다.
		//-> 보안에 취약하다
		//-> 예) 아이디 저장, 클릭한 상품 목록, 오늘창 그만보기
		
		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
		
		//요청한 사용자 PC에 쿠키값을 저장
		response.addCookie(cookie);
	//쿠키 끝-------------------------------------

		//첫 페이지로 이동
		String root=Utility.getRoot();// /myweb
		response.sendRedirect(root+"/index.jsp");		
		
	}//if end
%>
<!--  본문 끝 -->
<%@ include file="../footer.jsp" %>