도메인과 웹으로 구분해준다.
도메인 : 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함
웹 : 화면 , UI ..
타임리프 폼은 어렵지 않아 설명은 생략한다.
단순 map에 key, value 형태로 id,member객체 를 저장하는 방식이다. 그리 어렵지 않다.
쿠키, 세션 을 사용하지 않고 순수 코드로만 로그인 기능을 만들어 보자.
로그인 뷰단은 타임리프 onclik을 활용해 로그인클릭시 /loging API로 연결 시켜준다.
입력폼에 오류가 있을경우를 bindingResult로 체크 -> 오류있으면 다시 로그인 화면으로
입력한 값으로 DB에서 해당 계정이 있으면 반환 없으면 오류 메세지 반환후 다시 로그인 페이지로
reject 를 활용해 글로벌 에러를 보내준다.
@ModelAttribute("aaa") = 뷰단에 aaa라는 이름을 가진 객체로 폼이 넘어간다 .
=> 순수 코드로만 로그인 기능을 구현해봤다. 하지만 여기서 문제점은 로그인 상태가 다음페이지로 넘어가면 유지가 되지 않는다는점! 쿠키와 세션을 활용해 로그인 유지를 구현해보자
간단히 설명하면 로그인 성공뒤 서버에서 이사람은 로그인 완료된 사용자 다라는 데이터(쿠키)를 보내 쿠키저장소 라는 곳에 저장하는것
다른 사이트로 넘어갈때마다 쿠키에서 로그인 완료했다는 데이터를 사용한다.
기존 컨트룰러에서 추가된 부분이다.
로그인에 성공하면 쿠키라는 공간에 memberId라는 이름으로 실제 로그인한 멤버의 ID값을 넣어 response에 쿠키를 한번더 담아서 클라로 던져준다.
클라이언트가 다음 사이트로 접속요청을 보낼때 쿠키데이터(memberId) 를 사용해 인증을 한다.
로그인후 클라이언트가 보낸 쿠키값을 서버에서 꺼내는 방법이다. @CookieValue 로 데이터를 담은 쿠키 이름(?) 을 설정 값을 꺼내준다.
required = false -> home화면은 로그인을 하지 않은 사람도 접속할수 있으니까
하지만 쿠키는 치명적인 단점이 있는데... 쿠키값을 조작하기 너무 쉽다는 점이다.
이를 해결하기 위해 나온게 세션 이다.
- 클라가 로그인을 하면 해당 정보가 있는지 서버에서 찾는다. 있으면 해당 로그인 객체를 value로 저장하고 키값은 랜덤(세션Id)으로 생성한다.
- 그 키값을 쿠키에 담아 클라에게 보낸다.
- 클라는 그 쿠키안에 있는 키값으로 인증을 한다.
UUID를 활용해 랜덤값 (세션ID) 값을 만들어 준뒤 map 에 키값으로, value는 로그인한 객체를 저장 해준다.
쿠키 -> response 순으로 담아서 클라에게 보내준다.
Map은 쓰레드 동시성에 대해 안전하지 않다. CocurrentHashMap를 사용해 안전성 확보
직접만든 세션이 아닌 공식지원하는 서블릿 HTTP세션을 사용해보자.
HttpSession 을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.
request.getSession = 세션이 있으면 그것을 반환하고 없으면 새로 생성한다.
session.setAttribute = 세션에 객체(로그인 맴버) 값 저장
로그인된 사용자를 찾을때 사용한다. 기존 코드들을 더 편리하게 사용하기 위함
이 애노테이션은 세션을 생성하지 않는다.
세션을 찾고, 세션에 들어있는 데이터를 찾는 번거로운 과정을 스프링이 한번에 편리하게 처리해주는 것을 확인할 수 있다.
보통 로그아웃을 누르지 않고 그냥 브라우저 창을 닫는 경우가 대부분이다. (세션유지)
HTTP가 비 연결성(ConnectionLess)이므로 서버 입장에서는 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지를 알 수 없다.
세션은 메모리를 사용한다. 수가 많아지면 그만큼 서버에 부담을 준다.
->세션은 꼭 필요 할떄만 생성한다.
세션의 타임아웃 시간은 해당 세션과 관련된 JSESSIONID 를 전달하는 HTTP 요청이 있으면 현재 시간으로 다시 초기화 된다
properties 에 세션 유지시간 설정
->server.servlet.session.timeout=60
=> 이 문제점을 해결하기 위해 세션 생명주기를 조정해준다.
=> 보통 최근요청 30분 이후로 설정