ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • 트랜잭션
  • AccessDecisionManager
  • nGrinder
  • java
  • mysql
  • 정규표현식
  • nginx basic auth
  • restdocs enum
  • StructuredConcorrency
  • 동일성
  • 가상 스레드 예외 핸들링
  • querydsl
  • jpa
  • 가상 스레드
  • 동등성
  • scope value
  • DataJpaTest
  • 인가(Authorization) 처리
  • VirtualThread Springboot
  • AccessDecisionVoter 커스텀
  • LocalDateTime
  • node exporter basic auth
  • restdocs custom
  • 구조화된 동시성
  • tree
  • AuthenticationException
  • junit5
  • 동시성 제어
  • FilterSecurityInterceptor
  • UserDetailsService

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

Spring/Spring Security

DefaultLoginPageGeneratingFilter

2022. 12. 17. 22:49

사용자가 로그인 페이지를 구성하지 않은 경우 기본적으로 로그인 페이지를 만들어주는 필터이다.

  • 별도의 로그인 페이지 설정을 하지 않으면 제공되는 필터

로그인 페이지 자체를 커스텀 구현 가능하며, 이 경우 해당 필터는 비활성화됨

  • docs

프로세스는 단순하다

커스텀 로그인 페이지가 활성화 되어 있고 URL을 설정하였으면 설정된 URL로 가서 커스텀 로그인 페이지를 보여준다.

활성화가 되어있지 않으면 DefaultLoginPageGeneratingFilter를 등록하고 요청이 들어오면 해당 필터에서 Html을 생성해서 로그인 페이지를 보여준다.

우리가 만약 로그인 페이지를 커스텀 해서 사용할 것이면?

시큐리티 설정 내에서 로그인 페이지를 따로 설정 해줘야 한다

http.formLogin()
        .loginPage("/my-login-page")
        .permitAll();
  • 이렇게 설정 하면 커스텀 페이지를 사용할 것이라고 선언한 거기 때문에
    • DefaultLoginPageGeneratingFilter 필터 등록이 안되있다
    • 로그 아웃도 마찬가지. (DefaultLogoutPageGeneratingFilter)
    • 다른 필터들은 등록 되어있다.
    • 반드시 .permitAll()을 해줘야 한다 (모든 사용자 접근 가능하게)
  • 두 필터를 제공 해주지 않는다. (필터 등록 x )

필터 설명

일반적으로 필터 순서는 바뀔 수 있고, RequestCacheAwareFilter, RememberMeAuthenticationFilter 등 앞에 존재한다

  • 이 필터 순서는 항상 바뀔 수 있다.

이 필터가 하는 일은 단순하다.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
}

private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        boolean loginError = isErrorPage(request);
        boolean logoutSuccess = isLogoutSuccess(request);
        if (isLoginUrlRequest(request) || loginError || logoutSuccess) {
            String loginPageHtml = generateLoginPageHtml(request, loginError, logoutSuccess);
            response.setContentType("text/html;charset=UTF-8");
            response.setContentLength(loginPageHtml.getBytes(StandardCharsets.UTF_8).length);
            response.getWriter().write(loginPageHtml);
            return;
        }
        chain.doFilter(request, response);
}

로그인 페이지 URL인지, 에러페이지인지, 로그아웃 성공인지에 대해 확인하고

로그인 페이지 URL이면 generateLoginPageHtml()를 호출하여 페이지를 response에 setUp하고 리턴한다.

  • isErrorPage(request): 요청 url과 errorpage URL을 비교하여 boolean 반환
  • isLogoutSuccess(request) : this.logOutSuccessUrl 을 비교하여 로그아웃 URL이면 true 아니면 false
private String generateLoginPageHtml(HttpServletRequest request, boolean loginError, boolean logoutSuccess) {
        String errorMsg = "Invalid credentials";
        if (loginError) {
            HttpSession session = request.getSession(false);
            if (session != null) {
                AuthenticationException ex = (AuthenticationException) session
                        .getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
                errorMsg = (ex != null) ? ex.getMessage() : "Invalid credentials";
            }
        }
        String contextPath = request.getContextPath();
        StringBuilder sb = new StringBuilder();
        sb.append("<!DOCTYPE html>\n");
        sb.append("<html lang=\"en\">\n");
        sb.append("  <head>\n");
        sb.append("    <meta charset=\"utf-8\">\n");
  ... 다 html 만드는 페이지임 
  • 그냥 진짜 진부하게 html로 하드코딩 되어있다
  • RememberMe Option을 켰다면 RememberMe 박스도 만들어준다
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

  return http.authorizeRequests()
            ... 생략
            .and()

            // rememberMe 설정
            .rememberMe()
            .rememberMeParameter("remember-me")
            .tokenValiditySeconds(300) // 5분
            .and()
                    ... 생략
            .build();
}
저작자표시 비영리 (새창열림)

'Spring > Spring Security' 카테고리의 다른 글

AbstractAuthenticationProcessingFilter (a.k.a UsernamePasswordAuthenticationFilter) 와 인증과정  (0) 2022.12.18
DefaultLogoutPageGeneratingFilter, LogOutFilter  (0) 2022.12.17
Spring Security에서 인증이 일어나는 과정 (인증과정, form login 과정)  (0) 2022.12.17
Authentication, AuthenticationManager, AuthenticationProvider, eraseCredentialsAfterAuthentication  (0) 2022.12.17
Spring Security - SecurityContext, SecurityContextHolder, SecurityContextHolderStrategy, Authentcation  (0) 2022.12.17
    'Spring/Spring Security' 카테고리의 다른 글
    • AbstractAuthenticationProcessingFilter (a.k.a UsernamePasswordAuthenticationFilter) 와 인증과정
    • DefaultLogoutPageGeneratingFilter, LogOutFilter
    • Spring Security에서 인증이 일어나는 과정 (인증과정, form login 과정)
    • Authentication, AuthenticationManager, AuthenticationProvider, eraseCredentialsAfterAuthentication
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바