[Spring] 쿠키, 세션

보람·2023년 4월 29일
0

Spring

목록 보기
8/18

🔒 로그인 처리하기 - 쿠키, 세션 사용

1. 🍪 쿠키

(1) 쿠키

  • 쿠키 : 서버에서 전달받은 내용을 사용자 측에서 보관
  • 쿠키의 종류
    • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
    • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시 까지만 유지

(2) 로그인 페이지 쿠키 사용

1) 쿠키 생성 후 추가

	// 쿠키 생성
	Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
    // 쿠키 보내기
	response.addCookie(idCookie);
    // 쿠키 생성 후 "/"(home)으로
    return "redirect:/";

2) home화면 로그인 전/후 controll

  • @CookieValue : 쿠키에 담긴 값 사용
  • required = false : 쿠키 정보가 없어도 접근 가능 = 로그인 안 한 사용자도 사용 가능
public String homeLogin(
			@CookieValue(name="memberId", required = false) Long memberId, Model model) {
		
        // 로그인 한 사용자가 아니라면 home으로
		if(memberId == null) {
			return "home";
		}
		// db 조회를 한 후, 사용자가 없으면 다시 home으로 보낸다.
		Member loginMember = memberRepository.findById(memberId);
		if( loginMember == null ) {
			return "home";
		}
		// 로그인에 성공한 사람은 loginHome화면으로 이동		model.addAttribute("member",loginMember);
		return "loginHome";
	}

3) 추가한 쿠키 받아서 로그아웃

  • expire 메서드 만들기
	private void expireCookie(HttpServletResponse response, String CookieName) {
		Cookie cookie = new Cookie(CookieName, null);
		cookie.setMaxAge(0);
		response.addCookie(cookie);
	}
  • expire 메서드 사용
	@PostMapping("/logout")
	public String logout(HttpServletResponse response) {
		expireCookie(response, "memberId");
		return "redirect:/";
	}

2. 📲 session

(1) session

  • 서버에 session이라고 하는 공간에 저장
    • cookie : HttpServletResponse
    • session : HttpServletRequest
  • 웹 페이지 사용하다 시간이 지나면 자동으로 로그아웃

    project > application.properties에 추가

    	# session time out
    	server.servlet.session.timeout=1800
    • 시간단위 : 초 단위
    • 1800 -> 30분

(2) session 옵션

  • request.getSession(true);

    • 세션이 있으면 기존 세션을 반환
    • 세션이 없으면 새로운 세션을 생성해서 반환
  • request.getSession(false);

    • 세션이 있으면 기존 세션을 반환
    • 세션이 없으면 새로운 세션을 생성하지 않고 null로 반환
  • request.getSession();

    • 신규 세션을 생성하는 request.getSession(true);와 동일

(3) 로그인 페이지 session 사용

1) 세션에서 사용될 상수를 정의해놓은 클래스 만들기

  • 세션에서 로그인한 회원 정보를 저장할 때 사용
  • 오타 발생 가능성을 줄임
    public class SessionConst {
        public static final String LOGIN_MEMBER = "loginMember";
    }

2) 세션 생성

	//세션 생성	
	HttpSession session = request.getSession();
	// 속성 설정
    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
	// 세션 생성 후 "/"(home)으로
    return "redirect:/";

3) 세션 받아서 사용

	// 세션 받기
	HttpSession session = request.getSession(false);
    // 받은 세션 사용
	Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);   

4) 세션 받아서 사용 ② - @SessionAttribute

	@GetMapping("/")
	public String homeLoginv3(
    	@SessionAttribute(name=SessionConst.LOGIN_MEMBER, required = false)Member loginMember ,
        Model model) 
  • SessionConst.LOGIN_MEMBER를 key값으로 Member에 할당

5) 세션 삭제

  • session.invalidate(); 사용해서 세션 삭제
	@PostMapping("/logout")
	public String logoutv2(HttpServletRequest request) {
		// 세션 받아서
		HttpSession session = request.getSession(false);
		if( session != null ) {
        	// 세션 삭제
			session.invalidate();
		}
		return "redirect:/";
	}
profile
안녕하세요, 한보람입니다.

0개의 댓글