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 |