1. 쿠키란? 클라이언트 식별기술
2. 쿠키의 동작과정
3. 쿠키의 생성
Cookie cookie = new Cookie("id",id); // ① 쿠키를생성 name: "id", value: 매개변수id
cookie.setMaxAge(60*60*24); // 유효기간설정(초) = (24h)
response.addCookie(cookie); // ② 응답에 쿠키저장
4. 쿠키의 삭제와 변경
Cookie cookie = new Cookie("id",무관); // 변경할 쿠키와 같은 이름 쿠키생성
cookie.setValue(URLEncoder.encode("개나리")); // 값의 변경
cookie.setDOmain("www.fastcampus.co.kr"); // 도메인의 변경
cookie.setPath("/ch2"); // 경로의 변경
cookie.setMaxAge(60*60*24*7); // 유효기간의 변경
response.addCookie(cookie); // 응답에 쿠키저장
5. 쿠키 읽어오기
Cookie[] cookies = request.getCookies(); //쿠키읽기
for(Cookie cookie : cookies){
String name = cookie.getName();
String vlaue = cookie.getValue();
System.out.println("[cookie] name : " + name + " , value : " + vlaue);
}
예시
@Controller
@RequestMapping("/login")
public class LoginController {
@GetMapping("/login")
public String loginForm() {
return "loginForm";
}
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId, HttpServletResponse response)
throws UnsupportedEncodingException {
System.out.println("ID : " + id);
System.out.println("PWD : " + pwd);
System.out.println("rememberID : " + rememberId);
//[쿠키생성] 1. id와 pwd를 확인
if(!loginCheck(id,pwd)) {
// 2-1. 불일치 → loginForm(redirect)
String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.","utf-8");
return "redirect:/login/login?msg="+msg;
}
// 2-2. 일치 → 홈
if(rememberId) { // rememberId = true 면 생성
Cookie cookie = new Cookie("id",id); // ① 쿠키를생성 name: "id", value: 매개변수id
cookie.setMaxAge(60*60*24); // 유효기간설정(초) = (24h)
response.addCookie(cookie); // ② 응답에 저장
}else { // rememberId = flase 면 삭제
Cookie cookie = new Cookie("id",id); // name: "id", value: 매개변수id
cookie.setMaxAge(0); // 쿠키 삭제 (유효기간0으로 변경)
response.addCookie(cookie);
}
return "redirect:/";
}
private boolean loginCheck(String id, String pwd) {
return "qwe".equals(id) && "1234".equals(pwd);
}
}
1. 세션이란? 로그인~ 로그아웃
서로 관련된 (독립적)서로관계없는 요청들을 하나로 묶은 것 - 쿠키를 이용
브라우저마다 개별저장소(session객체)를 서버에서 제공 ( 쿠키를 이용하기 때문에, session은 서버에 저장 )
세션을 끝내는 방법
① 직접종료 Invalidate() ex.로그아웃
②Timeout()
종료 이후, 요청시에는 새로운 session ID가 발급됨
2. 세션의 생성과정
3. 세션 객체 얻기
HttpSession session = request.getSession();
session.setAttribute("id","adf");
4. 세션과 관련된 메서드
메서드 | 설명 | |
1 | String getId() | 세션의 ID를 반환 |
2 | long getLastAccessedTime() | 세션 내에서 최근 요청을 받은 시간을 반환 (최근요청시간) |
3 | boolean isNew() | 새로 생성된 세션인지를 반환. ( request.getSession() 호출 후 사용 ) |
4 | void invalidate() | 세션 객체를 제거 (저장된 객체도 함께, ex.로그아웃 ) |
5 | void setMaxInactiveInterval(int interval) | 지정된 시간(초)후에 세션을 종료 (예약종료) |
6 | int getMaxinactiveInterval() | 예약된 세션 종료 시간을 반환 |
속성 관련 메서드 | 설명 | |
1 | void setAttribute(String name, Object value) | 지정된 값( value)을 지정된 속성 이름(name)으로 저장 |
2 | Object getAttribute(String name) | 지정된 이름(name)으로 저장된 속성의 값을 반환 |
3 | void removeAttribute(String name) | 지정된 이름(name)의 속성을 삭제 |
4 | Enumeration getAttributeNames() | 기본 객체에 저장된 모든 속성의 이름을 반환 |
5. 세션의 종료
① 수동종료
HttpSEssion session = request.getSession();
session.invalidate(); // 1. 세션을 즉시 종료
session.setMaxInactiveInterval(30*60); // 2. 예약종료 (30분후)
② 자동종료 - web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
6. 세션 vs 쿠키 비교
쿠키(Cookie) | 세션(HttpSession) | |
1 | 브라우저에 저장 | 서버에 저장 (세션객체) |
2 | 서버 부담 X | 서버 부담 O |
3 | 보안에 불리 | 보안에 유리 |
4 | 서버 다중화에 유리 | 서버 다중화에 불리 |
※ 브라우저가 쿠키 허용 x 때를 대비해서 브라우저에서 첫 요청시 2가지 방법으로 보내준다.
① HTTP헤더에 의해서 만들어짐 ( 쿠키에+ 세션)
만약 브라우저에서 쿠키허용 x 라면?
브라우저에서 새로운 요청을 할때마다 서버는 새로운 set-cookie(세션id)를 만든다. ( 계속새로만들어봐야 의미x)
이럴경우,
② 모든 URL에 jssessionId를 붙여준다. (get방식)
직접 세션을 붙여주는게아니라,
jsp파일의 <form action= @>작성형식을 아래와 같이 <c:url vlaue= 맵핑주소> 형식으로 붙여주어야 된다.
1. 게시판 이용시, 미로그인이면 로그인 화면으로 이동
① 홈 화면 → 게시판 선택 ( 미로그인 상태 → 로그인 화면이동 )
② 로그인 화면에서 로그인 후, 무조건 홈으로 가는 불편함 발생
2. 로그인 후, 원래 가려했던 페이지로 이동
해결방법
① BoardController.java는 원래 어디 페이지로 가려고 했는지 URL을 알고 있다.
② 원래 가려고했던 URL정보를 loginForm.jsp에 hidden으로 보내주기
③ LoginController.java에서 id, pwd일치시 hidden으로 받은 URL을 redirect로 보내주기
원래 이동하려했던 위치 확인방법 ( From ~ To )
From : request.URL() or request.URI()
※ URL:전체주소모두표시, URI : post빼고 context부터나옴
To : request.getHeader("referer");
// 필터를 적용할 요청의 패턴 지정 - 모든 요청에 필터를 적용.
// 필터를 등록, 필터를 지정할 대상 urlPatterns="/*" = 모든요청에대하여 필터를 적용해라
@WebFilter(urlPatterns="/*")
public class PerformanceFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 초기화 작업
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1. 전처리 작업
long startTime = System.currentTimeMillis();
// 2. 서블릿 또는 다음 필터를 호출 (★고정★)
chain.doFilter(request, response);
// 3. 후처리 작업
HttpServletRequest req = (HttpServletRequest) request; // HttpServletRequest아니라 형변환필요
String referer = req.getHeader("referer"); // 어디에서 요청했는지 알수 있음 (오타 referrer)
String method = req.getMethod();
System.out.print("["+referer+"] -->> "+" [" + method + "]"+"["+ req.getRequestURI()+"]");
// 이전위치 이동방법(GET or post ) 요청 URL
System.out.println(" 소요시간="+(System.currentTimeMillis()-startTime)+"ms");
}
@Override
public void destroy() {
// 정리 작업
}
}
BoardController.java
loginForm.jsp
LoginController.java
3. 세션 시작할래? session ="true" or session="false"
세션유지기간이 가능한 짧아야함.
① 세션이 필요없는 JSP 화면은 session = false;
② session = false; 는 기존 세션에 영향 X
세션을 시작할까라는 질문으로 인식해도됨
session - true : 세션이 없을때, 생성O ( 세션이 있을때는 생성 X )
- false : 세션이 없을때, 생성 X ( 세션이 있을때는 생성 X )
index.jsp
loginForm.jsp
참고 :
남궁성, 스프링의 정석
'Spring의 정석' 카테고리의 다른 글
SpringMVC 10 (DispatcherServlet, 데이터의 변환과검증) (0) | 2023.03.15 |
---|---|
SpringMVC 9 ( 예외처리 ) (0) | 2023.03.14 |
SpringMVC 7 ( @GetMapping, @PostMapping, redirect, forward) (0) | 2023.03.12 |
SpringMVC 6 (@RequestParam, @ModelAttribu) (0) | 2023.03.11 |
SpringMVC 5 ( Servlet과JSP) (0) | 2023.03.08 |