1. 회원 엔티티에 있는 데이터를 통하여 이메일, 비밀번호가 일치하는 회원이 로그인 요청 시 인증
처리
2. 로그인 여부, 회원 등급에 따라 접근 권한 인가
처리
public List<Member> findByLoginMail(String loginMail) {
// 로그인 시도하는 이메일과 일치하는 회원정보를 가져오는 JPQL
// .getSingleResult는 없을 시, 예외를 뱉기 때문에 리스트로 받아옴
return em.createQuery("select m from Member m where m.memMail =:memMail", Member.class)
.setParameter("memMail", memMail)
.getResultList();
}
@PostMapping("/login")
public String login(
@ModelAttribute LoginForm form,
HttpServletRequest request,
HttpServletResponse response
) {
List<Member> loginMemeber = memberRepsitory.findByLoginMail(form.getMail());
if(!loginMember.isEmpty()) {
Member member = loginMember,get(0);
//중복된 이메일이 없을 것이라는 가정하에 이렇게 진행
} else {
log.info("이메일 맞지 않음");
return "loginForm";
}
if(member.getPassword().equals(form.getPassword())) {
log.info("로그인 성공!!");
return "redirect:/";
} else {
log.info("비밀번호 맞지 않음");
return "loginForm";
}
}
접근하려는 클라이언트의 로그인 여부, ROLE 등을 판단하여 접근 권한을 판단하는 절차
위에서 로그인 인증이 성공한 클라이언트는 회원으로 접근이 가능한 페이지는 접근 가능하도록 해야한다.
/login
요청으로 회원임을 확인 하고 로그인 인증
이 완료된 클라이언트에겐 쿠키를 발급 if(member.getPassword().equals(form.getPassword())) {
log.info("로그인 성공!!");
Cookie loginCookie = new Cookie("loginMail", member.getMail());
response.addCookie(loginCookie);
return "redirect:/";
}
loginMail:bkh3030@gmail.com
과 같은 형태로 쿠키를 담아 보냄@GetMapping("/인가처리가 필요한 요청 URL")
public String auth(
@CookieValue(name = "loginMail", required = false) String loginMail,
Model model
){
if(loginMail == null) {
//로그인이 필요함
return "redirect:/login";
}
Member member = memberRespository.findByMail(loginMail);
model.addAttribute("member", member);
//로그인된 회원 정보를 가지고 뷰페이지로 보냄
return "포워딩시킬 뷰페이지";
}
Cookie cookie = new Cookie("loginMail", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
HttpSession
을 사용하여 로그인한 회원 정보는 서버에 저장한다.JSESSIONID
라는 쿠키 이름으로 유니크한 랜덤 값이 저장된다. if(member.getPassword().equals(form.getPassword())) {
log.info("로그인 성공!!");
HttpSession session = request.getSession(true);
session.setAttribuet("loginMember", member);
return "redirect:/";
}
@GetMapping("/인가처리가 필요한 요청 URL")
public String auth(
HttpServletRequest request,
Model model
){
//세션이 없을 시(로그인이 안됐을 때), 새로운 세션 만들지 않음
//이 과정은 로그인 인증처리를 하는 과정이 아니라
//로그인이 되어있는 지 확인하는 과정이기 떄문
HttpSession session = request.getSession(false);
if (session == null) {
//로그인이 필요함
return "redirect:/login";
}
Member loginMember = (Member)session.getAttribute("loginMember");
if(loginMember == null) {
//로그인이 필요함
return "redirect:/login";
}
model.addAttribute("member", loginMember);
//로그인된 회원 정보를 가지고 뷰페이지로 보냄
return "포워딩시킬 뷰페이지";
}
@SessionAttribute
로 받아와도 됨session.invalidate();
LastAccessedTime
속성의 시간 이후, 즉 사용자가 세션으로 접근한 마지막 시간으로 부터 얼마나 지났는지를 체크하고 세션을 삭제하는 것이 제일 적절김영한 선생님 - [스프링 MVC 2편 - 백엔드 웹 개발 활용 기술] (인프런 강의) 참조