스프링 2-23

서현우·2022년 7월 3일
0

스프링의정석

목록 보기
65/85

ch2-23 - 로그인 유효성검사, 쿠키

  • LoginController.java - 로그인 id, pwd 유효성 검사, 쿠키 적용
  • loginForm.jsp - id input태그와 checkbox에 쿠키 적용

LoginController.java

@GetMapping으로 로그인 페이지를 불러오고
@PostMapping으로 id, pwd의 유효성 검사를 해서 통과하면 홈으로, 통과 못하면 다시 로그인 페이지로 리다이렉트한다.

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.net.URLEncoder;

@Controller
@RequestMapping("/login")
public class LoginController {
    @GetMapping("/login")
    public String loginForm() {
        return "loginForm";
    }

    @PostMapping("/login")
    public String login(String id, String pwd, String rememberId) throws Exception {
        //1. id와 pwd를 확인
        //일치하지 않으면, loginForm으로 이동
        if(!loginCheck(id, pwd)) {
            String msg = URLEncoder.encode("id또는 pwd가 일치하지 않습니다.", "utf-8");
            return "redirect:/login/login?msg="+msg;
        }

        //2. id와 pwd가 일치하면, 홈으로 이동
        return "redirect:/";
    }

    private boolean loginCheck(String id, String pwd) {
        return "asdf".equals(id) && "1234".equals(pwd);
    }
}

쿠키란?

이름과 값의 쌍으로 구성된 작은 정보로 쿠키란 클라이언트 식별기술이다.
아스키 문자만 가능하므로 한글은 URL인코딩 필요.
서버에서 생성 후 전송하고, 브라우저에 저장된다.
유효기간 이후 자동 삭제된다.
여러개의 쿠키 중에서, 서버에 요청시 domain, path가 일치하는 경우에만 자동 전송된다.

요청이 들어오면, 서버에서 쿠키를 생성해서 응답메세지로 브라우저에 전송하고, 그 다음부터 요청을 서버에 보낼 때 마다 자동으로 쿠키를 같이 전송한다. 이 쿠키를 통해 서버는 어떤 브라우저인지 파악 할 수 있다.
이는 브라우저라는 회원이, 서버라는 도서관에서, 처음 갔을 때 회원증을 발급받고, 그 다음부터 도서관에 갈 때마다 회원증을 보여주는 것과 같다.

쿠키의 생성

Cookie cookie = new Cookie("id", "asdf"); //쿠키 생성
cookie.setMaxAge(60*60*24); //유효기간 설정(초)
response.addCookie(cookie); //응답에 쿠키 추가

쿠키의 삭제

Cookie cookie = new Cookie("id", ""); //변경할 쿠키와 같은 이름의 쿠키 생성
cookie.setMaxAge(0); //유효기간을 0으로 설정(삭제)
response.addCookie(cookie) //응답에 쿠키 추가

쿠키의 변경

Cookie cookie = new Cookie("id", ""); //변경할 쿠키와 같은 이름의 쿠키 생성
cookie.setValue(); //값의 변경
cookie.setDomain(); //도메인 변경
cookie.setPath(); //경로 변경
cookie.setMaxAge(); //유효기간 변경
response.addCookie(cookie); //응답에 쿠키 추가

쿠키 읽어 오기

Cookie[] cookies = request.getCookies(); //쿠키 읽기

for(Cookie cookie : cookies) {
	String name = cookie.getName();
	String value = cookie.getValue();
}

LoginController.java

  1. id와 pwd가 일치하고, 아이디 기억에 체크되어 있으면 쿠키를 생성하고 응답에 저장한다.
  2. 쿠기가 없으면 쿠키를 삭제하고, 응답에 저장한다.
    (checkbox는 String타입일 때 on, null이고, boolean타입일 때 true, false를 반환한다.
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId, HttpServletResponse response) throws Exception {
	System.out.println("id="+id);
	System.out.println("pwd="+pwd);
	System.out.println("rememberId="+rememberId);
	//1. id와 pwd를 확인
	//일치하지 않으면, loginForm으로 이동
	if(!loginCheck(id, pwd)) {
		String msg = URLEncoder.encode("id또는 pwd가 일치하지 않습니다.", "utf-8");
		return "redirect:/login/login?msg="+msg;
	}

	//2. id와 pwd가 일치하면, rememberId를 확인
	if(rememberId) {
		//2-1 쿠키를 생성
		Cookie cookie = new Cookie("id", id);
		//2-2 응답에 저장
		response.addCookie(cookie);
	} else {
		//2-1 쿠키를 삭제
		Cookie cookie = new Cookie("id",id);
		cookie.setMaxAge(0); //쿠키를 삭제
		response.addCookie(cookie);
	}
	//2-3 홈으로 이동
	return "redirect:/";
}

loginForm.jsp

cookie에 저장된 id가 있으면 EL로 id의 value를 보여주고,
remeberId는 cookie에 저장된 id가 있으면 EL로 태그에 checked를 넣는다.

<input type="text" name="id" value = "${cookie.id.value}" placeholder="이메일 입력" autofocus>
<label><input type="checkbox" name="rememberId" ${empty cookie.id.value ? "" : "checked"}> 아이디 기억</label> |
profile
안녕하세요!!

0개의 댓글