[국비학원 기록/Servlet] 쿠키, 세션, HttpSession
my code archive
article thumbnail
반응형
HTTP 프로토콜

1)서버 - 클라이언트 통신 시 stateless 방식으로 통신. (일회성 연결)

 

2)브라우저에서 새 웹 페이지를 열면 기존의 웹 페이지나 서블릿에 관한 어떤 연결도 알 수 없다.

  -이전 웹 페이지들이 수행한 작업을 다른 웹 페이지에서 알 수 없다.

 

3)웹 페이지간의 연결 기능이 필요하다.

  ->일회성 연결에 따른 한계를 극복하기 위해 사용되는 방법

      <hidden> 태그, 쿠키(Cookie), HttpSession 객체

 

Hidden Field
<input type="hidden"...>

-HTML <input> 태그의 hidden 값으로 지정하는 숨김 필드를 사용하는 방식

 

<hidden 태그 사용하여 로그인 구현하기>

login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인 창</title>
</head>
<body>
    <form name="frmLogin" method="post" action="login2" enctype="UTF-8">
        아이디: <input type="text" name="user_id"><br>
        비밀번호: <input type="password" name="user_pw"><br>
        <input type="submit" value="로그인">
        <input type="reset" value="다시 입력"> 
        <input type="hidden" name="user_address" value="서울시 서초구">
        <input type="hidden" name="user_email" value="test@gmail.com">
        <input type="hidden" name="user_phone" value="010-1234-5678">
    </form>
</body>
</html>
cs
loginServlet.java
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
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    
    @Override
    public void init() throws ServletException {
        System.out.println("init 메서드 호출");
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        //hidden 속성으로 전송된 값을 getParameter() 이용해 가져옴.
        String user_address = request.getParameter("user_address");
        String user_email = request.getParameter("user_address");
        String user_phone = request.getParameter("user_phone");
        
        String data = "안녕하세요!<br> 로그인하셨습니다. <br><br>";
        data += "<html><body>";
        data += "아이디: " +user_id;
        data += "<br>";
        data += "비밀번호: " +user_pw;
        data += "<br>";
        data += "주소: " +user_address;
        data += "<br>";
        data += "이메일: " +user_email;
        data += "<br>";
        data += "휴대전화: " +user_phone;
        data += "<br>";
        data += "</body></html>";
        out.print(data);
    }
    
    @Override
    public void destroy() {
        System.out.println("destroy 메서드 호출");
    }
cs

<실행 화면>

->GET 방식으로 전송하기 때문에 보안에 취약하고,

   일일이 로그인 정보를 전송해야 해서 불편하다.

 

쿠키(Cookie)

1)쿠키(Cookie)

  -웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 사용하는 방법

 

2)쿠키의 특징

-정보가 클라이언트 pc에 저장됨.

-저장 정보 용량에 제한이 있다.(파일 용량은 4kb)

-보안이 취약함

-클라이언트 브라우저에서 사용 유무를 설정 가능

-웹 사이트(도메인)당 하나의 쿠키가 만들어진다.

 

3)쿠키의 종류

속성 Persistence 쿠키 Session 쿠키
생성 위치 파일로 생성 브라우저 메모리에 생성
종료 시기 쿠키를 삭제하거나
쿠키 설정 값이 종료된 경우
브라우저를 종료한 경우
최초 접속 시 전송 여부 전송 O 전송 X
용도 로그인 유무 또는
팝업창 제한할 때
사이트 접속 시 Session 인증 정보를
유지할 때

 

4)쿠키 API

-javax.servlet.http.Cookie

-HttpServletResponse의 addCookie() : 클라이언트 브라우저에 쿠키를 전송한 후 저장함.

-HttpServletResponse의 getCookie() : 쿠키를 서버로 가져옴.

 

-getName() : 쿠키 이름 반환

-getValue() : 쿠키 값 반환

-setMaxAge() : 쿠키 유효 시간을 초 단위로 지정

-getMaxAge() : 쿠키 유효 시간을 초 단위로 반환

 

쿠키 예제
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
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/get")
public class GetCookieValue extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //브라우저에게 쿠키 정보를 요청한 후 쿠키 정보를 배열로 가져옴
        Cookie[] allValues = request.getCookies();
        for(int i=0; i<allValues.length;i++) { //배열에서 저장할 때 사용한 쿠키 이름인 cookieTest 검색해 쿠키값 가져옴
            if(allValues[i].getName().equals("cookieTest")) {
                
            out.print("<h2>Cookie 값 가져오기 : "+URLDecoder.decode(allValues[i].getValue(),"utf-8")+"</h2>");
        
            }
        }
    }
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@WebServlet("/set")
public class SetCookieValue extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out =response.getWriter();
        
        Date d = new Date();
        
        //Cookie 객체를 생성한 후 cookieTest이름으로 한글 정보 값으로 인코딩해서 쿠키에 저장함.
        Cookie c = new Cookie("cookieTest", URLEncoder.encode("Servlet 프로그래밍입니다","utf-8"));
        //c.setMaxAge(24*60_60);    //유효 기간 설정(하루)
        c.setMaxAge(-1);            //유효 시간을 음수로 지정하여 Session 쿠키를 만듦.
        
        response.addCookie(c);    //생성된 쿠키를 브라우저로 전송함
        
        out.print("현재 시간 : "+d);
        out.print("현재 시간을 Cookie로 저장합니다.");
    }
}
cs

 

세션(Session)

1)세션

-웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법

 

2)세션의 특징

-정보가 서버의 메모리에 저장

-브라우저의 세션 연동은 세션 쿠키를 이용.

-쿠키보다 보안에 유리

-서버에 부하를 줄 수 있음.

-브라우저(사용자)당 1개의 세션(세션 ID)이 생성됨.

-세션의 유효시간은 기본 30분. (은행 분야에서는 10분)

-로그인 상태 유지 기능이나 쇼핑몰 장바구니 담기 기능 등에 주로 사용됨.

 

3)세션 얻는 방법

-HttpSession 클래스 객체를 생성해서 사용.

-HttpServletRequest의 getSession() 메서드를 호출해서 얻음.

-getSession() : 기존의 세션 객체가 존재하면 반환하고 없으면 새로 생성

 

-getAttribute() : session 객체에 저장된 속성 반환

-setAttribute() : session 객체에 속성을 저장

-invalidate() : 현재 세션 정보를 제거

 

세션 예제01.
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
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet("/sess2")
public class SessionTest extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        //최초 요청 시 세션 객체를 새로 생성하거나 기존 세션을 반환함
        HttpSession session = request.getSession();
        
        //생성된 세션 객체의 id를 가져옴
        out.print("세션 아이디: "+session.getId()+"<br>");
        //최초 세션 객체 생성 시간을 가져옴.
        out.print("최초 세션 생성 시각: "+new Date(session.getCreationTime())+"<br>");
        out.print("최초 세션 접근 시각: "+new Date(session.getLastAccessedTime())+"<br>");
        //톰캣 기본 세션 유효 시간을 출력함.
        out.print("기본 세션 유효 시간: "+ session.getMaxInactiveInterval()+"<br>");
        //세션 유효 시간을 5초로 설정.
        session.setMaxInactiveInterval(5);
        out.print("세션 유효 시간 : "+ session.getMaxInactiveInterval() + "<br>");
        
        //최초 생성 세션인지 판별함.
        if(session.isNew()) {
            out.print("새 세션이 만들어졌습니다.");
        }
    }
 
}
cs

예제 코드에서 세션의 유효 시간을 5초로 설정했기 때문에 5초가 지나면 세션 아이디가 바뀐다.

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형