[스프링 MVC 2편 - 백엔드 웹 개발 활용 기술] 섹션 6. 로그인 처리1 - 쿠키, 세션
인텔리제이 단축키
- 컨트롤 + 알트 + 씨 -> 상수로 만들기
- 컨트롤 + 알트 + 엔 -> 코드 합치기
- 컨트롤 + 쉬프트 + 티 -> 테스트 코드 만들기
- 알트 + 엔터 -> 코드 줄이는 단축키
로그인 필기
optional에서 get이라고 하면 안에있는게 나오게 된다.
login get password가 같은지 확인할때 쓰는 것 -> .equals
@RequiredArgsContructor -> final이 붙거나 @NotNull이 붙은 필드의
생성자를 자동 생성해주는 롬복 어노테이션
생성자 주입은 a객체가 b객체를 사용하는 코드가 있을때, b객체를 생성
하여 a객체게 사용할 수 있도록 관계를 형성해 주는 것이다.
login 맴버를 못찾거나 이이디 패스워드가 안맞는 것인데 이런 경우는
if(loginMember == null) {
bidningResult.rehect("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.);
return "login/loginForm";
}
쿠키에는 영속쿠키와 세션 쿠키가 있다.
- 영속쿠키: 만료날짜를 입력하면 해당 날짜까지 유지
- 세션큐키: 만료날짜를 생략하면 브라우저 종료시 까지만 유지
public String homeLogin(@CookieValue(name= "memberId", required = false) Long memberId, Model model) {
required = false 를 쓰는 이유가 뭔가
Member loginMember = memberRepository.findById(memberId);
if(loginMember == null) {
return "home";
}
디비에 없는 경우도 있기 때문에 loginMember==null을 집어 넣는다.
쿠키의 보안문제
- 쿠키의 값이 임의로 변경
- 쿠키에 보관된 정보는 훔쳐갈 수 있다.
- 해커가 쿠리를 한번 훔쳐가면 평생 사용할 수 있다.
이러한 문제를 해결하기위해 세션이라는 친구가 나온다.
새션 관리
- 세션 생성
sessionid생성(임의의 추정 불가능한 랜덤 값)
세션 저장소에 sessionid와 보관할 값 저장
sessionId로 응답 쿠키를 생성해서 클라이언트에 전달
- 세션 조회
클라이언트가 요청한 sessionid쿠키의 값으로, 세션 저장소에 보관한 값 조회
- 세션 만료
클라이언트가 요청한 sessionis쿠키의 값으로, 세션 저장소에 보관한 sessionid의 값 제거
해쉬 맵도 괜찮지만 동시성이 있는 경우는 ConcurrentHashMap을 사용해야한다.
findFirst() -> 순서중에서 가장 먼저 나온 애
findAny() -> 순서 상관없이 빨리 나온애
HttpServletResponse 는 인터페이스이고 구현체가 있지만 테스트 만들기가 어렵다 하지만
세션의 create 옵션에 대해 알아보자.
request.getSession(true)
세션이 있으면 기존 세션을 반환한다.
세션이 없으면 새로운 세션을 생성해서 반환한다.
request.getSession(false)
세션이 있으면 기존 세션을 반환한다.
세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
HttpSession session = request.getSession(false);
세션이 없는것이 목적이기 때문에 false를 집어넣는다
true이면 세션을 생성
session.invalidate();
세션이랑 그 안에 있는 데이터가 다 날라가는 구문
로그인 처리하기
@SessionAttribute -> 스프링에서 제공하는 세션을 더 편리하게 사용할 수 있도록 지원하는 기능
log.info("sessionId={}", session.getId());
log.info("getMaxInactiveInterval={}", session.getMaxInactiveInterval());
log.info("getCreationTime={}", new Date(session.getCreationTime()));
log.info("lastAccessedTime ={}", new Date(session.getLastAccessedTime()));
log.info("isNew={}", session.isNew());
http는 비연결성으므로 서버 입장에서는 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지를 인식할 수 없다. 따라서 서버에서 세션 데이터를 언제 삭제해야 하는지 판단하기가 어렵다.
문제점
- 세션과 관련된 쿠키를 탈취 당했을 경우 오랜시간이 지나도 해당 쿠키로 요청 가능
- 세션이 메모리에 생성되기때문, 용량때문에 필요한 경우에만 생성해서 사용
세션의 종료 시점
- 30분에 한시간정도 잡는게 좋다. 30분 지나면 사라지게끔 -> 문제점이 있는데 사용중임에도 불구하고 세션이 날라가서 또 로그인해야한다.
- 해결법 -> 최근에 요청한 시간을 기준으로 30분 정도로 만든다.