ex08.JSP

바보·2023년 5월 21일

JSP

목록 보기
14/18
post-thumbnail

Session, 세션

pageScope 중에 한 객체임
웹 브라우저가 모두 종료되면 사라진다
그 특성을 활용해서 로그인 정보를 유지하는데 자주 사용된다

쿠키는 클라이언트가 서버에 바로 들고가면 되는데
세션은 서버를 한 번 거쳐서 가야하기 때문에
완전~- 엄청~- 까지는 아니지만 느리다

쿠키와 세션 비교


Session 활용

세션을 활용해서
로그인 -> 유지 -> 로그아웃 or 내정보 확인하는
프로그램을 작성할 것이다

  • home.jsp
<h1>세션을 활용한 로그인</h1>
<hr>
  
<form action="login.jsp" method="POST">
	<p><input name="userid" type="text" placeholder="ID" required></p>
	<p><input name="userpw" type="password" placeholder="PW" required></p>
	<button>로그인</button>
</form>

<a href="mypage.jsp">
	<button>내정보</button>
</a>
  
<a href=logout.jsp">
	<button>로그아웃</button>
</a>
  • login.jsp
<% request.setCharacterEncoding("utf-8"); %>
  
<jsp:useBean id="input" class="beans.Account"></jsp:useBean>
<jsp:setProperty property="*" name="input"/>
  
<%
  Account user = login(input);... 
  %>
  에러떠서 Account 클래스 만들러감
  사실 useBean에서 갔어야함
  beans.Account 만들러 ㅠ
  • Java Resources/src/beans/Account.java
복붙해도 괜찮은데
타이핑 + 뭔지 훑어보려고 또 타이핑
새벽5:48분 솔직히 자고싶은데..
잠보다 연습이 더 먼저같음
자동완성은 있긴 하지만
여기 코드엔 항상
클래스로 추상화하는거랑 캡슐화랑
Override 하는 내용이랑
기본생성자를 만들고
생성자를 또 만드는거랑 재밌는 내용이 많음
그래서 그냥 복붙하긴 좀 아까움
디비쓰면 이것도 그냥 붙여넣을꺼같긴하지만..ㅠㅠ

이 페이지는 생략해서 읽어도 괜찮음

package beans;

public class Account {
	private String userid;
    private String userpw;
    private String nick;
    private String email;
    
    여기에 private로 생성하고
    겟터세터로 꺼낼 변수명은
    앞의 login.jsp에서
    property를 "*" == 모두 참조
    하는 내용이라
    home의 name과 같도록 설정해주는 것이 좋다
    }
    
    public Account() {}
    
    public Account(String userid, String userpw, String nick, String email);
    this.userid = userid;
    this.userpw = userpw;
    this.nick = nick;
    this.email = email;
    }
    
    public String getUserid() {
    	return userid
    }
	public void setUserid(String userid) {
    	this.userid = userid;
    }
	사실 이 부분에서 유저아이디 부터해서
    싹 바꿔주는 것이 좋다.
    기껏 method를 POST로 지정해서 쓰는데
    이러면 결국 private가 다 나오지 않나..?
    좀 색다르게 써보지 항상 귀찮아서
    선생도 그렇고 나도 그렇고...
    그냥 물 흐르듯이 쓰는듯 이러니까 더 헷갈림ㅠㅠ
    
    public String getUserpw() {
    	return userpw;
        
    -- 지금부터 하단 작성은 2일 지나서임 --
    -- ㅜㅜ 복사할까 이게 뭔 의미지 하는데 --
    -- 내 머릿속에서 바보야 손에 익혀야지!
    -- 강하게 말걸어서 그냥 적어야겠음
    }
	
    
    public void SetUserpw(String userpw) {
    	this.userppw = userpw;
    }
	
    public String getNick() {
    	return nick;
    }
	public voic setNick(String nick) {
    	this.nick = nick;
    }
	
    public String getEmail() {
    	return eamil;
    }
	public String setEmail() {
    	this.nick = nick;
    }

	
    
    
    @Override
    public int hashCode() {
    	final int prime = 31;
        int result = 1;
        result = prime * result + ((userid == null) ? 0 : userid.hashCode());
        result = prime * result + ((userpw == null) ? 0 : userpw.hashCode());
        return result;
    }

	@Override
    public boolean equals(Object obj) {
    	if (this == obj)
        	return true;
        if (obj == null)
        	return false;
        if (getClass() != obj.getClass())
        	return false;
        
        Account other = (Account) obj;
        if (userid == null) {
        	if (other.userid != null)
            	return false;
		} else if (!userid.equals(other.userid))
        	return false;
		if (userpw == null) {
     		if (other.userpw != null)
            	return false;
		} else if (!userpw.equals(other.userpw))
        	return false;
		return true;
    }
}



  • login.jsp
<%!
  Account[] acc = new Account[] {
  		new Account("root", "qwe", "관리자", "root@naver.com"),
        new Account("user", "1234", "테스트", "user@gmail.com"),
        new Account("goog", "qqq", "국", "goog@cloud.com")
  };
  
  public Account login (Account intput) {
  		for (int i = 0; i < acc.length; i++) {
          if (acc[i].equals(input)) {
          	return acc[i]; 
          }
        }
    	return null;
  };
  %>
    
    
<% request.CharacterEncoding("utf-8"); %>
    
<jsp:useBean id="input" class="beans.Account"></jsp:useBean>
<jsp:serProperty properrty="*" name="input"/>
  
<%
  String save = requst.getParameter("save");

	Account user = login(input);
	int success = 0;

	// 로그인 성공시
	if (user != null) {
    	// 세션에 현재 계정 정보를 저장한다
      	session.setAttribute("user",user);
      	success = 1;
    }
%>

<script>
  	var success = <%=success %>
    // 자바스크린트 변수에 위의 0이나 1이 들어감
    
    if (success == 1) {
    	alert('로그인 성공')
      	location.href = 'home.jsp'
    }
	else {
      	alert('로그인 실패')
      	history.go(-1)
    	// +1은 다음페이지
      	// -1은 이전페이지
    }
	
</script>	



  • logout.jsp
<%
  session.removeAttribute("user");
  %>
    
<script>
    alert('로그아웃 되었습니다~');
	location.href = 'home.jsp';
 </script>    



  • myPage.jsp
<%
	Account user = (Account) session.getAttribute("user");
	
	if (user == null) {
    	user = new Account();
      	response.sendRedirect("home.jsp");
    }
%>

<h1>내정보</h1>
<hr>
  
<table border="1" cellspacing="0" cellpadding="5">
<tr>
	<th>ID</th>
	<td><%=user.getUserid() %></td>
</tr>

<tr>
	<th>PW</th>
	<td><%=user.getUserpw() %></td>
</tr>

<tr>
	<th>닉네임</th>
	<td><%=user.getNick() %></td>
</tr>

<tr>
	<th>이메일</th>
	<td><%=user.getEmail() %></td>
</tr>
</table>

<br>
  
<a href="home.jsp">
	<button>Home</button>
</a>


Cookie -1

Cookie

옛날 옛날 아주 먼 옛날 server라는 마을에
한 청년인 A군이
마을 문지기 역할을 하며 살고 있었답니다.

그러던 어느 날 마을 주변으로 길을 만들어
왕국끼리의 결혼을 결정하는 편지를 배송할거라고 합니다.
왕국에서 통보가 왔습니다.
우리 마을을 축제와 쉬어가는 목적으로
사용 될 것이라며, 정돈을 하라는 명령에
server 마을 모두 즐겁게? 꾸미고 정돈하였어요.

축제가 다가오고 당일부터
정말 많은 사람이 몰려왔어요!

출입문이 좁아서 혼자서 처리해야 하는 상황인데
마을로 들어오는 사람들이
어떤 사람인지,
이미 온 적이 있어 마을 통행증을 가지고 있는지,
통행증을 가지고 있다면 체류기간이 언제인지 를

A군 혼자 하나하나 알아가며
처리하기엔 너무 힘들었죠.

어떻게 하면 더 쉽게 이 사람들을 파악할까...
고민하던 문지기 A군은
server 마을에 출입하려면
기본적인 작성 틀로 구분하자!
라는 생각을 하게 되었고

1)
이미 온 적이 있다면 통행증을 먼저 보여달라 하였고
그 통행증의 유효기간/체류기간을 설정및 확인하고
2)
새로 들어 온 경우라면 새로운 종이를 주며
여기에 기본적인 내용을 작성하라 하고
작성해오면 정보를 확인하고 마을 출입증을 주었답니다.

그리고
1번과 2번을 진행해서 마을로 갈 때
출입증과 서류를 발급/갱신한 내용에 대해서
체류기간과 어떤것을 좋아하는지? 등의
내용을 담은 팔찌를 지급하였습니다.

가만히 있으면 일이 안 생길 것인데,
팔찌를 지급하면서
문지기인 A군은 이런 말을 해버렸습니다.
'들어오려는 사람이 누구인지를 알려주는 내용도
팔찌에 기록을 해두실래요?
그럼 팔찌만 보여주시면 바로 입장이 가능합니다!'
라고 말이죠.
옆에 있던 마을 출입명부를 적는 기록담당자는
작은 목소리로 'igo doya'라며
팔찌에 개인 정보가 담겨있으면 출입이 가능하게끔
server마을의 정보를 바꾸었습니다.

이렇게 바꾸어 server마을에 출입하는
길고~ 긴~ 줄이 줄어들어
server마을의 촌장은 기뻐하였답니다.
-끝-


여기서 문지기는 방화벽이고
들어 오려는 사람은 user가 될 수 있고 request가 될 수 있음
출입증과 서류및 팔찌는 cookie
팔찌의 개인정보 담는 것은 '자동 저장'기능
체류기간은 'N일 까지 이 페이지를 보지 않음'

그리고 이 왕국의 이름은 Coding왕국이였음 쿠키킥



Cookie -2

1) 웹에서 사용될 데이터를 저장 및 유지하는 기법
2) 4KB 이하의 문자열을 저장할 수 있다
3) key와 value의 형태로 저장이 되고
key는 이름,
value는 저장할 값.
-----------------------------------------------------
※ 객체는 저장안되고 문자열만 가능한데
꼼수로 .JSON 이나 .XML로 넘겨주면 저장이 된다

ex)공공데이터 포털- 무료라 연습용으로 많이쓴다함
코로나 검색 -> 오픈API -> XML/JSON으로 받아서 사용

※ XML은 파싱(해석)기능이 있어서 좀 무겁다
이를 가볍게 하기 위해서 JSON을 사용한다

정리하자면
session에 객체를 저장하고
쿠키에는 문자열을 저장하는데
문자열 대신 객체를 저장하고 싶다 하면
XML과 JSON을 사용하면 된다
-----------------------------------------------------

4) 서버에서 생성해서 클라이언트에 발급한다
5) 발급 받은 클라이언트는 다시 해당 사이트를 접근할때 쿠키를 가지고 접근한다
6) 쿠키 존재 여부에 따라서 서버는 다른 처리를 해줄 수 있다
7) 쿠키는 클라이언트에 저장되기 때문에 중요한 내용은 저장하지 않는다
※ spring 수업에서 스프링프레임워크 시큐리티에 대해서 배워 암호화를 하면 되지만 이 내용이 복잡하고 어렵다고 한다



  • cookie.jsp
<h1>쿠키 실습</h1>
<hr>
  
<form action="cookie_result.jsp">  

<p><input name="name" type"text" placeholder="이름" required value="<%=name %>"></p>
<p><input name="age" type="numver" placeholder="나이" required value="<%=age %>"></p>

<p>
  <input name="save" type="checkbox" value="yes" <%=save %>>
    <lavel>저장</label>
</p>

<button>전송</button>
</form>
  • cookie_result.jsp
<%
	String name = request.getParameter("name");
	String age = request.getParameter("age");
	String save = request.getParameter("save");

	// 1. 쿠키 객체를 생성
	// Cookie(String name, String value)
	Cookie[] cs = new Cookie[] {
    	new Cookie("name", name),
        new Cookie("age", age),
        new Cookie("save", "checked")
    };
	
	for (int i = 0; i < cs.length; i++) {
   		// 2. 쿠키에 수명을 부여
      	// - 수명이 없으면 세션과 동일한 수명이 된다 (= 세션 쿠키)
      	cs[i].setMaxAge(0);
      
      	if ("yse".eqals(save)) {
        	cs[i].setMaxAge(60 * 60 * 24 * 7);	// 초 단위로 지정  
        }
     	
      	// 3. 쿠키를 응답에 담아준다
      	// 서버가 클라이언트에게 주는 것이므로 '응답'에 담아준다~
      	response.addCookie(cs[i]);
    }
  %>
    
<h1>쿠키 결과</h1>
<hr>
  
<h4>개발 도구 -> 어플리케이션 tab에서 확인 가능~</h4>

<a href="cookie.jsp">
	<button>cookie</button>
</a>
  • cookie.jsp
<%
  // 쿠키 가져오기
  // - 발급 받은 쿠키는 클라이언트가 서버로 접근시 가져온다
  // - 즉, 쿠키는 '요청'에 담겨있다
  
	Cookie[] cs = request.getCookies();

	String name, age, save;
	name = age = save = "";

	// 페이지를 처음 방문시 쿠키가 없다
	if (cs != null) {
    	for (Cookie ck : cs) {
        	switch (ck.getName()) {
            case "name";
                  name = ck.getValue();
                  break;
            case "age";
                  age = ck.getValue();
                  break;
            case "save";    
            	  save = ck.getValue();
                  break;
            }  
        }
    }
  %>


세션 + 쿠키

위의 home~ 들의 내용을 가지고 와서 붙여넣는다

-home.jsp

<%
		// 세션에 저장된 정보를 꺼내온다
		Account user = (Account) session.getAttribute("user");
		String nick = "x";
		
		if (user != null) {
			nick = user.getNick() + "님";
		}
		
		
		// 쿠키 가져오기
		Cookie[] cs = request.getCookies();
		String userid, userpw, save;
		
		userid = userpw = save = "";
		
		if (cs != null) {
			for (int i = 0; i < cs.length; i++) {
				switch (cs[i].getName()) {
				case "userid":	userid = cs[i].getValue();	break;
				case "userpw":	userpw = cs[i].getValue();	break;
				case "save":	save = cs[i].getValue();	break;
				}
			}
		}
	%>

	<h1>세션을 활용한 로그인</h1>
	<hr>
	
	<h4>접속 : <%=nick %></h4>
	
	<% if (user == null) { %>
	<form action="login.jsp" method="POST">
		<p><input name="userid" type="text" placeholder="ID" required value="<%=userid %>"></p>
		<p><input name="userpw" type="password" placeholder="PW" required value="<%=userpw %>"></p>
		<p>
			<input name="save" type="checkbox" value="yes" <%=save %>>
			<label>ID/PW 저장</label>
		</p>
		
		<button>로그인</button>
	</form>
	<% } else { %>
	<a href="myPage.jsp">
		<button>내정보</button>
	</a>
	<a href="logout.jsp">
		<button>로그아웃</button>
	</a>	
	<% } %>
  • login.jsp
<%!
		private Account[] acc = new Account[] {
			new Account("root", "qwe", "관리자", "root@naver.com"),
			new Account("user", "1234", "테스트", "user@gmail.com"),
			new Account("goog", "qqq", "국", "goog@cloud.com")
  };
	
		public Account login(Account input) {
			for (int i = 0; i < acc.length; i++) {
				if (acc[i].equals(input)) {
					return acc[i];
				}
			}
			
			return null;
		}
	%>
	
	<% request.setCharacterEncoding("utf-8"); %>
	
	<jsp:useBean id="input" class="beans.Account"/>
	<jsp:setProperty property="*" name="input"/>
	
	<%
		String save = request.getParameter("save");
	
		Account user = login(input);
		int success = 0;
		
		// 로그인 성공시
		if (user != null) {
			// 세션에 현재 계정 정보를 저장한다
			session.setAttribute("user", user);
			success = 1;
			
			// 쿠키 생성 여부
			Cookie[] cs = new Cookie[] {
				new Cookie("userid", user.getUserid()),
				new Cookie("userpw", user.getUserpw()),
				new Cookie("save", "checked")
			};
			
			for (int i = 0; i < cs.length; i++) {
				cs[i].setMaxAge(0);
				
				if ("yes".equals(save)) {
					cs[i].setMaxAge(60 * 60 * 24 * 7);
				}
				
				response.addCookie(cs[i]);
			}
		}
	%>

	
	<script>
		var success = <%=success %>
		
		if (success == 1) {
			alert('로그인 성공')
			location.href = 'home.jsp'
		}
		else {
			alert('로그인 실패')
			history.go(-1)
		}
	</script>

이렇게 추가해주면 된다고 한다.
난 사실 잘 몰라서 붙여넣기 했다...
일단 메모해두고
나중에 다시 확인하면서 수정하는 내용으로 가자.



  • 후기

반드시 쿠키+ 세션 부분을 더 공부하길 바람
내용은 감이 잡혔으나 직접 작성해본적이 없으므로
6/3 ~ 6/5 사이에 반드시 활용해보는 것을 권장함

profile
바보는 타이핑으로 공부하자

1개의 댓글

comment-user-thumbnail
2023년 5월 21일

쿠키 + 세션 혼내주자

답글 달기