참새의 이야기
[MVC2] 로그인 처리 - Cookie, Session 본문
쿠키
서버는 로그인 상태를 유지하기 위해 HTTP 응답에 쿠키를 만들어서 담고 브라우저에 전달한다.
사용자는 쿠키가 만료될 때까지 이를 이용해 로그인 상태를 유지할 수 있다.
로그아웃을 할 때는 쿠키의 만료 날짜를 0으로 설정하여 expire할 수 있다.
쿠키의 보안 문제
위의 내용만 보면 간단하게 활용할 수 있는 쿠키가 로그인 처리를 하기에 결함이 없어 보이지만 쿠키에는 보안 문제가 있다.
쿠키 값은 클라이언트가 크롬에서 제공하는 개발자 모드와 같은 도구를 사용하면 마음대로 바꿀 수 있다.
쿠키의 값을 적절하게 바꾸면 다른 사용자의 정보를 볼 수 있다.
나의 개인 정보를 다른 사람이 몰래 볼 수 있는 것이다.
그렇기 때문에 쿠키에는 중요한 정보를 노출하면 안 되며, 예측할 수 없는 값이 들어가야 한다.
즉, 중요한 정보는 모두 서버에서 보관하면서 로그인 상태를 유지할 수 있어야 한다.
세션
쿠키의 보안 문제를 해결하기 위해 세션을 활용할 수 있다.
쿠키의 사용을 제거하는 것이 아니라 세션과 함께 보안의 취약성을 극복한다.
원리는 간단하다.
기존 쿠키의 값은 의미가 있는 값이었다면 이제는 의미가 없는 값으로 사용자를 식별하는 역할만 한다.
식별을 위해 세션을 이용한다.
서블릿이 제공하는 HttpSession을 사용한다면 Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05
와 같은 형태로 주고받는다.
JSESSIONID라는 이름의 쿠키를 가지고 그 값으로는 추정 불가능한 랜덤 값이 사용된다.
이 값으로 서버는 특정 사용자와 매칭할 수 있다.
이렇게 하면 서버만이 쿠키를 해석하여 유의미한 일을 할 수 있다.
@SessionAttribute
서블릿이 제공하는 HttpSession은 아래와 같은 과정으로 세션을 찾고, 그 데이터를 찾는 과정을 거쳐야 한다.
@GetMapping("/")
public String homeLoginV3(HttpServletRequest request, Model model) {
//세션이 없으면 home
HttpSession session = request.getSession(false);
if (session == null) {
return "home";
}
Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
//세션에 회원 데이터가 없으면 home
if (loginMember == null) {
return "home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}
이런 번거로움을 제거하기 위해 스프링이 제공하는 @SessionAttribute를 사용할 수 있다.
@GetMapping("/")
public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember,Model model) {
//세션에 회원 데이터가 없으면 home
if (loginMember == null) {
return "home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}
복잡한 과정은 스프링이 알아서 처리해 주기 때문에 코드가 훨씬 깔끔해진다.
reference
이 글은 김영한님의 '스프링 MVC 2편'을 듣고 작성했습니다.
'Spring' 카테고리의 다른 글
[MVC2] ArgumentResolver (0) | 2023.08.10 |
---|---|
[MVC2] 로그인 처리 - Filter, Interceptor (0) | 2023.08.10 |
[MVC2] Bean Validation (0) | 2023.08.08 |
[MVC2] Validation (2) | 2023.08.08 |
[MVC2] 메시지와 국제화 (0) | 2023.08.06 |