티스토리 뷰

수업문제

[문제] 11월 24일 (쿠키, 세션)

WhaleTREE 2021. 11. 24. 22:01

학습정리-11-24.txt
0.00MB

1. 부트스트랩 앨범을 완성을 하시오.

 

 

2.쿠키란 무엇인가요?

쿠키는 4kb 용량. 300개까지 데이터 정보를 가질 수 있다.

웹브라우저에서 서버로 어떤 데이터를 요청 하면, 서버측에서는 알맞은 로직을 수행한 후 데이터를 웹브라우저에 응답한 후, 웹브라우저와의 관계를 종료합니다. 이렇게, 웹브라우저에 응답 후 관계를 끊는 것이 http프로토콜의 특징 입니다.

이 때 연결이 끊긴 이후에도 어떤 정보(로그인 정보 등)을 지속적으로 유지하기 위한 수단중 하나가 쿠키이다.

쿠키는 서버에서 생성하여, 서버가 아닌 클라이언트측 특정 영역에  정보를 저장한다. 그리고 서버에 요청 할 때 마다 저장되어 있는 쿠키가 있다면 무조건 같이 보낸다. 

 

쿠키 안에 있는 메소드들은 아래와 같다.

  • setMaxAge() : 쿠키 유효기간을 설정 합니다.
  • setpath() : 쿠키사용의 유효 디렉토리를 설정 합니다.
  • setValue() : 쿠키의 값을 설정 합니다.
  • setVersion() : 쿠키 버전을 설정 합니다.
  • getMaxAge() : 쿠키 유효기간 정보를 얻습니다.
  • getName() : 쿠키 이름을 얻습니다.
  • getPath() : 쿠키사용의 유효 디렉토리 정보를 얻습니다.
  • getValue() : 쿠키의 값을 얻습니다.
  • getVersion() : 쿠키 버전을 얻습니다.

 


3.세션이란 무엇인가요? 

쿠키와 마찬가지로 서버와 연결을 유지하기 위한 수단 중 다른 하나가 세션이다. (세션과 쿠키는 동시에 사용된다!)

다만 쿠키와 다른 점은 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체로 존재한다. 그래서 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터에 한계가 없다.

 

세션에 들어 있는 메소드는 아래와 같다.

  • setAttribute() : 세션에 데이터를 저장 합니다.
  • getAttribute() : 세션에서 데이터를 얻습니다.
  • getAttributeNames() : 세션에 저장되어 있는 모든 데이터의 이름(유니크한 키값)을 얻습니다.
  • getId() : 자동 생성된 세션의 유니크한 아이디를 얻습니다.
  • isNew() : 세션이 최초 생성되었는지, 이전에 생성된 세션인지를 구분 합니다.
  • getMaxInactiveInterval() : 세션의 유효시간을 얻습니다. 가장 최근 요청시점을 기준으로 카운트 됩니다.
  • (C:\javalec\apache-tomcat-7.0.57\apache-tomcat-7.0.57\conf\web.xml 참조)
  • removeAttribute() : 세션에서 특정 데이터 제거 합니다.
  • Invalidate() : 세션의 모든 데이터를 삭제 합니다.

 

 


4. 아래의 cookie_set.jsp 파일에 대하여
cookie get 를 클릭하면 모든 쿠키 값을 출력하는 cookie_get.jsp를 만드시오.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie cookie = new Cookie("CookieN","CookieV"); //쿠키객체생성
cookie.setMaxAge(60*60); //쿠키 시간 설정

response.addCookie(cookie);
%>

<a href="cookie_get.jsp">cookie get</a>

</body>
</html>

 

cookie_set.jsp 

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%    
    // 실제 클라이언트(유저)가 웹 브라우저에 접속할 때 실행되는 과정
    
    Cookie cookie = new Cookie("CookieN""CookieV");
    //쿠키 객체 생성...key-value 형태
    
    cookie.setMaxAge(60 * 60); // 쿠키 시간 설정 - 1시간
    
    response.addCookie(cookie); // 쿠키를 보낸다.
%>
<!-- request할 때 이전에 저장해놓은 쿠키가 있다면 무조건 같이 보낸다!
처음 접속할 때는 저장된 쿠키가 당연히 없다....기본적으로 웹서버가
쿠키와 세션을 만들어 저장한다. 세션 아이디를 통해서 누가누구인지 구분한다.
쿠키는 개발자가 심고??? 세션 아이디는 톰캣이 만들어 심는다.-->
 
    <a href="cookie_get.jsp">cookie get</a>
</body>
</html>
cs

 

cookie_get.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
 
for(int i = 0; i < cookies.length; i++){
        
    out.println("cookies[" + i + "] name : " + cookies[i].getName() + "<br/>");
    out.println("cookies[" + i + "] value : " + cookies[i].getValue() + "<br/>");
    out.println("------------------------------------<br/>");
        
}
%>
    <a href="cookie_del.jsp">cookie del</a>
 
</body>
</html>
cs

 


추가    cookie_del.jsp

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
31
32
33
34
35
36
37
38
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%    
    // 쿠키 가져와서 확인하기
    Cookie[] cookies = request.getCookies(); // 쿠키 가져오기
    
    for(int i = 0; i < cookies.length; i++){
        String str = cookies[i].getName(); // "CookieN" 값이 출력
        System.out.println(cookies[i].getName() + ":" + cookies[i].getValue());
 
        
        if(str.equals("CookieN")){
            out.println("cookies[" + i + "] name : " + cookies[i].getName() + "<br/>");
            out.println("cookies[" + i + "] value : " + cookies[i].getValue() + "<br/>");
            out.println("============================<br/>");
            
            cookies[i].setMaxAge(0); // 쿠키 내용 지우기
            // 쿠키에 기록된 시간을 0으로 만들어 지워달라고 요청하는 것....
            // 직접적으로 지울수는 없다.....
            // 본인의 진짜 쿠키?들이 지워지는지 보관되는지는 관리하는 웹 서버 회사(개발자)에서 관리
            // 쿠키를 해킹도 가능...보안이 위험ㅋㅋㅋ
            // 그래서 쿠키에는 중요한 정보는 잘 넣어두지 않는다...중요한 정보는 세션에...
            response.addCookie(cookies[i]); // 지운 내용 저장하기
        }
                
    }
%>
 
    <a href="cookie_get.jsp">cookie get</a> <!-- 잘 지워졌는지 확인하기 -->
</body>
</html>
cs

 

 

 

 


5.아래의 session_set.jsp 파일에 대하여
session get 를 클릭하면 모든 세션 값을 출력하는 session_get.jsp를 만드시오.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.setAttribute("sessionName", "sessionValue");
session.setAttribute("myNum", 12345);
%>

<a href="session_get.jsp">session get</a>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%    
    session.setAttribute("sessionName""sessionValue"); 
    // key-vaule형태, 변수 선언
    session.setAttribute("myNum"12345);
    // 쿠키는 인터넷 상으로 전송해야하기 때문에 String만 넣을 수 있지만
    // 세션은 서버쪽에서 관리하고 있기 때문에 다른 자료형도 가능!
    // 세션은 기본적으로 내장 객체이기 때문에 객체 생성(new)하지 않고도 쓸 수 있다.    
%>
    <a href="session_get.jsp">session get</a>
</body>
</html>
cs

 

session_get.jsp

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
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Enumeration enumeration = session.getAttributeNames();
 
String name, value;
while(enumeration.hasMoreElements()){
    name = enumeration.nextElement().toString();
    value = session.getAttribute(name).toString();
    
    out.println("name : " + name + "<br>");
    out.println("value : " + value + "<br>");
    out.println("--------------------------------<br>");
}
%>
</body>
</html>
cs

 

 

session값 출력과 삭제

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%    
    Object obj1 = session.getAttribute("sessionName");
    // 세션의 값은 무조건 최고 부모형태로 리턴하기 때문에
    // 처음에 받아낼때는 object로 받고, String으로 형변환 필요
    String sessionName = (String)obj1;
    out.println(sessionName + "<br/>");
    
    int mynum = (int)session.getAttribute("myNum");
    // 바로 형변환해서 넣는다.
    out.println(mynum + "<br/>");
    
    out.println("***************************<br/>");
    String name;
    String value;
    
    // 세션 값을 모두 출력하기 위해 반복자 Enumeration 사용!
    Enumeration enumeration = session.getAttributeNames();
    
    while(enumeration.hasMoreElements()){
        name = enumeration.nextElement().toString();
        value = session.getAttribute(name).toString();
        //enumeration.nextElement()과 session.getAttribute(name)는 object기 때문에 String으로 변환
        
        out.println("name : " + name + "<br/>");
        out.println("value : " + value + "<br/>");
    }
    
    out.println("***************************<br/>");
    
    //중요!!!!!
    String sessionID = session.getId();
    out.println("sessionID : " + sessionID + "<br/>");
    
    int sessionInter = session.getMaxInactiveInterval();
    out.println("sessionInter : " + sessionInter + "<br/>");
    // 1800초 출력 (30분) - 세션 메모리에 접속할 때 있는 시간....한번 접속할 때 30분의 시간을 준다.
    // 즉, 세션 아이디를 가지고 있는 시간이 30분이다...?
    // 은행 사이트에 로그인 했을 때 제한시간이 여기서 설정?!ㅋㅋㅋ
    // 크롬에서 네이버 들어가서 로그인하고, 크롬 다른 창에서 네이버 들어가면 로그인 유지상태
    // 이 때 엣지에서 네이버 접속하면 로그인 상태가 아님
    // 왜냐하면 각 웹 브라우저마다 세션 아이디가 다르기 때문이다.
    // 또한 일정 시간이 지나면 왜 로그아웃되는가?
    // 세션이 계속 유지 되지 못하기 때문에 정해진(웹 서버마다?)시간이 지나면 세션 유지가 안된다.
    
    out.println("***************************<br/>");
    out.println("세션 지우기<br/>");
    
    session.removeAttribute("sessionName");
    // 서버에서 관리를 하기 때문에 삭제 함수가 있다. 쿠키랑 다르게...
    
    Enumeration enumeration1 = session.getAttributeNames();
    
    while(enumeration1.hasMoreElements()){
        name = enumeration1.nextElement().toString();
        value = session.getAttribute(name).toString();
        
        out.println("name : " + name + "<br/>");
        out.println("value : " + value + "<br/>");
    }
    
    out.println("***************************<br/>");
    out.println("세션 전부 지우기<br/>");
    
    session.invalidate(); // 세션 통째로 지우기
    // 세션이 지워졌기 때문에 위에 처럼 while로 뽑아낼 수가 없다 오류 발생
    // java.lang.IllegalStateException: getAttributeNames: 세션이 이미 무효화되었습니다.
    // 아래 처럼 해서 확인해야한다.
    if(request.isRequestedSessionIdValid()){
        out.println("session valid<br/>");
    }else{
        out.println("session invalid<br/>");
    }    
%>
    <a href="session_get.jsp">session get</a>
</body>
</html>
cs

 

 


6. session id 란?

로그인하면 톰캣이던 어디던 웹 서버에서 자동으로 세션 아이디를 생성해서 집어넣는다. (처음 웹 브라우저에 로그인하면 쿠키와 세션 아이디 모두 생성해서 집어넣는다.)

동일한 웹브라우저일 때는 쿠키와 세션 아이디를 공유한다. (처음 저장한 것을 동일하게 사용)  → 웹 브라우저별로 세션 아이디를 생성한다.

즉, 크롬에서 네이버 로그인하고 다음에 가서 네이버를 검색해서 들어가도 네이버 로그인 상태가 유지된다.(동일한 크롬!)

하지만 다른 웹브라우저에 들어가면(예를 들면 엣지) 로그인 상태가 유지가 안된다. 왜냐하면 세션 아이디가 다르기 때문이다.

하지만 동일한 브라우저라도 일정 시간이 지나면 로그인 상태가 유지 되지 않는다. 왜냐하면 일정 시간이 지나면 세션 아이디를 날려버리기 때문이다. (예를 들면 은행 사이트에서 일정 시간동안만 로그인 상태가 유지 되는 것이나, 여러 홈페이지에서든 기본적으로 일정 시간(30분?)이 지나면 재 로그인 요청이 발생한다. 유지 시간은 설정에 따라 다를 수도....)

 


개별진척도

위에 4번

 

21번

아래의 TV 클래스를 만드시오.
public static void main(String[] args) {
        TV myTV = new TV("LG", 2017, 32); //LG에서 만든 2017년 32인치
        myTV.show();
}
//출력
LG에서 만든 2017년형 32인치 TV

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함