
쿠키는 클라이언트 측에서 확인이 가능, 세션은 서버에서 저장하기 때문에 확인 할 수 없음
참고로 Session은 JSESSIONID 같은 클라이언트마다 고유 ID를 부여하여 요청시 쿠키의 값을 확인하여 구분
HttpSession을 이용해 처리
내부적으로 Servlet Container에게 Session을 획득
- @Autowired를 통해 주입
- 요청 매핑 어노테이션 적용 메서드에 HttpSession 파라미터 추가
- 요청 매핑 어노테이션 적용 메서드에 HttpServletRequest 파라미터를 추가하고, 이를 이용해 HttpSession 구함
- @SessionAttribute, @ModelAttribute로 주입
메서드 주입
@PostMapping
public String form(CommandObject cmdObj, Errors errors, HttpServletRequest req) {
HttpSession session = req.getSession();
// session 사용
}
@SessionAttribute, @ModelAttribute로 주입받기
@Controller
@SessionAttribute("hello")
public class HelloController {
@PostMapping("/hello")
public String submit(Model model, @ModelAttribute("hello") Object obj) {
model.addAttribute("hello", obj.helloEvery());
return "test";
}
}
여기서는 클래스 단위에 넣었지만, 나는 메서드 단위에 넣어서 사용하는 것을 선호
@CookieValue 어노테이션을 이용해서 이용 매핑 어노테이션 적용 메서드에 Cookie 타입 파라미터에 적용하여 사용
@GetMaaping
public String form(
LoginCommand loginCommand,
@CookieValue(value = "cookie_name", required = false) Cookie rCookie
) {
//Cookie 값 얻기, 설정
String cValue = rCookie.getValue();
rCookie.setValue("New Value");
rCookie.setPath("/");
rCookie.setMaxAge(60 * 60 * 24 * 30);
rCookie.setSecure(true);
rCookie.setHttpOnly(true);
boolean cookieisHttpOnly = rCookie.isHttpOnly();
}
Session은 Request를 받아 서버에 저장, Cookie는 클라이언트로 Response해 줘야 함
HttpServletResponse를 통해 설정 가능
@GetMaaping
public String form( LoginCommand loginCommand, HttpServletResponse res) {
Cookie myCookie = new Cookie("cookie_name", "value");
//Cookie 값 얻기, 설정
//설정 생략
res.addCookie(myCookie);
}

인증 인가는 모든 API에서 항사 먼저 거치도록 구현, 그렇다고 모든 Controller에서 각각 구현하게되면 중복 코드가 많아지고 수정 필요시 작업 번거로움
request가 controller에 도착하기 전에 로직을 수행하도록 Filter를 이용,
Filter
DispatcherServlet에 도달하기 전에 가로챈다.@ExceptionHandler를 이용한 에러 핸들링을 할 수 없다.HandlerInterceptor
DispatcherServlet를 지나 Controller에 도달하기 전에 가로챈다.@ExceptionHandler를 이용한 에러 핸들링이 가능하다.HandlerInterceptor는 앞서 말한 것처럼 Spring Context 내에 존재하며, DispatcherServlet과 Controller 사이에서 request를 가로챌 수 있다.
HandlerInterceptor (Filter도 비슷)