반응형

Cookie
    쿠키란 웹 브라우저가 보관하고 있는 데이터.
    웹 서버에서 쿠키를 생성하여 브라우저에 응답하면 브라우저에서 해당 쿠키를 로컬에 저장.
    이 후 웹 브라우저에서 웹 서버로 요청을 보낼 때 쿠키를 포함하여 전송.
 
일반적인 쿠키를 사용한 동작과정
    1. 클라이언트의 웹 브라우저에서 웹 서버로 요청
    2. 웹 서버에서 쿠키를 생성한 후 클라이언트의 요청에 대한 응답과 함께 쿠키를 전송
    3. 클라이언트의 웹 브라우저는 쿠키저장소에 받은 쿠키를 저장
    4. 이 후 클라이언트의 웹 브라우저가 서버에 요청할 때 쿠키를 함께 전송
    5. 서버는 클라이언트가 보낸 쿠키를 확인하여 연결 유지 및 관리
 
웹 브라우저에 쿠키가 저장되면 쿠키가 삭제될 때까지 웹 서버에 요청할 때마다 쿠키를 함께 전송한다.
즉, 웹 어플리케이션을 사용하는 동안 유지되어야 하는 정보는 쿠키를 사용하여 저장한다.
 
쿠키의 구성요소
    이름 : 쿠키를 구별하는데 사용
    값 : 쿠키의 이름과 연결된 값
    유효시간 : 쿠키의 유효시간
    도메인 : 쿠키를 전송할 도메인
    경로 : 쿠키를 전송할 요청경로

   

    위의 정보 중에 가장 중요한 것은 이름과 값이다.
    웹 브라우저는 여러 개의 쿠키를 가질 수 있으므로 이를 구분하기 위해 이름이 사용된다.
    서버는 쿠키의 이름을 사용하여 값을 얻어와 필요한 작업을 수행할 수 있다.
 
쿠키 이름 규약(RFC 2109)
    쿠키의 이름은 아스키 코드의 알파벳과 숫자만 포함 가능(특수문자, 빈 문자 사용 불가)
    만일 위 규칙에 어긋나는 값을 갖고 있다면 BASE64 인코딩 처리 필요
    (java.net패키지의 URLEncoder, URLDecoder 사용)
 
쿠키 추가정보(읽어보기)
    쿠키는 클라이언트에 저장된 적은 양의 정보다.
    크기는 4KB 이하로 제한되어 있고, 300개까지의 데이터 정보 배열을 저장할 수 있다.
    쿠키를 사용할 수 있는 최대 용량은 4KB*300개=1.2MB가 된다.
    쿠키의 크기는 4KB로 이하로 제한되어 있으므로 작은 정보 형태로 저장되고,
    오래된 정보는 자동으로 삭제된다.
    이미지(그림) 정보는 대부분 용량이 크기 때문에 경로만 저장한다.
    쿠키는 클래스 형태로 제공되므로 쿠키 객체를 생성한다.
    생성할 때 생성자가 자동으로 호출된다.

 

예제코드 - 쿠키 생성
/WebContent/cookie/makeCookie.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder"%>
<%
    Cookie cookie = new Cookie("name", URLEncoder.encode("홍길동""UTF-8"));
    //쿠키 생성(규약에 맞지 않는 값을 사용한다면 인코딩 필요)
    response.addCookie(cookie);
    //생성한 쿠키를 응답객체에 추가(여러 개 가능)
%>
<html>
<head>
<title>쿠키 생성</title>
</head>
<body>
    <%=cookie.getName()%>
    쿠키의 값 : "<%=cookie.getValue()%>"
</body>
</html>
cs

 

요청결과 - 서버에서 생성된 쿠키 정보를 응답으로 확인한다.

응답된 값은 "홍길동"문자열을 UTF-8로 인코딩된 결과로 깨지거나 오류가 아님.

 

쿠키 관련 메서드(set, get)

 

쿠키 값 읽어오기
    웹 브라우저가 보낸 요청의 헤더에 쿠키 값을 포함하여 요청한다.
    서버에서 해당 쿠키 값을 읽어오기 위해 request객체의 다음 메서드를 사용하여 쿠키 배열을

   얻는다.


    Cookie[] cookies = request.getCookies();


    쿠키가 없는데 서버에서 사용하려는 경우 NullPointerException이 발생 하므로 요청객체에

   쿠키의 존재여부를 판단하는 작업이 필요하다.
 

예제코드
/WebContent/cookie/viewCookie.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 language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLDecoder" %>
<html>
<head>
<title>쿠키 목록</title>
</head>
<body>
쿠키 목록<br>
<%
    Cookie[] cookies = request.getCookies();
    if(cookies != null && cookies.length > 0){
        for(int i = 0; i < cookies.length; i++){
%>
        <%= cookies[i].getName() %> : 
        <%= URLDecoder.decode(cookies[i].getValue(), "UTF-8"%><br>
<%        }
    } else {
%>
쿠키가 존재하지 않습니다.
<%
    }
%>
</body>
</html>
cs

 

요청결과

 

쿠키 값 변경 및 삭제
 쿠키의 값을 변경 하려면 먼저 동일한 쿠키 이름으로 새로운 쿠키를 생성하여 응답객체에 추가하면 된다.
 해당 이름의 쿠키가 없으면 새로운 쿠키가 생성이 되는 것이고 존재할 경우 해당이름의 쿠키 값이 변경된다.
 존재 여부를 확인 후 변경하는 것이 좋다.(필요 없는 쿠키의 생성을 방지)
 

예제코드

/WebContent/cookie/modifyCookie.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<%
    Cookie[] cookies = request.getCookies();
    if(cookies != null && cookies.length > 0){
        for(int i = 0; i < cookies.length; i++){
            if(cookies[i].getName().equals("name")){
                Cookie cookie = new Cookie("name"
                    URLEncoder.encode("JSP Programing!""UTF-8"));
                response.addCookie(cookie);
            }
        }
    }
%>
<html>
<head>
<title>쿠키 값 변경</title>
</head>
<body>
name 쿠키의 값을 변경합니다.
</body>
</html>
cs

 

위 코드들을 다음과 같은 순서로 요청하여 테스트를 진행한다.

 

1. makeCookie.jsp 요청 - 쿠키가 생성됨
2. viewCookie.jsp 요청 - 생성된 쿠키 확인
3. modifyCookie.jsp 요청 - 쿠키값 변경
4. viewCookie.jsp를 새로고침(요청) 해보면 변경된 쿠키값이 확인

 

쿠키 삭제
    Cookie 클래스에는 삭제하는 기능이 따로 존재하지 않는다.
    따라서 쿠키를 삭제하려고 할 경우 setMaxAge()메서드를 사용하여 쿠키의 유효시간을 0으로     설정하고 응답 객체에 추가해주면 된다.

 

예제코드 
/WebContent/cookie/deleteCookie.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder"%>
<%
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (int i = 0; i < cookies.length; i++) {
            if (cookies[i].getName().equals("name")) {
                Cookie cookie = new Cookie("name""");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
        }
    }
%>
<html>
<head>
<title>쿠키 삭제</title>
</head>
<body>쿠키를 삭제 합니다.
</body>
</html>
 
cs


 

쿠키의 경로

서버로부터 응답받은 쿠키는 브라우저에 저장되어 있다.

이 쿠키는 쿠키를 발급한 서버에 요청(request)할 때마다 같이 포함되어 요청된다.

(쿠키의 경로는 디폴트로 최상위(/) 경로가 지정되어 있으므로 컨텍스트(/) 경로 하위의 모든 자원 요청에 포함됨)
쿠키는 URL경로를 별도로 지정하여 지정된 경로 또는 그 하위 경로에 쿠키를 보내도록 설정할 수 있다. 경로를 지정할 때는 setPath()메서드를 사용한다.

 

예제코드

/WebContent/path1/setCookieWithPath.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
39
40
41
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.net.URLEncoder" %>
<%
    Cookie cookie1 = new Cookie("path1", URLEncoder.encode("경로 : /JSP_TEST/path1""UTF-8"));
    cookie1.setPath("/JSP_TEST/path1");
    response.addCookie(cookie1);
    
    Cookie cookie2 = new Cookie("path2", URLEncoder.encode("경로 : ""UTF-8"));
    response.addCookie(cookie2);
    
    Cookie cookie3 = new Cookie("path3", URLEncoder.encode("경로 : /""UTF-8"));
    cookie3.setPath("/");
    response.addCookie(cookie3);
    
    Cookie cookie4 = new Cookie("path4", URLEncoder.encode("경로 : /JSP_TEST/path2""UTF-8"));
    cookie4.setPath("/JSP_TEST/path2");
    response.addCookie(cookie4);
%>
<html>
<head>
<title>쿠키 경로 지정</title>
</head>
<body>
 
다음과 같이 쿠키를 생성했습니다.<br>
<%= cookie1.getName() %> : <%= cookie1.getValue() %>
[<%= cookie1.getPath() %>]
<br>
<%= cookie2.getName() %> : <%= cookie2.getValue() %>
[<%= cookie2.getPath() %>]
<br>
<%= cookie3.getName() %> : <%= cookie3.getValue() %>
[<%= cookie3.getPath() %>]
<br>
<%= cookie4.getName() %> : <%= cookie4.getValue() %>
[<%= cookie4.getPath() %>]
 
</body>
</html>
 
cs

 

위 코드를 실행하면 쿠키를 생성한다.

 

이어서 앞에서 만들었던 viewCookie.jsp 파일을
/JSP_TEST/path1/
/JSP_TEST/
/JSP_TEST/path2/
위 경로에 각각 복사하여 실행하면 아래와 같은 결과가 나온다.

 

/WebContent/path1/viewCookie.jsp 실행 결과


1. path1 쿠키는 경로를 path1에 지정했으므로 쿠키 전송
2. path2 쿠키는 경로를 지정하지 않았으므로 실행한 jsp의 경로가 적용되어 쿠키를 전송한다.
3. path3 쿠키는 / 경로를 지정했으므로 하위 어떤 페이지라도 모두 쿠키를 전송한다.
 
/WebContent/path2/viewCookie.jsp 실행 결과

 
1. path1 쿠키는 경로가 path2가 아니므로 전송하지 않는다.
2. path4 쿠키는 path2가 지정된 경로이므로 쿠키를 전송한다.
3. path3 쿠키는 / 경로를 지정했으므로 하위 어떤 페이지라도 모두 쿠키를 전송한다.

/WebContent/viewCookie.jsp 실행 결과

 
1. 프로젝트 바로 아래에 있는 viewCookie.jsp를 실행하면
2. path1, path2 쿠키보다 상위 경로이므로 "/"로 경로를 지정한 path3쿠키만 전송한다.
 
일반적으로 쿠키는 웹 어플리케이션의 여러 페이지에서 사용되는 경우가 많기 때문에 경로를 "/" 로 지정.

 

쿠키의 유효시간
    쿠키는 유효시간이 지나면 다시 사용할 수 없다.
    브라우저에서 쿠키가 유효한 시간이 있다.
    시간을 지정하지 않은 경우 웹 브라우저를 닫으면 삭제
    쿠키에 유효시간을 정해 놓으면 브라우저를 닫아도 유효시간 동안 쿠키가 삭제되지 않는다.
 

예제코드
/WebContent/cookie/makeCookieWithMaxAge.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    Cookie cookie = new Cookie("oneh""1time");
    cookie.setMaxAge(60 * 60); //초 단위 입력(60초(1분) * 60 = 1시간)
    response.addCookie(cookie);
%>
<html>
<head>
<title>쿠키의 유효시간 설정</title>
</head>
<body>
 
유효시간이 1시간인 oneh 쿠키 생성.
 
</body>
</html>
cs

 

viewCookie.jsp를 실행하여 쿠키를 확인 

 

이 후 브라우저를 닫아도 생성 된 후 1시간 이내에는 쿠키가 삭제되지 않는다.

 

모든 웹 브라우저를 닫고 1시간이내에 viewCookie.jsp를 실행하면 계속 쿠키가 확인된다.

 


웹에서 아이디 기억하기 기능
    A. 웹에서 아이디를 기억하는 기능은 쿠키를 사용하여 구현된다.
    B. 사용자가 로그인에 성공하면 아이디를 값을 저장하고 있는 쿠키에 대해 유효시간을

       1달 정도로 여유 있게 설정하여 생성.
    C. 브라우저를 닫아도 다음 접속 시 쿠키에 저장된 아이디를 불러와서 로그인 폼에

       출력시킨다.
 
 
쿠키와 헤더
    response.addCookie() 메서드로 쿠키를 추가하면 실제로는 Set-Cookie 헤더를 통해 전달된다.
    Set-Cookie 헤더는 하나의 쿠키 값을 전달한다.

Set-Cookie 헤더 구성
    쿠키이름=쿠키 값; Domain=도메인 값; Path=경로 Expire=GMT형식의 만료 일시
    출력버퍼의 내용이 Flush 되면 그 다음부터는 응답 헤더에 새로운 값을 추가할 수 없다.
    쿠키는 출력 버퍼가 한번 Flush되면 새롭게 추가 또는 변경이 불가능 하므로
    출력버퍼가 Flush되기 전에 추가 또는 변경에 대한 작업을 해야 한다.

쿠키를 사용한 로그인 유지
    웹사이트의 기본기능은 인증을 하기 위한 로그인/로그아웃이다.
    이 때 단순히 로그인/로그아웃만 구현하면 브라우저에서 페이지 이동 시 로그인 상태가
    유지될 수 없다. 이것을 로그인 상태로 유지지게 만들기 위해 쿠키를 사용할 수 있다.
 
로그인 상태 검사방법
    1. 로그인을 하면 관련 쿠키를 생성한다.
    2. 쿠키가 존재하면 로그인 상태라고 인식한다.
    3. 로그아웃 하면 관련 쿠키를 삭제한다.
 
 예를 들어 로그인에 성공 시 "login" 쿠키를 생성하고 이 후 페이지를 이동하더라도 "login"쿠키가
존재하는 동안은 로그인 상태로 동작시키면 된다. 
 

예제코드
/WebContent/member/loginForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>로그인</title>
</head>
<body>
    <form action="<%=request.getContextPath()%>/member/login.jsp"
        method="POST">
        아이디 <input type="text" name="id" size="10"> 암호 <input
            type="password" name="password" size="10"> <input
            type="submit" value="로그인">
    </form>
</body>
</html>
cs


 요청결과


 이제 아이디와 비밀번호를 입력 한 후 "로그인"버튼을 누르면 /member/login.jsp페이지로 요청하면서 입력한 데이터를 넘긴다. 이 때 쿠키로 로그인 유지만 테스트 할 것이므로 아이디와 비밀번호 값을 비교하여 같으면 로그인 성공이라는 개념만 구현할 것이다.
 

예제코드
/WebContent/member/login.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String id = request.getParameter("id");
    String password = request.getParameter("password");
    
    if(id.equals(password)){
        //아이디와 암호가 서로 같으면 로그인 성공으로 판단
        Cookie cookie1 = new Cookie("LOGIN""SUCCESS");
        cookie1.setPath("/");
        response.addCookie(cookie1);
        
        Cookie cookie2 = new Cookie("ID", id);
        cookie2.setPath("/");
        response.addCookie(cookie2);
%>
<html>
<head>
<title>로그인 성공</title>
</head>
<body>
로그인에 성공했습니다.
</body>
</html>
<%
    } else {    //로그인 실패 시
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>    
<%
    }
%>
cs

 

위 페이지 실행 후
id : 1234 / pass : 1234와 같이 ID와 PASSWORD를 똑같이 입력 하면 로그인 성공 


ID 와 PASSWORD값이 다를 경우 로그인 실패


이제 페이지를 이동할 때마다 로그인 성공 시 만들어진 LOGIN/SUCCESS 쿠키를 확인하는 작업을 하여 현재 로그인 상태를 유지한다.

로그인 여부 체크
/WebContent/member/loginCheck.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
39
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %>
<%
    Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
    boolean login = false;
    if(request.getCookies() != null){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(int i = 0; i < cookies.length; i++){
                cookieMap.put(cookies[i].getName(), cookies[i]);
            }
            Cookie tmp = cookieMap.get("LOGIN");
            if(tmp != null)
                login = tmp.getValue().equals("SUCCESS");
        }
        
    }
    
%>
<html>
<head>
<title>로그인여부 검사</title>
</head>
<body>
<%
    if(login){
%>
아이디 ["<%= cookieMap.get("ID").getValue() %>"]로 로그인 한 상태
<%
    } else {
%>
로그인하지 않은 상태
<%
    }
%>
</body>
</html>
 
cs

 

로그아웃을 할 때는 로그인 유지에 사용된 쿠키들의 유효시간을 0으로 변경한다.

 

예제코드
/WebContent/member/logout.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    Cookie cookie1 = new Cookie("LOGIN""");
    cookie1.setValue("");
    cookie1.setPath("/");
    cookie1.setMaxAge(0);
    response.addCookie(cookie1);
    
    Cookie cookie2 = new Cookie("ID""");
    cookie2.setValue("");
    cookie2.setPath("/");
    cookie2.setMaxAge(0);
    response.addCookie(cookie2);
%>
<html>
<head>
<title>로그아웃</title>
</head>
<body>
로그아웃 되었습니다.
</body>
</html>
cs

 

이제 viewCookie.jsp를 /WebContent/member/에 복사하여 다음과 같이 테스트 하자.
    1. 로그인하기 전에 viewCookie.jsp를 실행하여 쿠키 목록 확인
    2. loginForm.jsp를 실행하여 로그인한 후 viewCookie.jsp를 실행하여 쿠키목록 확인
    3. loginCheck.jsp를 실행하여 로그인 여부 확인
    4. logout.jsp 실행 후 viewCookie.jsp를 실행하여 쿠키 목록 확인
    5. loginCheck.jsp를 실행하여 로그인 여부 확인 
 
쿠키를 사용하여 로그인 여부를 판단하고 유지할 수 있다는 것을 이해하자.
 

 

 

반응형

'교육자료 > JSP' 카테고리의 다른 글

(교육자료)파일 업로드 실습  (0) 2018.09.06
(교육자료)세션 이해하기 실습  (0) 2018.09.06
(교육자료)게시판 페이징 분석 참조  (0) 2018.09.06
세션개념 이해하기  (0) 2018.09.03
쿠키개념 이해하기  (0) 2018.09.03

+ Recent posts