✅ 쿠키의 장점

한번 서버가 저장을 하고 보내주면 url 달라도 쿠키가 적용될 수 있다.(항상 가져옴. 단 하위페이지에 부여한건 상위페이지에서 가져다 쓸 수 없다)

 

 

 

#️⃣ 서버에서 쿠키 꺼내쓰기

1. 맨땅으로 꺼내기 - 반복문으로 찾아야 한다

//MVC MenuController.java 
@RequestMapping("detail")
public String detail(Model model, HttpServletRequest request, @RequestParam String id) {
    Long mId = Long.parseLong(id);
    Menu menu = service.getById(mId);
    System.out.println(menu);
    model.addAttribute("menu", menu);

    //쿠키는 꺼낼때 덩어리로 꺼내서 찾아야한다는 단점이 있다
    Cookie[] cookies = request.getCookies();

    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("cookietest")) {
                System.out.println("Cookie Name: " + cookie.getName());
                System.out.println("Cookie Value: " + cookie.getValue());
                break;
            }
        }
    } else {
        System.out.println("No cookies found in the request.");
    }

    return "menu/detail";
}

 

  • 쿠키 안에 String외에 배열, 엔티티 등을 심을수있을까? 🚫
  • 전달방식 자체가 url 기반의 문자열 ⭕ 이므로 문자열만 가능하다
  • url 인코딩방식으로 쿠키를 심고 꺼내 쓸때도 디코딩을 해야한다. 만약 스프링 어노테이션인 @CookieValue를 쓴다면 디코딩도 자동으로 됨!
  • 쿠키는 루트페이지에서 전달해야 하위페이지도 적용됨

 

 

2. 스프링으로 꺼내기 (@CookieValue)

	@RequestMapping("detail")
	public String detail(@CookieValue String cookietest, Model model, @RequestParam Long id) {
    
    //HttpServletRequest request --어노테이션으로 뽑으면 서블릿을 불러올 필요가없음
	
    	System.out.println(cookietest);
		System.out.println("나와라");
		
		Menu menu = service.getById(id);
		model.addAttribute("menu", menu);

		//쿠키는 꺼낼때 덩어리로 꺼내서 찾아야한다는 단점이 있다
//		Cookie[] cookies = request.getCookies();
//		
//		if (cookies != null) {
//			for (Cookie cookie : cookies) {
//				if (cookie.getName().equals("cookietest")) {
//					System.out.println("Cookie Name: " + cookie.getName());
//					System.out.println("Cookie Value: " + cookie.getValue());
//					break;
//				}
//			}
//		} else {
//			System.out.println("No cookies found in the request.");
//		}

		return "menu/detail";
	}

 

👉 이때 파라미터 내 순서에서 @CookieValue가 마지막이라면, 출력순서도 마지막이 되어야한다. 다른 파라미터 출력값보다 쿠키출력이 먼저 나오면 콘솔에 찍히지않음! 파라미터를 한번에 받아서 처리한다고 생각했는데 파라미터도 순서대로 받아서 출력처리한다는걸 새삼깨달았다...

 

 

 

 

 

#️⃣ 쿠키 사용 제약 조건

 

1) 쿠키가 적용될 범위 적용 (세션은 불가)

 

Cookie cookie = new Cookie("cookietest", "octap");
if (request.getCookies() == null) // 쿠키가 하나라도 없을때 응답할때 쿠키를 부여한다
    response.addCookie(cookie);
cookie.setPath("/menu"); //쿠키가 지정될 경로(범위)를 지정할 수 있다
cookie.setMaxAge(1000000000); // 쿠키 생존시간 설정 (초단위이므로 계산해서 넣어야 함)

yamul에서 쿠키의 세션을 저장할 수 있다 (이때 설정키워드는 스프링부트 버전에 따라 다르며, 접미사를 붙이지 않으면 초단위임)

 

쿠키의 생존기간을 지정하지 않으면 세션과 동일하게 움직인다

 

 

 

2)  사용자 디스크에 저장된다

✔️ 쿠키는 기본적으로 현재 브라우저가 관리하는 프로세스 메모리에 저장된다.

👉 따라서 모든 브라우저를 다 닫아야 세션 키를 분실한다 (브라우저 하나를 닫는다고 해도 그 내부에 스레드가 수십개 움직이고있어서 프로세스가 죽는건 아니다)

 

✔️ 만약 쿠키의 저장기간을 1년이라고 하면 1년동안 컴퓨터를 끄지 않는이상 프로세스에 유지하기 힘드므로 이런경우는 디스크에 저장한다.

 

✔️ 쿠키는 클라이언트 디스크에 저장되므로 사용자에게 허용설정을 요청한다.

(* 어플리케이션은 모든 사용자를 위한 공간이라 덮어쓰기가 되므로 인증정보는 나만을 위한 공간인 세션이나 쿠키를 사용해야한다)

 

 

✅ 로그인 페이지 만들기

로그인에 들어가는경우 1) 로그인하려는 의도  2) 페이지를 보려고 했는데 로그인부터 하라고 요청받는 경우

 

@Controller
@RequestMapping("/member")
public class MemberController {

@GetMapping("index") //회원들이 들어가는 인덱스
public String login(HttpSession session) {

    //로그인페이지에서 담아주면 거기있는 세션을 가지고 검증
    Object username_= session.getAttribute("username");

    // 회원들 인덱스에 접속하려고 할 때- 너 인증은 하고 왔니? 안했으면 인증하고 와
    if (username_ ==null)
        return "redirect:/user/login";

    return "member/index"; 
}
<form accept="login" method="post"> //post method로 설정
    <fieldset>
        <legend class="d:none">인증정보</legend>
        <label class="d:none">아이디</label>
        <input type="text" name="username" placeholder="아이디"> //name으로 컨트롤러에 전송
        <label class="d:none">비밀번호</label>
        <input class="mt:3" name="password" type="password" placeholder="비밀번호">
    </fieldset>
    //제출버튼 생략
</form>
//UserController

@Controller
@RequestMapping("/user")
public class UserController {
	
    @GetMapping("login")
    public String login() {
            //여기는 데이터 필요없이 로그인 한다는 내용만있으므로 서비스가 필요없다
        return "user/login";
    }


    //유저네임과 패스워드를 파라미터로 입력받음 url은 login인 postMapping controller
    // 로그인을 처리하는 실질적인 코드
    @PostMapping("login")
    public String login(String username, String password) {
        // 로그인을 처리하는 실질적인 코드영역
        // 두가지 경로.
        // 1) 가다가 걸려서 왔으면 인증하고 거기로 다시 return
        // 2) 자발적으로 로그인 하러 왔으면 로그인 후 이동하는 위치 지정해주기

        if (service.inValid(username, password)) {
            session.setAttribute("username", username);
            // 포스트 요청으로 온 사람은 뷰페이지로 가면 안되고 무조건 리디렉션
            return "redirect: /user/index";
        }
        return "redirect:/user/login";
    }
}

 

 

✅ 스프링 시큐리티

: 스프링에서 제공하는 인증과 보안 관련 라이브러리

 

 

 

+ Recent posts