티스토리 뷰

study/Spring

chap 13 - Cookie

xoxowo 2023. 2. 23. 17:16

초보 웹 개발자를 위한 스프링 5 프로그램 입문을 보고 복습 겸 개인 학습 정리입니다. (windows 기준)

 

움짤 출처 - https://blog.naver.com/chloeagit/222837602249

 

 

🍪 컨트롤러에서 쿠키 사용하기

사용자 편의를 위해 아이디를 기억해 두었다 다음 로그인할 때 아이디를 자동으로 넣어주는 이런 기능을 구현할 때 쿠키를 사용한다. 이번에는 이전 예제에 이어서 쿠키를 이용해서 로그인 시 이메일 기억하기 기능을 추가했다.

 

이메일 기억하는 기능을 구현하는 방식

- 로그인 폼에 '이메일 기억하기' 옵션 추가

- 로그인 시 '이메일 기억하기' 옵션을 선택했으면 로그인 성공 후 쿠키에 이메일 저장

(이때 쿠키는 웹 브라우저를 닫더라도 삭제되지 않도록 유효시간을 길게 설정한다)

- 이후 로그인 폼을 보여줄 때 이메일을 저장한 쿠키가 존재하면 입력 폼에 이메일을 보여준다

 

1. loginForm.jsp 이메일 기억하기 선택 옵션 추가 (접은 글로 대체)

로그인 시 이메일 기억하기를 선택할 수 있도록 체크박스를 추가한다.

 

→ sp5-chap13/src/main/WEB-INF/view/login/loginForm.java

더보기
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
    <title><spring:message code="login.title" /></title>
</head>
<body>
    <form:form modelAttribute="loginCommand">
    <form:errors />
    <p>
        <label><spring:message code="email" />:<br>
        <form:input path="email" />
        <form:errors path="email"/>
        </label>
    </p>
    <p>
        <label><spring:message code="password" />:<br>
        <form:password path="password" />
        <form:errors path="password"/>
        </label>
    </p>
    <p>  ??추가된 부분??
    	<label><spring:message code="rememberEmail" />:
    	<form:checkbox path="rememberEmail"/>
    	</label>
    </p>
    <input type="submit" value="<spring:message code="login.btn" />">
    </form:form>
</body>
</html>

 

2. label.properties 메세지 추가  (접은 글로 대체)

 

→ sp5-chap13/src/main/resources/message/label.properties

더보기

login.title=로그인
login.btn=로그인하기
idPasswordNotMatching=아이디와 비밀번호가 일치하지 않습니다.
login.done=로그인에 성공했습니다.
rememberEmail=이메일 기억하기 << 추가

 

 

3. LoginController의 form() 메서드 수정

이메일 정보를 기억하는 쿠키가 존재할 경우 이 쿠키 값을 이용해서 LoginCommand 객체의 email 프로퍼티를 쿠키 값으로 설정한다.

 

스프링 MVC에서 🍪쿠키를 사용하는 방법 중 하나는 @CookieValue 애노테이션을 사용하는 것. 

@CookieValue 애노테이션은 요청 매핑 애노테이션 적용 매서드의 Cookie타입 파라미터에 적용한다.

따라서 쉽게 쿠키를 Cookie 파라미터로 전달받을 수 있다. 

 

 @CookieValue 애노테이션의 value 속성은 쿠키이름을 지정한다.
아래 코드에선 코드 이름이 REMEMBER인 쿠키를 Cookie타입으로 전달받는다. 지정한 이름을 가진 쿠키가 존재하지 않을 수도 있다면 required을 false로 지정한다.

이메일 기억하기를 선택하지 않을 수도 있어 required 속성 값을 false로 지정했다. (required 기본 값은 true)

 

REMEMBER 쿠키가 존재하면 쿠키 값을 읽어와 커맨드 객체에 email 프로퍼티 값을 설정한다. 이 커맨드 객체를 사용해 폼을 출력하므로 REMEMBER 쿠키가 존재하면 입력 폼의 email 프로퍼티에 쿠키값이 채워져서 출력된다.

 

→ sp5-chap13/src/main/java/controller/LoginController.java

package controller;

..import 생략..

@Controller
@RequestMapping("/login")
public class LoginController {
    private AuthService authService;

    public void setAuthService(AuthService authService) {
        this.authService = authService;
    }

    @GetMapping
    public String form(LoginCommand loginCommand, 
    		// value 속성은 쿠키이름을 지정한다.
               // 코드이름이 REMEMBER인 쿠키를 Cookie타입으로 전달받는다.
               // 지정한 이름을 가진 쿠키가 존재하지 않을 수도 있으면 required을 false로 지정
    		@CookieValue(value = "REMEMBER", required = false) Cookie rCookie) {
    	if (rCookie != null) {
    		loginCommand.setEmail(rCookie.getValue());
    		loginCommand.setRememberEmail(true);
    	}
    	return "login/loginForm";
    }

 

 

4. LoginController의 submit() 메서드 수정

이메일 기억하기 옵션을 선택한 경우 로그인 성공 후에 이메일을 담고 있는 쿠키 생성하기

쿠키를 생성하기 위해 HttpServletResponse 타입 파라미터 추가하고 쿠키를 생성하거나 삭제하는 코드를 추가한다.

setMaxAge()로 쿠키가 유지되는 시간을 지정할 수 있다. 아래 코드에서는 30일간 유지되는 쿠키로 설정했다.

 

→ sp5-chap13/src/main/java/controller/LoginController.java

package controller;

..import 생략..

@Controller
@RequestMapping("/login")
public class LoginController {
    private AuthService authService;

    public void setAuthService(AuthService authService) {
        this.authService = authService;
    } 

 @PostMapping
    public String submit(LoginCommand loginCommand, Errors errors, HttpSession session,
    		HttpServletResponse response) { // 쿠키를 생성하기 위해 HttpServletResponse타입 파라미터 추가
        new LoginCommandValidator().validate(loginCommand, errors);
        if (errors.hasErrors()) {
            return "login/loginForm";
        }
        try {
            AuthInfo authInfo = authService.authenticate(
                    loginCommand.getEmail(),
                    loginCommand.getPassword());
            
            session.setAttribute("authInfo", authInfo);
            // 쿠키 
            Cookie rememberCookie = 
            		new Cookie("REMEMBER",loginCommand.getEmail());
            rememberCookie.setPath("/");
            if (loginCommand.isRememberEmail()) {
            	rememberCookie.setMaxAge(60 * 60 * 24 * 30);
            } else {
            	rememberCookie.setMaxAge(0);
            }
            response.addCookie(rememberCookie);

            return "login/loginSuccess";
        } catch (WrongIdPasswordException e) {
            errors.reject("idPasswordNotMatching");
            return "login/loginForm";
        }
    }

 

 

5. 서버 실행 후 "localhost:8090/sp6-chap13/main" 접속 후 로그인 

[Run As] → [Run on Server] → [톰캣😺 서버 실행] → [브라우저에 "localhost:8090/sp6-chap13/main" 접속]

 

이메일 기억하기 체크 후 로그인한 뒤 재 로그인 시 잘 저장되어있는지 확인한다.

 

 

 

 

 

'study > Spring' 카테고리의 다른 글

웹 페이지 만들기 - 1 (복습)  (0) 2023.03.28
chap 14 - @PathVariable, 익셉션 처리  (0) 2023.02.27
chap 13 - HandlerInterceptor  (0) 2023.02.23
chap 13 - HttpSession  (0) 2023.02.21
스프링 프로젝트 생성하기 (start.spring.io)  (0) 2023.02.16
댓글