주로 HttpServletResponse 에 addCookie 를 사용해 클라이언트에게 리턴하는 방식을 사용함
쿠키를 사용한 로그인
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
...
@GetMapping("/home")
public String home(@CookieValue(name = "userId", required = false) Long userId, Model model) {
if (userId == null) return "home";
UserDto userDto = userService.cookieLogin(userId);
if (userDto == null) return "home";
model.addAttribute(userDto);
return "home";
}
}
@CookieValue
을 사용해 유저에게 저장되어 있는 쿠키를 가져옴required = false
을 통해 로그인하지 않은 유저도 허용함쿠키를 사용한 로그아웃
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
...
@PostMapping("/logout")
public String cookieLogout(HttpServletResponse response) {
Cookie cookie = new Cookie("userId", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
return "redirect:/";
}
}
💡 이러한 대안으로 사용되는 방법이 쿠키 + 세션 임!
HttpSession 사용
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
...
@PostMapping("/login")
public String sessionLogin(@Validated @ModelAttribute LoginForm form,
HttpServletRequest request) {
if (bindingResult.hasErrors()) {
return "login/loginForm";
}
UserDto loginUser = userService.login(form.getLoginId(), form.getPassword());
if (loginUser == null) return "login/loginForm";
// 로그인 성공 처리를 위한 HttpSession
HttpSession session = request.getSession();
session.setAttribute("loginUser", loginUser);
return "redirect:/";
}
}
@SessionAttribute 사용
@Controller
@RequiredArgsConstructor
public class UserController {
...
@GetMapping("/")
public String home(@SessionAttribute(name = "loginUser", required = false) UserDto loginUser, Model model) {
if (loginUser == null) {
return "home";
}
model.addAttribute("user", loginUser);
return "loginHome";
}
}
@SessionAttribute
어노테이션을 사용해 세션 정보를 가져올 수 있음@SessionAttribute
은 형 변환 필요없음💡 여기서 더 나아가면 JWT 토큰의 개념이 나옴
Header
, Payload
, Signature
로 구성됨JWT
가 들어감{
"typ": "JWT",
"alg": "HS256"
}
이러한 헤더를 사용한다면 헤더엔eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
이런 문자열이 들어가게 됨등록 클레임
, 공개 클레임
, 비공개 클레임
으로 나뉨이렇게 생성된 JWT 를
{
"Authorization": "Bearer 생성된 JWT"
}
이런 식으로 리턴함
JWT의 가장 큰 단점이 토큰을 탈취당한다면 대처가 어려움
임
이러한 단점을 극복하기 위해 AccessToken
과 RefreshToken
임