Home

0

Spring Boot 기본 헤더 조회

목차 Spring MVC - ArgumentResolver Spring MVC - HttpMessageConverter Spring Boot Http 응답 - HTTP API, Message Body에 직접 입력 Spring Boot 응답 - 정적 리소스, 뷰 템플릿 Spring Boot 요청 메시지 - JSON Spring Boot 요청 메시지 - Text Spring Boot 쿼리 파라미터, HTML Form Spring Boot 기본 헤더 조회 Spring Boot API 예시 Spring Boot @RequestMapping Spring Boot Logging 기본 헤더 조회Controller 사용 가능한 파리미터 목록 @Slf4j@RestControllerpublic class RequestHeaderController { @RequestMapping("/headers") public String headers(HttpServletRequest request, HttpServletResponse response, HttpMethod httpMethod, Locale locale, @RequestHeader MultiValueMap<String, String> headerMap, @RequestHeader("host") String host, @CookieValue(value = "myCookie", required = false) String cookie) { log.info("request={}", request); log.info("response={}", response); log.info("httpMethod={}", httpMethod); log.info("locale={}", locale); log.info("headerMap={}", headerMap); log.info("header host={}", host); log.info("myCookie={}", cookie); return "ok"; }}

0

Spring Boot 쿼리 파라미터, HTML Form

목차 Spring MVC - ArgumentResolver Spring MVC - HttpMessageConverter Spring Boot Http 응답 - HTTP API, Message Body에 직접 입력 Spring Boot 응답 - 정적 리소스, 뷰 템플릿 Spring Boot 요청 메시지 - JSON Spring Boot 요청 메시지 - Text Spring Boot 쿼리 파라미터, HTML Form Spring Boot 기본 헤더 조회 Spring Boot API 예시 Spring Boot @RequestMapping Spring Boot Logging Spring Boot 쿼리 파라미터, HTML Form<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="/request-param-v1" method="post"> username: <input type="text" name="username"/> age: <input type="text" name="age"/> <button type="submit">전송</button></form></body></html> HttpServletRequest 객체 내 메소드 사용하기@Slf4j@RestControllerpublic class RequestParamController { @RequestMapping("/request-param-v1") public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException { String username = request.getParameter("username"); int age = Integer.parseInt(request.getParameter("age")); log.info("username={}, age={}", username, age); response.getWriter().write("ok"); }} RequestParam 어노테이션 사용하기@RequestMapping("/request-param-v2")@ResponseBodypublic String requestParamV2( @RequestParam("username") String memberName, @RequestParam("age") int memberAge) { log.info("username={}, age={}", memberName, memberAge); return "ok";} @RequestMapping("/request-param-v3")@ResponseBodypublic String requestParamV3( @RequestParam String username, @RequestParam int age) { log.info("username={}, age={}", username, age ); return "ok";} @RequestMapping("/request-param-v4")@ResponseBodypublic String requestParamV4(String username, int age) { log.info("username={}, age={}", username, age ); return "ok";}

0

Spring Security - AuthenticationProvider

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 참고 https://spring.io/guides/topicals/spring-security-architecture Spring Security - AuthenticationProviderAuthenticationProvider.java AuthenticationManager로 부터 인증을 위임받아 실제로 인증을 진행하는 객체, AuthenticationProvider의 구현체로는 AbstractUserDetailsAuthenticationProvider 와 DaoAuthenticationProvider 가 존재한다. AuthenticationProvider 의 인증 과정 전달받는 authentication 에서 username을 가져온 뒤 DB에서 해당 하는 유저 정보를 가져온다. 인증을 진행하기 전 DB로부터 가져온 UserDetails 객체에 대한 유효성 검사를 진행한다. 전달 받은 Authentication 객체내의 Credential 정보와 UserDetails 객체의 Password와 값이 일치하는지 확인한다. username에 대한하는 UserDetails 객체를 못 찾을 경우 UsernameNotFoundException 예외를 던지고 Credentials가 Password와 다를 경우 BadCredentialsException 예외를 던진다. 인증 후 다시한번 UserDetails 객체의 유효성 검사를 진행하고, 캐시에 UserDetails 객체를 저장한다. 새로운 Authentication 객체를 만들어 반환한다.

0

Spring Security - AuthenticationManager

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 참고 https://spring.io/guides/topicals/spring-security-architecture Spring Security - AuthenticationManager AuthenticationManager 는 인증을 진행하는 AuthenticationProvider 객체들을 관리하는 객체다. AuthenticationManager 는 AuthenticationProvider 에 인증을 위임하는 형태로 인증을 진행한다. public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException;} ProviderManager AuthenticationManager의 가장 대표적인 구현체

0

Spring Security - SecurityContextHolder 와 SecurityContext

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 참고 https://spring.io/guides/topicals/spring-security-architecture Spring Security - SecurityContextHolder 와 SecurityContext 인증을 진행하면서 생성된 Authentication 객체는 SecurityContext 객체 내에 저장된다. 저장된 Authentication 객체를 저장하고 가져오기 위해서 SecurityContext는 getAuthentication 메소드와 setAuthentication 메소드를 제공한다. SecurityContext.java public interface SecurityContext extends Serializable { Authentication getAuthentication(); void setAuthentication(Authentication authentication);}

0

Spring Security - Authentication 객체

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 참고 https://spring.io/guides/topicals/spring-security-architecture Spring Security - Authentication 객체 Authentication 객체 내에는 자원에 접근하기 위한 대상의 정보와 권한 정보가 들어가 있다. Authentication 객체의 대표적인 구현 클래스는 AbstractAuthenticationToken 클래스와 UsernamePasswordAuthenticationToken 가 있다. 인증을 진행하면서 생성된 Authentication 객체는 SecurityContext 객체에 저장된다. Authentication 객체 내에 Principal, Credentials, GrantedAuthority 가 있다. Principal Object 타입으로 보통은 User ID가 들어가거나 UserDetails가 들어가게 된다. Credentials Object 타입으로 보통은 User Password가 들어가 있다. GrantedAuthority 접근 권한 목록들을 가지고 있다. public interface Authentication extends Principal, Serializable { Collection<? extends GrantedAuthority> getAuthorities(); Object getCredentials(); Object getDetails(); Object getPrincipal(); boolean isAuthenticated(); void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;}

0

Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 Remember Me와 관련된 인증 API rememberMeParameter 쿠키의 파라미터명을 지정한다. 체크박스의 이름(parameter)과 remember-me의 파라미터 명은 일치 시켜줘야 한다. tokenValiditySeconds 쿠키의 만료시간을 설정한다. useSecureCookie Cookie 에 보안 설정을 할 때 사용하는 Flag HTTPS 환경에서만 사용할 수 있다. userDetailsService remember-me 를 이용한 인증 진행시 시스템의 사용자 계정을 조회할 때 사용하는 class 를 지정한다. tokenRepository Remember Me Token 저장소를 설정한다. 기본은 TokenBasedRememberMeServices 를 사용하기 때문에 Cookie 에 저장하는 방식이다. 기본 구현체는 InMemoryTokenRepositoryImpl 와 JdbcTokenRepositoryImpl 로 저장소를 명시해주면 PersistentTokenBasedRememberMeServices 를 사용한다. key Remember Me Authentication 객체 유효성을 확인하기 위한 Key 값을 설정한다. String Hash 비교를 통해 인증 유효성을 확인한다. alwaysRemember Remember Me 기능이 활성화되지 않아도 항상 실행하는 Flag 사용자의 Session이 생성되었고 Session이 인증 객체를 담고 있다는 것이다. RememberMeConfigurerpublic RememberMeConfigurer<H> tokenValiditySeconds(int tokenValiditySeconds) { this.tokenValiditySeconds = tokenValiditySeconds; return this;}public RememberMeConfigurer<H> useSecureCookie(boolean useSecureCookie) { this.useSecureCookie = useSecureCookie; return this;}public RememberMeConfigurer<H> userDetailsService(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; return this;}public RememberMeConfigurer<H> tokenRepository(PersistentTokenRepository tokenRepository) { this.tokenRepository = tokenRepository; return this;}public RememberMeConfigurer<H> key(String key) { this.key = key; return this;}public RememberMeConfigurer<H> rememberMeParameter(String rememberMeParameter) { this.rememberMeParameter = rememberMeParameter; return this;}public RememberMeConfigurer<H> rememberMeCookieName(String rememberMeCookieName) { this.rememberMeCookieName = rememberMeCookieName; return this;}public RememberMeConfigurer<H> rememberMeCookieDomain(String rememberMeCookieDomain) { this.rememberMeCookieDomain = rememberMeCookieDomain; return this;}public RememberMeConfigurer<H> authenticationSuccessHandler( AuthenticationSuccessHandler authenticationSuccessHandler) { this.authenticationSuccessHandler = authenticationSuccessHandler; return this;}public RememberMeConfigurer<H> rememberMeServices(RememberMeServices rememberMeServices) { this.rememberMeServices = rememberMeServices; return this;}public RememberMeConfigurer<H> alwaysRemember(boolean alwaysRemember) { this.alwaysRemember = alwaysRemember; return this;}

0

네트워크 - HTTP Status Code

HTTP Status Code1xx (Information) - 정보성 상태 코드 Http Status Code는 HTTP/1.1 에서 도입된 상태 코드 2xx (Successful) - 성공 상태 코드 코드 설명 200 : OK 요청 성공했음을 나타낸다. 201 : Created 요청이 성공하고 새로운 리소스가 생성됐음을 나타낸다. 202 : Accepted 요청은 성공했으나 서버가 아직 작업을 진행하지 않은 상태를 나타낸다. 204 : No Content 요청이 성공했고 Server에서 Client로 보낼 데이터가 없는 상태를 나타낸다. 3xx (Redirection) - 리다이렉션 상태 코드 코드 설명 300 : Multiple Choices 리소스의 URI가 영구적으로 이동 301 : Moved Permanently 302 : Found 303 : See Other 304 : Not Modified 307 : Temporary Redirect 308 : Permanent Redirect 4xx (Client Error) - 클라이언트 오류

0

Spring MVC Request Life Cycle - Interceptor

목차 Spring MVC - ArgumentResolver Spring MVC Request Life Cycle - ViewResolver Spring MVC Request Life Cycle - HandlerAdapter Spring MVC Request Life Cycle - HandlerMapping Spring MVC Request Life Cycle - DispatcherServlet Spring MVC Request Life Cycle - Interceptor Spring MVC Request Life Cycle - Filter Interceptor 스프링 Interceptor 는 Handler(Controller) 호출 전, 후에 사용자 요청 및 응답을 가로채 특정 로직을 수행하는 역할을 한다. DispatcherServlet 이후에 동작한다. 스프링 Filter 처럼 Request, Response 객체를 다른 객체로 변경하는 것이 불가능 하다. Interceptor 는 Request, Response 객체를 넘겨주는 방식으로 진행하지 않고, boolean 값을 반환하는 형태로 로직 수행 Interceptor 인터페이스 preHandle Handler 호출 전에 실행된다. HttpServletRequest 객체를 이용해 preHandle 이 true 를 반환하면 다음으로 진행하고, false 면 진행하지 않는다. postHandle Handler 호출 후에 실행된다. afterCompletion View 가 렌더링 된 이후에 호출된다. public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { }}

0

Spring boot - HttpSession 사용하기

목차 Spring boot - HttpSession 사용하기 Spring boot - 직접 Session Storage 구현하기 Spring boot - Cookie 사용하기 Spring boot Session 사용하기 2 request.getSession(true) HttpSession 이 존재하면 HttpSession 을 반환하고 존재하지 않으면 새로운 Session 을 반환한다. request.getSession(false) HttpSession 이 존재하면 현재 HttpSession 을 반한하고 존재하지 않으면 null 을 반환한다. @PostMapping("/login")public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request){ log.info("Request Params : {}", form); if(bindingResult.hasErrors()){ return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if(loginMember == null){ bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; } // 로그인 설공 처리 TODO // 세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성 HttpSession session = request.getSession(); // 세션에 로그인 회원 정보를 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); return "redirect:/";} @PostMapping("/logout")public String logoutV3(HttpServletRequest request){ HttpSession session = request.getSession(false); if(session != null){ session.invalidate(); } return "redirect:/";} @GetMapping("/")public String homeLoginV3(HttpServletRequest request, Model model){ HttpSession session = request.getSession(false); if(session == null){ return "home"; } Member LoginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); // 세션에 회원 데이터가 없으면 home if(LoginMember == null){ return "home"; } // 세션이 유지되 로그인으로 이동 model.addAttribute("member", LoginMember); return "loginHome";} 스프링에서 지원하는 Session 기능 사용하기@GetMapping("/")public String homeLoginV3Spring( @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model){ // 세션에 회원 데이터가 없으면 home if(loginMember == null){ return "home"; } // 세션이 유지되 로그인으로 이동 model.addAttribute("member", loginMember); return "loginHome";}