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

 

 

 


참고 :

남궁성, 스프링의 정석

+ Recent posts