콘텐츠로 이동

2022 04 30

2022-04-30

@SessionAttribute

  • 참고: https://sun-22.tistory.com/53
  • Session

    • Session은 여러 화면이나 여러 요청에서 사용해야하는 객체를 공유할 때 사용 가능 1. HttpSession을 사용하여 Session 추가
      @Controller
      public class SampleController {
          @GetMapping("/events/form")
          public String getEvent(Model model, HttpSession httpSession) {
              Event event = new Event();
              event.setLimit(50);
              event.setName("event1");
              model.addAttribute("event", event);
              httpSession.setAttribute("event", event);
      
              return "/events/form";
          }
      }
      
    1. @SessionAttributes를 통해 추상화
      • 해당 컨트롤러 내에서 동작하며,
      • 해당 컨트롤러 안에서 다루는 특정 모델 객체를 세션에 넣고 공유할 때 사용
        @Controller
        @SeesionAttributes("event")
        public class SampleController {
            @GetMapping("/events/form")
            public String getEvent(Model model) {
                Event event = new Event();
                event.setLimit(50);
                event.setName("event1");
                model.addAttribute("event", event); //Model 추가시 자동으로 할당
        
                return "/events/form";
            }
        }
        
  • SessionAttribute

    • 컨트롤러 밖 (인터셉터/필터 등)에서 만들어 준 세션 데이터에 접근할 때 사용 1. HttpSession을 사용해 세션값 받아오기
      @GetMapping
      public String sessionTest(HttpSession httpSession) {
          LocalDateTime visitTime = (LocalDateTime) httpSession.getAttribute("visitTime");
          return visitTime.toString();
      }
      
    1. @SessionAttribute 사용
      @GetMapping
      public String sessionTest(@SessionAttribute("visitTime") LocalDateTime visitTime) {
          return visitTime.toString();
      }
      

SameSite Cors 개삽질

  • 참고 : https://yousrain.tistory.com/23
  • 개요
    • 구글의 Cookie 정책이 바뀌면서 SameSite=Lax로 변경
    • "this set-cookie didn't specify a samesite attribute and was default to samesite=lax and was blocked..."
  • SameSite
    • samesite: 쿠키의 설정, 대부분의 브라우저가 lax
      • lax : cross-site끼리의 통신은 특별한 경우 제외하고 쿠키 관리 X
  • 해결 방법
    • samesite 자체를 none으로 변경
    • http 요청을 https로 필히 전환할 것!
    • Filter에서 모든 Cookie에 대한 설정을 넣어주는 방식!
      @Component
      public class CookieAttributeFilter implements Filter {
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              HttpServletResponse httpServletResponse = (HttpServletResponse) response;
              chain.doFilter(request, response);
              addSameSite(httpServletResponse , "None");
          }
      
          private void addSameSite(HttpServletResponse response, String sameSite) {
              Collection<String> headers = response.getHeaders(HttpHeaders.SET_COOKIE);
              boolean firstHeader = true;
              for (String header : headers) { // there can be multiple Set-Cookie attributes
                  if (firstHeader) {
                      response.setHeader(HttpHeaders.SET_COOKIE, String.format("%s; Secure; %s", header, "SameSite=" + sameSite));
                      firstHeader = false;
                      continue;
                  }
                  response.addHeader(HttpHeaders.SET_COOKIE, String.format("%s; Secure; %s", header, "SameSite=" + sameSite));
              }
          }
      }