✅ 쿠키의 장점
한번 서버가 저장을 하고 보내주면 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";
}
}
✅ 스프링 시큐리티
: 스프링에서 제공하는 인증과 보안 관련 라이브러리
'😵 ~23.11.10' 카테고리의 다른 글
1019 | 로그인시 오류문구, returnURL (0) | 2023.10.19 |
---|---|
1018 | NodeJs 배경 / AngularJs (0) | 2023.10.18 |
1017 | 인증과 권한 개념, 세션과 쿠키 (0) | 2023.10.17 |
1017 | rest와 restful , api url짜기 (1) | 2023.10.17 |
1016 | Promise 사용해보기, promise.then, fetch() api, 기존 XMLHttpRequest를 FETCH 방식으로 (0) | 2023.10.16 |