Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- If
- 책리뷰
- 뇌정리
- 항해99
- 스터디
- hackerrank
- algorithms
- 미니프로젝트
- 2020년 제4회 정보처리기사 필기 문제 분석
- 필기
- 2020년 정보처리기사 4회
- 정보처리기사
- 2020년 일정
- 회고
- git
- 성적프로그램
- Til
- sqldeveloper
- post
- LeetCode
- 함수형 코딩
- 주간회고
- Jackson
- Python
- Real MySQL
- 알고리즘
- java
- jsp
- 코드숨
- 서평
Archives
- Today
- Total
조컴퓨터
201104 JSP 13 - JSP 미니 프로젝트 (로그인_쿠키) 본문
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"); } %>>
아이디저장
<a href="agreement.jsp">회원가입</a>
<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" %>
'자바 웹개발자 과정 > JSP' 카테고리의 다른 글
201109 JSP 16 - JSP 미니 프로젝트 (포토갤러리) (0) | 2020.11.09 |
---|---|
201105 JSP 14 - JSP 미니 프로젝트 (회원가입) (0) | 2020.11.05 |
201103 JSP 12 - JSP 미니 프로젝트 (세션_로그인) (0) | 2020.11.03 |
201102 JSP 11 - JSP 미니 프로젝트 (공지사항) (0) | 2020.11.03 |
201030 JSP 10 - JSP 미니 프로젝트 (답변, 검색, 페이징) (0) | 2020.11.03 |