본문 바로가기

DEVELOPMENT/JSP

[JSP] Cookie, Session

Cookie(쿠키)

 

1. 쿠키

Connectionless로 인해 서버는 클라이언트를 식별할 수가 없는데, 이를 Stateless라고 합니다.

서버가 클라이언트를 기억해야 할 경우, 브라우저 단에서 쿠키라는 것을 저장하여 서버가 클라이언트를 식별할 수 있도록 한다.

쿠키 동작 방식 쿠키 생성 → 쿠키 저장 → 쿠키 전송
쿠기의 구성 이름, 값, 유효시간, 도메인, 경로
쿠키의 장점 다시 서버에 request할 필요가 없기 때문에 속도가 빠르다.
쿠키의 단점 로그인 정보 등 사용자의 정보가 저장되는 경우가 많아 보안에 취약하다.
쿠키 사용 예시 팝업 보지 않기, 사용자 이전 스크롤링이나 뷰 설정 값 등

 

2. 쿠키 생성

// 쿠키 생성
Cookie cookie = new Cookie("username", "사용자이름");

// 쿠키 값 재설정
cookie.setValue("value2");

// 쿠키 유지 시간 설정(초단위)
cookie.setMaxAge(60*2); 

// 쿠키를 클라이언트로 전송
response.addCookie(cookie);
메소드 리턴 타입 설명
getName() String 쿠키 이름을 구한다.
getValue() String 쿠키 값을 구한다.
setValue(String value) void 쿠키 값을 지정한다.
setDomain(String pattern) void 이 쿠키가 전송될 서버의 도메인을 지정한다.
getDomain() String 쿠키의 도메인을 구한다.
setPath(String url) void 쿠키의 전송할 경로를 지정한다.
getPath() String 쿠키의 전송 경로를 지정한다.
setMaxAge(int expiry) void 쿠키의 유효시간을 초 단위로 지정한다.
음수를 입력할 경우 웹 브라우저를 닫을 때 쿠키가 함께 삭제된다.
getMaxAge() int 쿠키의 유효시간을 구한다.

 

3. 쿠키 읽어오기

Cookie[] cookies = request.getCookies(); //client에서 쿠키를 받아옴

String cookieName = "";
String cookieValue = "";

if(cookies!=null){
    for(int i=0;i<cookies.length;i++){
        if(cookies[i].getName().equals("cookieName")){
            cookieName = cookies[i].getName();
            cookieValue = cookies[i].getValue();
        }
    }
}

 

4. 쿠키 삭제

if(cookies != null){
    for(int i=0; i < cookies.length; i++){
    	// 쿠키 유지시간은 0으로 설정
        cookies[i].setMaxAge(0);
        
        // 변경된 쿠기 정보를 다시 클라이언트에 전달
        response.addCookie(cookies[i]);
    }
}

 

5. 쿠키 이름

쿠키 이름은 콤마, 세미콜론, 공백, 등호기호('=')를 제외한 출력 가능한 아스키 문자로 구성된다. 여러 문자를 사용할 수 있지만 보통 쿠키 이름을 작성할 때에는 알파벳과 숫자만 이용한다. 쿠키 값은 콤마, 세미콜론, 공백 문자를 제외한 나머지 출력 가능한 아스키 문자를 사용할 수 있다. 값으로 사용할 수 있는 문자가 한정되어 있기 때문에 쿠키 값을 생성할 때에는 알맞은 방식으로 인코딩한다. 

// 쿠키 저장 → 인코딩
String encoded = URLEncoder.encode(str, "UTF-8");

// 쿠키 가져오기 → 디코딩
String decoded = URLDecoder.decode(str, "UTF-8");

 

6. 쿠키 유효시간

쿠키를 삭제할때 setMaxAge()를 이용해 삭제를 할 수 있다.
쿠키는 보통 유효시간을 정해주지 않으면 웹 브라우저를 닫음과 동시에 쿠키가 삭제된다.
그러나 유효시간을 정해놓으면 설정해놓은 유효시간동안 쿠키가 존재하게 되고 웹 브라우저를 닫아도 유효시간이 남아있으면 쿠키는 삭제되지 않고 남아있게 된다.

 

 

Session(세션)

 

1. 세션

클라이언트가 웹 브라우저를 통해 서버에 접속한 후 용무를 처리하고 웹 브라우저를 닫아 서버와의 접속을 종료하는 하나의 단위를 세션이라고 한다. 즉 세션은 클라이언트가 서버에 접속해 있는 동안 그 상태를 유지하는 것이 목적이다.

쿠키는 사용자 정보가 브라우저에 저장되기 때문에 공격자로부터 위변조의 가능성이 높아 보안에 취약하다.

이와 달리 세션은 브라우저가 아닌 서버단에서 사용자 정보를 저장하는 구조이므로, 쿠키보다는 안전하다고 할 수 있다.

그런데 세션 정보도 중간에 탈취 당할 수 있기 때문에 보안에 완벽하다고 할 수 없다.

또한 세션을 사용하면 서버에 사용자 정보를 저장하므로, 서버의 메모리를 차지하게 되고, 만약 동시 접속자 수가 많은 서비스일 경우에는 서버 과부화의 원인이 된다.

 

2. 세션 생성

// 세션 생성
session.setAttribute("이름", 값);

// 세션 유지 시간 설정(초단위)
session.setMaxInactiveInterval(1000);

// 세션 유지 시간 반환
session.getMaxInactiveInterval();

 

3. 세션정보 가져오기

session.getAttribute("이름");

 

4. 세션정보 삭제

session.removeAttribute("이름");

 

5. 세션정보 초기화

sesssion.invalidate();

 

 

쿠키 vs 세션

 

구분 쿠키 세션
저장 위치/형식 클라이언트 PC에 text로 저장 웹 서버에 Object 타입으로 저장
보안 클라이언트에 저장되므로 보안에 취약 서버에 저장되므로 쿠키에 비해 보안에 안전
저장 데이터 크기 제한 있음 서버에서 수용할 수 있는 만큼

 

 

JSESSIONID

 

톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키.
HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고 응답후 연결은 끈히게 되므로 상태를 유지할 수 없다.
따라서 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 한다.

 

 

 

 

'DEVELOPMENT > JSP' 카테고리의 다른 글

[JSP] Forward, Redirect  (0) 2023.03.05
[JSP] DTO, 자바빈즈, DAO  (0) 2023.03.05
[JSP] 내장 객체  (0) 2023.03.05
[JSP] 지시어, 스크립트 요소  (0) 2023.03.05
[JSP] 기본 용어 정리  (0) 2023.03.05