[Spring] Day08 (Note): 쿠키
2022/3/25
쿠키 Cookie
예전에 뭘 했고 지금은 뭘 하는지 hppt프로토콜은 저장하지 않음. 연결이 끝나면 해당 클라이언트와 연결을 계속하지도 않음. 이를 지속하기 위해 쿠키를 사용.
쿠키는 상태가 없는 프로토콜의 상태를 지속시키기 위해 사용하는 기능.
쿠키는 웹브라우저의 정보를 웹브라우저에 저장한다. 이후로 서버로 전송되는 정보에는 쿠키가 포함한 정보까지 포함돼서 넘어감.
새로운 브라우저냐 이전에 요청을 한 브라우저냐… 판단을 할 수 있음.
쿠키: 웹 브라우저가 보관하는 데이터. 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 파일.
일반적으로 4KB 이하 크기로 생성. 1byte 문자로 현재 모든 상태를 전산에 기록.
쿠키는 비연결 지향인 HTTP의 특징이자 약점을 보완하기 위해 사용된다.
클라이언트의 정보를 클라이언트의 일정한 폴더에 저장하기 때문에 서버의 부하를 줄일 수 있다는 장점이 있고 (세션은 서버에 쿠키는 사용자에 저장), 자동 로그인 기능으로 사용하면 클라이언트 요청마다 로그인할 필요 없이 사용이 가능하다는 것이 장점이다.
*쿠키의 2가지 방식
파일 쿠키: 실제 파일로 남겨서 저장하는 방식. 보안에 취약
웹 쿠키: 브라우저가 관리. 브라우저 종료되면 쿠키가 삭제됨. 브라우저에 쿠키 저장할 거냐고 물어보는데 동의하면 그 부분만 종료 시 삭제하지 않게 구성.
*쿠키는 해당 클라이언트의 브라우저에 정보가 저장되는데, 아이디, 패스워드, 브라우저 정보, ip 시간 등이 저장된다.
*쿠키의 제약 사항: 문자열 데이터만 가능. 4KB 이상의 공간을 차지함. 클라이언트에 300개까지, 도메인당 20개까지 저장 가능, 한도 넘으면 최근 사용되지 않은 쿠키부터 자동 삭제.
1. 동작 방식
쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성 가능
2. 쿠키의 구성
name 쿠키 이름
value 쿠키 저장할 값
maxAge 쿠키의 유효 시간
domain 도메인 : 쿠키가 전송되어야 하는 서버의 도메인 (우리 수업의 도메인은 localhost). 지정하지 않으면 생성된 서버로만 전송.
www.naver.com , naver.com 이렇게 지정을 해놓으면 www.google.com에서는 쿠키가 안 넘어감. 다른 서버의 주소는 도메인으로 설정 불가.
path 경로 : 쿠키가 전송되어야 하는 웹 서버의 특정 URL 지정 (지정 안 하면 생성한 페이지의 경로로만 전송)
‘ / ’ 이렇게 전체 경로를 해놓으면 전체 사이트에서 쿠키가 다 사용할 수 있다. 지정한 경로와 그 하위 경로로만 쿠키가 전송됨.
3. 쿠키 생성
쿠키를 사용하려면 먼저 Cookie 클래스로 쿠키 객체를 생성해야 함.
쿠키에는 각각 웹 브라우저를 판별할 수 있는 정보 포함돼있음.
서버 응답 시, response 객체에 실려 사용자 브라우저에 저장됨.
정보 전달 방식은 Map(key, value) 형태이다.
[ 쿠키 객체 생성 ]
Cookie cookie = new Cookie(String name, String value); // 값은 가급적 영어와 숫자로
[쿠키 유효기간 설정]
cookie.setMaxAge(초단위수);
cookie.setDomain("도메인");
cookie.setPath("페이지경로");
[response 객체에 쿠키 추가 ] <-- 중요! 까먹지 말기
response.addCookie(cookie);
*Cookie 메서드
String getName() : 쿠키 이름 리턴
String getValue() : 쿠키 값 리턴
void setValue(String value) : 쿠키 값 지정
void setDomain(String pattern): 쿠키가 전송될 서버의 도메인을 지정
String getDomain(): 쿠키 도메인 리턴
void setPath(String url): 쿠키를 전송할 경로 지정
String getPath() 경로 리턴
void setMaxAge(int expiry) 쿠키 유효시간. 초단위로 지정. 음수 입력할 경우, 웹 브라우저를 닫을 때 쿠키가 함께 삭제됨.
int getMaxAge() 쿠키의 유효시간 리턴
4. 서버에서 쿠키 읽어오기
: 저장된 모든 쿠키 객체를 가져오려면 request 객체에서 꺼내야 함. 배열로 받기
Cookie [] request.getCookies()
-> 배열에서 내가 찾고 싶은 쿠키 이름을 검색 getName()
5. 쿠키 삭제
: 쿠키는 삭제하는 기능이 없다. 쿠키 유효시간을 만료하면 삭제됨
-> 사용자가 보낸 쿠키들 중에 지울 쿠키 찾아서 cookie.setMaxAge(0);
response.addCookie(cookie);
로그인 폼:
비로그인 -> 쿠키 있다 -> 쿠키 꺼내서 로그인 처리 ->session,cookie -> main
비로그인 -> 쿠키 없다 -> login 폼
로그인 처리:
로그인 안 한 상태 자동 로그인 x -> session만 생성 -> loginPro
로그인 안 한 상태 자동 로그인 o -> session, cookie 둘 다 생성 -> loginPro
main:
로그인- cookie 갱신 -> cookie -> main
비로그인-
1. 쿠키 있다-> 쿠키 꺼내서 로그인 -> session, cookie -> main
2. 쿠키 없다-> main
페이지 | 상황 | 처리 기능(service) | 이동할 페이지(Controller) | ||
로그인 폼 | 비로그인 | 쿠키 있다 | 쿠키 꺼내서 로그인 처리 | session,cookie | main |
쿠키 없다 | login 폼 | ||||
(로그인 안한 상태) 로그인 처리 |
자동 로그인 x | Auto null | session | loginPro |
|
자동 로그인 o | Auto “1” | session, cookie | loginPro |
||
main |
로그인 | 쿠키 있다 | cookie 갱신 | cookie | main |
쿠키 없다 | main | ||||
비로그인 | 쿠키 있다 | 쿠키 꺼내서 로그인 처리 | session, cookie | main | |
쿠키 없다 | main |
*로그인: session에 memId 존재 / 비로그인: session에 memId 없음