Paper.Yellow

쿠키 본문

데이터베이스

쿠키

Paper.Y 2022. 9. 16. 10:21

쿠키

브라우저가 요청할 때 서버에 리퀘스트 공간을 배정받는다. 응답 시 공간을 비워준다. 
서버가 종료되면 세션의 내용도 소멸하기 때문에 영구 저장을 위해 하드디스크=DB에 저장한다. 

쿠키 자체는 자바스크립트 코드로 접근 불가 

ㅁ로그인 아이디 기억하기 
로그인할때 id/password를 post로 서버에 전달(body에 담음)
-> DB에 검증 -> session에 저장 
-> 
응답 
header: 
body: code=1, massege="성공", data=null(돌려줄 데이터가 없다.) 
응답 body 값을 자바스크립트로 저장을 할 수 없기 때문에 header에 담아서 쿠키에 저장한다. (set-cookie / 데이터 값을 담는다.)
왜 body에 담지 않고 header에 담는걸까?? 
-브라우저가 응답을 받을때 header에 set-cookie 키값이 있으면 쿠키에 자동저장한다. 

http only라는 정책이 있다. 브라우저로만 쿠키에 접근이 가능한 프로토콜.

 

테스트용 페이지

<!DOCTYPE html>
<html lang="en">

<head>
    <title>Bootstrap Example</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js"></script>
</head>

<body>

    <div class="container mt-3">
        <h2>Stacked form</h2>
        <form action="http://localhost:8000" method="get">
            <div class="form-check mb-3">
                <label class="form-check-label">
                    <input class="form-check-input" type="checkbox" name="remember"> Remember me
                </label>
            </div>
            <button type="submit" class="btn btn-primary">Submit</button>
        </form>
    </div>

</body>

</html>

 

검증방식 - 쿼리스트링 

 

체크박스 선택

주소:8000?remamver=
remember.equals("") 공백 확인

 

체크박스 공백

주소:8000?
rememver == null

 

 


테스트 해서 값을 알아보기 위해서 user.js 파일에 테스트 코드 추가

 

function loginTest(){
	let remember = $("#remember").val();
	console.log(remember);
}
$("#btnLogin").click(() => {
	//login();
	loginTest();
});

 

코드를 추가할땐 사용법을 익히고 -> 검증까지 완료해야 한다.

 

 

 

동일한 답이 나와서 뒤에 val(value)가 잘못 된거 같아서 코드를 수정

function loginTest(){
	let remember = $("#remember").prop("checked");
	console.log(remember);
}

boolean으로 변경 됨.

 

이 과정에 오타 나서 한참 헤맸다... checkde.....

 

응답 값을 헤더의 쿠키에 담기 위해 코드를 수정 

 

DTO에 remember 추가 

 

 

 

테스트문 출력

정상적으로 true가 출력되는 것을 확인할 수 있다. 

 

 

브라우저에서도 정상적으로 작동하는지 확인을 위해 코드 수정

UsersController 추가

		if(loginDto.isRemember()) {
			response.setHeader("Set-Cookie", "username="+loginDto.getUsername());
		}

users.js 로그인 시 메인 화면 이동을 막음

 

페이지 이동시에는 Set-Cookie 확인 안 됨.

 

키값 : Set-Cookie / username : cos 가 정상적으로 담긴 것이 확인된다. 

 

임의로 키값을 넣어보았다.
DevTools 확인

키값과 담기는 값을 모두 임의로 넣을 수 있다. 

하지만 Set-Cookie는 프로토콜이니 꼭 지켜주자. 

 

 

"쿠키의 username을 저장하고 싶은게 목적 "
바로 저장하지 않고 왜 username / password / remember 값을 전달할까? 

브라우저가 스스로 쿠키 값을 저장할 방법이 없어서 서버가 브라우저가 쿠키에 값을 저장하고 싶단걸 알면 set-cookie로 저장을 허용해준다. 

@PostMapping("/login")
	public @ResponseBody CMRespDto<?> login(@RequestBody LoginDto loginDto, HttpServletResponse response) {
		System.out.println("======================");
		System.out.println(loginDto.isRemember());
		System.out.println("======================");
		
		if(loginDto.isRemember()) {
			Cookie cookie = new Cookie("username", loginDto.getUsername());
			cookie.setMaxAge(60*60*24);
			response.addCookie(cookie);
			//response.setHeader("Set-Cookie", "username="+loginDto.getUsername());
		}else {
			Cookie cookie = new Cookie("username", null);
			cookie.setMaxAge(0);
			response.addCookie(cookie);
		}
		
		Users principal = usersService.로그인(loginDto);
		
		if(principal == null) {
			return new CMRespDto<> (-1,"로그인실패", null);
		}
		
		session.setAttribute("principal", principal);
		return new CMRespDto<> (1,"로그인성공", null);
	}

 

@GetMapping("/loginForm")
	public String loginForm(Model model, HttpServletRequest request) {// 쿠키 배워보기
		Cookie[] cookies = request.getCookies();	
		for(Cookie cookie : cookies) {
			if(cookie.getName().equals("username")) {
				model.addAttribute(cookie.getName(), cookie.getValue());
			}
			System.out.println("=====================");
			System.out.println(cookie.getName());
			System.out.println(cookie.getValue());
			System.out.println("=====================");
		}
		return "users/loginForm";
	}

 

 

최종적으로 최초 로그인 후 다시 로그인 시도시에 username이 남아있는것을 볼 수 있다. 

 

'데이터베이스' 카테고리의 다른 글

MySQL 시간 입력하기  (0) 2022.12.06
5.JAVA(이클립스)로 DB(오라클)연결하기  (0) 2022.08.16
2. 데이터베이스 개요  (0) 2022.08.11
1. 데이터베이스  (0) 2022.08.09