@Component
@RequestScope // 빼먹지 않게 조심!
@RequiredArgsConstructor
public class Rq {
private final HttpServletRequest req;
private final HttpServletResponse resp;
모든 쿠키에 “yes” 라는 이름을 붙이고 값을 Username 으로 설정해놓았다.
쿠키를 확인할 때 먼저 쿠키의 Name 으로 알맞는 쿠키가 맞는지 확인하고,
내가 찾는 쿠키가 맞다면 쿠키 value 의 username 을 통해 어떤 회원이 요청했는지 확인할 수 있다.
//-- 쿠키 생성 --//
public void createCookie(String username) {
resp.addCookie(new Cookie("yes", username));
}
//-- 쿠키 확인 --//
public String findCookie() {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
if (name.equals("yes")) {
return value;
}
}
}
return "";
}
//-- 쿠키 삭제 --//
public void deleteCookie() {
Cookie cookie = new Cookie("yes", null);
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
Controller
@RequiredArgsConstructor
public class MemberController {
//-- business logic DI --//
private final MemberService service;
//-- cookie logic DI --//
private final Rq rq;
//-- 로그인 하기 --//
// http://localhost:8080/member/login?username=홍길동&password=1234
@GetMapping("/member/login")
@ResponseBody
public MemberDto showLogin(
@RequestParam String username,
@RequestParam int password,
) {
MemberDto result = service.login(username, password);
service.createCookie(username);
return result;
}
//-- 쿠키로 로그인 정보 확인하기 --//
// http://localhost:8080/member/me
@GetMapping("/member/me")
@ResponseBody
public MemberDto showMe(HttpServletRequest req) {
String value = service.findCookie(req);
if (value.equals("null"))
return new MemberDto("F-1", "로그인후 이용해 주세요.");
return new MemberDto("S-1", "당신의 username(은)는 " + value +" 입니다.");
}
//-- 쿠키 삭제 하기 --//
// http://localhost:8080/member/logout
@GetMapping("/member/logout")
@ResponseBody
public MemberDto logout(HttpServletResponse resp) {
service.deleteCookie(resp);
return new MemberDto("S-1", "로그아웃 되었습니다.");
}
Cookie 의 value 값을 사용해 간단하게 클라이언트를 식별했지만
Cookie 는 보안에 매우 취약한 구조이다.
문제를 해결하기 위해서 실무에서는 Session 을 사용해 클라이언트를 식별하고 있다.