쿠키란 ?
쿠키는 편리와 안전을 위해 웹서버에서 클라이언트(브라우저)를 거쳐 사용자의 장치에 설치되는 기록 정보입니다. 현재 쿠키는 웹사이트 접속시 로그인 정보나 사이트의 환경 설정, 항목 즐겨찾기, 최근 기록 등을 저장하는 등 다양하게 사용되고 있습니다.
사용자가 로그인 했던 ID를 저장해서 사용자가 로그인 할 때마다 번거롭게 ID를 입력하지 않게 하기 위해 쿠키를 사용하는 용도면 괜찮지만 쿠키로 자동 로그인을 구현하면 해킹당할 위험이 커집니다.
세션과 달리 쿠키는 서버측이 아니라 클라이언트에 데이터가 저장되기 때문에 PC에 개인 정보들이 흔적으로 남기 때문입니다.
대신, 서버측에서 데이터를 저장하는 세션과 달리 쿠키는 클라이언트측에서 데이터를 저장하므로 서버의 부담을 줄일 수 있습니다.
그리고 브라우저가 종료되어도 만료기간까지 재사용할 수 있다는 장점이 있습니다.
LoginController에서 쿠키 구현
@PostMapping
public String submit(
LoginCommand loginCommand, HttpServletResponse response) {
Cookie rCookie = new Cookie("cEmail", loginCommand.getEmail());
rCookie.setPath("/");
if (loginCommand.isRememberEmail()) {
rCookie.setMaxAge(60 * 60 * 24 * 15);
} else {
rCookie.setMaxAge(0);
}
response.addCookie(reCookie);
return "login/loginSuccess";
}
* 값 검증, ID PWD 일치 검사, 로그인 유지, 예외처리 등은 코드가 복잡해져서 생략하고 쿠키만 다루겠습니다.
로그인 폼을 제출하는 요청 매핑 메서드입니다. 로그인을 시도할 때 쿠키를 생성하고 쿠키의 key(속성)는 'cEmail'로 했고 value(값)은 커맨드 객체에서 꺼낸 사용자가 입력하고 제출한 이메일로 했습니다.
쿠키의 setPath("/")로 모든 경로에서 접근 가능하도록 설정했습니다.
커맨드 객체에 있는 불리안 값(ID 저장 기능 사용 의사 여부. 주로 체크박스값)이 true면 생성한 쿠키의 15일을 만료기간으로 설정합니다. false라면 생성한 쿠키의 만료기간을 0으로 해서 바로 폐기합니다.
@GetMapping
public String form(LoginCommand loginCommand,
@CookieValue(value = "cEmail", required = false) Cookie rCookie) {
if (rCookie != null) {
loginCommand.setEmail(rCookie.getValue());
loginCommand.setRememberEmail(true);
}
return "login/loginForm";
}
LoginController의 로그인창으로의 요청 매핑 메서드입니다. 쿠키를 꺼내기 위해 @CookieValue 애노테이션을 적용한 Cookie 타입 파라미터를 생성합니다.
애노테이션의 value 속성을 쿠키에서 꺼낼 데이터의 key(속성)로 설정합니다.
required는 true면 쿠키가 존재하지 않을 때 익셉션을 발생시킵니다. 사용자가 ID 저장 기능을 거부했으면 해당 쿠키가 없고, 처음 로그인하는 경우에도 쿠키가 없을테니 false로 설정합니다.
쿠키가 존재한다면 쿠키에서 아까 입력한 key(cEmail)의 value값(사용자가 전에 로그인 시도했던 이메일)을 받아와서 커맨드 객체에 세터를 이용해서 넣어줍니다.
그러면 폼에 쿠키에 있던 Email값이 출력되어서 사용자가 또 입력할 수고를 덜어줄 것입니다.
예제에서 loginCommand.setRememberEmail(true)는 쿠키를 이용한 ID 저장 기능을 사용했던 사람은 기본값을 사용하는 것으로 설정합니다.
'Server > Spring' 카테고리의 다른 글
Spring - 프로필 (Profile) (0) | 2021.01.29 |
---|---|
Spring - 서버에서 객체를 JSON으로 변환 후 응답하기 (+ API 서버 만들기) (0) | 2021.01.28 |
Spring - 컨트롤러(Controller) 구현 (0) | 2021.01.01 |
Spring - 리다이렉트(redirect) (0) | 2020.10.07 |
Spring - 스프링 MVC 프레임워크 동작 방식 (0) | 2020.10.06 |