스프링 347

55. 필터 구현

간단하게 요청에 대한 로그를 남기는 필터를 구현해 봤다. @Slf4j public class LogFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("log filter init"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; Htt..

54. 필터, 인터셉터

필터는 서블릿이 제공 인터셉터는 스프링이 제공 예를 들자면 회원정보수정이나 이런 것들은 로그인 한 사용자만 들어올 수 있도록 해야 한다. 근데 지금은 링크태그를 안달아놔서 그렇지, 그냥 url에 치면 들어올 수 있다. 말 그대로 필터이다. 특정 조건을 만족하는 사용자만이 특정 url에 접근할 수 있도록 하는 것이다. 물론 회원정보 수정 등 컨트롤러의 로직에 일일히 다 쿠키검사를 하는 방법도 있겠지만.. 한 두개가 아닐 것이다. 게다가 만약 향 후 로그인에 관한 로직을 수정하게 된다면.. 이렇게 여러 로직들에서 공통적으로 관심을 가져야 하는 것을 공통 관심사 라고 한다. 회원 정보 수정, 삭제, 조회 등 사용자에 대한 로그인(인증)에 관심이 있다. AOP( https://qwefdg3.tistory.com..

53. 세션 정보 확인과 타임아웃 설정

세션 정보 확인 @Slf4j @RestController public class SessionInfoController { @GetMapping("/session-info") public String sessionInfo(HttpServletRequest request){ HttpSession session = request.getSession(false); if(session == null){ return "세션이 없습니다."; } session.getAttributeNames().asIterator() .forEachRemaining( name -> log.info("session name = {}, value = {}", name, session.getAttribute(name))); log.inf..

52. 스프링 세션 업그레이드

살짝. 업그레이드 한다. @GetMapping("/") public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { if(loginMember == null){ return "home"; } model.addAttribute("member", loginMember); return "loginHome"; } @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember 이렇게 세션 받을 수 있다. 참고로 이거 있으면 받기만 하는거..

51. 스프링의 Http 세션

먼저 key이름 같은 건 자주 쓰니 public interface SessionConst { public static final String LOGIN_MEMBER = "loginMember"; } 아예 인터페이스에다가 public으로 String 해놔서 등록. @PostMapping("/login") public String loginV3(@Validated @ModelAttribute LoginForm loginForm, BindingResult bindingResult, HttpServletRequest request){ if(bindingResult.hasErrors()){ return "login/loginForm"; } Member loginMember = loginService.login(l..

50. 서버세션 적용

세션기능 구현은 완료했고, 이제 적용하는 일만 남았다. 적용은 쉽다. @Slf4j @Controller @RequiredArgsConstructor public class LoginContoller { private final LoginService loginService; private final SessionManager sessionManager; @GetMapping("/login") public String loginForm(@ModelAttribute LoginForm form){ return "login/loginForm"; } @PostMapping("/login") public String login(@Validated @ModelAttribute LoginForm loginForm, B..

48. 서버 세션

결국 중요한 데이터는 모두 서버에 저장해야 하며, 서버와 클라이언트 외에 추정 불가능한 무언가의 식별자가 있어야 한다. 전체적인 로직은 이렇다. 1. 클라이언트가 서버에 로그인아이디, 패스워드와 함께 로그인 요청을 한다. 2. 서버에서는 맞는 정보인지 찾아본다. 만약 맞다면, 세션 저장소에 예측할 수 없는 임의의 값(임의의값 + Hash나 UUID 등)을 세션id(일종의 key)로 넣고 value로 그 멤버의 정보를 저장한다. 3. 그 다음 쿠키로 이 세션 ID를 보낸다. 이러면 세션 아이디에서는 유저에 대한 정보를 전혀 예측할 수 없다. 또, 이 세션ID도 만약 무언가 외국 IP등 이상현상이 있으면 세션저장소에서 아예 지워버리거나, 또 대부분 이 세션을 짧게 (한 30분?) 유지시키고 그 후 파괴 시킨..

47. 쿠키의 보안문제

쿠키... 그냥 웹브라우저에서 값을 직접 바꾸거나 아니면 포스트맨으로 서버로 쿠키를 보낼 수 있다. 그리고 클라이언트 PC에 뭔갈 저장한다는 것도 문제의 요지가 있고, 이 쿠키는 계속 서버로 전송되는 데이터이다. 중간에 누가 가로챌 수 있다.(그래서 https를 써야 한다.) 그래서 쿠키에 중요한 값을 넣어놓으면 안되고, 무언가 대안이 필요하다..

46. 쿠키를 이용한 로그인 구현.

쿠키에 대해선 잘 모르겠다면 https://qwefdg3.tistory.com/204 여기를 참고하도록 하자. 여튼 논리자체는, 쿠키는 영속성 쿠키, 세션 쿠키 이렇게 두가지 종류가 있는데, 영속성 쿠키는 우리가 날짜 (expire 될 날짜) 를 정해주는 것으로, 웹브라우저를 꺼도 쿠키가 지정한 시간만큼 유지가 된다. 세션쿠키는 웹브라우저를 종료하면 그냥 사라진다. 그러므로, 로그인에는 세션쿠키가 더 알맞다. @Slf4j @Controller @RequiredArgsConstructor public class LoginContoller { private final LoginService loginService; @GetMapping("/login") public String loginForm(@Model..