Spring Security - Form Based Login

TopOfTheHead·2026년 5월 17일

Spring Security

목록 보기
21/27

Form-based Login
HTML<form> 태그를 기반으로 동작하는 세션 기반 로그인 방식
Spring Security 사용 시 기본적으로 세션 기반 로그인 페이지가 도출

Form-base Login 방식으로 로그인하는 경우 CookieJSESSONID라는 이름으로 Session ID를 전달하여 브라우저로그인 상태를 유지

。따로 Authentication 객체를 지정하지 않은 경우 기본적으로 root 계정을 제공

  • 기본 생성되는 루트 계정
    id : user
    pw : 콘솔창 도출
    인증인증세션을 유지

Form-based Login 특징

  • Session 기반 인증 방식이므로, CSRF Protection이 반드시 활성화

  • 사용자인증을 완료한 경우 해당 사용자에 대해 Session Cookie를 발급
    。용자가 수행하는 모든 API 호출에 대하여 일일이 로그인 할 필요없이 해당 Session CookieHTTP Request에 포함하여 전송

  • ClientServer에 Mapping된 resource(= URL)를 요청 시 해당 URL인증을 요구하는 경우 자동으로 Login page를 반환
    Custom Login Page를 생성하여 UI를 변경하여 사용 가능.

Session Cookie
브라우저가 실행되는동안 유지되는 Cookie로서 사용자의 브라우저 종료 시 자동으로 삭제.
사용자 세션을 유지하거나 로그인 상태 관리 시 사용.

。사용자가 로그인 시 ServerSession Cookie를 발급하고, Client는 이를 HTTP Request에 포함하여 Server로 전송.

Spring에서 formLogin()등의 인증방식을 통해 로그인 시 생성.
▶ 검사 → AllHeadersRequest HeaderCookie에서 생성된 Session Cookie의 ID를 확인 가능

Form Based Login의 경우 기본 로그인페이지로그아웃페이지 URL 제공
Spring Security 의존성 추가 후 세션 인증 기반 Form based Login을 수행하는 경우 기본적으로 제공되는 기능.

localhost:8080/login :
Spring Login Form 도출

localhost:8080/logout :
Session Cookie를 삭제하여 기존 로그인된 자격증명을 로그아웃
▶ 차후 HTTP Request 전송 시 Authorization Header에 포함되지않아서 요청이 거절됨.
▶ HTML의 <a class="nav-link" href="/logout">으로 간단하게 로그아웃 버튼을 생성할 수 있다.

Form-based Login 관련 설정
SecurityFilterChain 관련 @Configuration 클래스에서 설정을 수행

  • httpsecurity객체.formLogin(form객체 -> ...)
    HttpRequest에 대한 Spring Security의 기본 Form-Based Login( HTML Login Page )을 활성화하는 메서드
    클라이언트어플리케이션에 접근할 때 로그인 페이지를 제공하고, 로그인 요청을 처리하는 기능 수행.

    JWT인증방식으로 사용하는 경우 Session을 통해 로그인 상태를 유지하는 formLogin()을 사용할 필요가 없으므로 비활성화.

  • httpsecurity객체.logout(logoutConfig -> ...)
    Form-based Login에서 로그아웃을 수행하는 메서드

  • httpsecurity객체.formLogin(Customizer.withDefaults()) / .logout(Customizer.withDefaults()) :
    formLogin() / logout()에 관련된 Spring 기본 설정으로 설정
    withDefaults()Customizer Classstatic method로서 정의됨.

formLogin() 관련 설정
Spring SecurirtHTML 기반 <form> 로그인 관련 설정을 수행 시 사용하는 메서드

httpSecurity.formLogin(
                form ->{
                  form.usernameParameter("loginAccount")
                  .passwordParameter("loginPwd")
                  .loginPage("/login-page")
                  .loginProcessingUrl("/login")
                  .successForwardUrl("/")
                  .defaultSuccessUrl("/") 
                  .failureUrl("/login-page?error=true")
                  .failureForwardUrl("/login-page?error=true");
                }
)
  • form객체.usernameParameter("<Input> ID명") : 기본 : "username"
    로그인 요청<form> 태그ID값을 읽어올 <input> 태그 ID를 지정하는 메서드
    <input type="text" name="<Input> ID명">

  • form객체.passwordParameter("<Input> ID명")
    로그인 요청<form> 태그PW값을 읽어올 <input> 태그 ID를 지정하는 메서드
    <input type="password" name="<Input> ID명">

  • form객체.loginPage("커스텀로그인페이지URL")
    기본 로그인 페이지 URL ( = /login )이 아닌, 커스텀로그인 페이지 URL을 지정하는 메서드
    ▶ 로그인 시 해당 메서드url로 자동 진입

    사용자인증되지 않은 상태로 보호자원에 접근 시 해당 URL로 이동

  • form객체.loginProcessingUrl("/URL")
    로그인 인증 요청을 처리할 URL을 지정

    <form action="/login-process" method="post"> 인 경우, form객체.loginProcessingUrl("/login-process")를 설정하여 <form>에서 로그인 요청로그인 인증을 처리

  • form객체.successForwardUrl("/URL")
    로그인 성공Forward를 통해 URL을 실제로 변하지 않고, 페이지만 변경하는 용도로 URL을 지정
    로그인 하는 도중 페이지를 변경하는 경우

    ·실패한 경우, 원래 요청이전 페이지로 이동

  • form객체.defaultSuccessUrl("/기본URL")
    로그인 성공 시 영구적으로 페이지 이동기본 URL을 지정

    직전페이지를 기억하므로, 로그인 성공직전 페이지로 이동이 가능.

  • form객체.failureUrl("/login-page?error=true")
    로그인 실패Redirection을 통해 이동할 URL을 지정

    Query Parameter를 표시할 수 있음.

  • form객체.failureForwardUrl("/URL")
    로그인 실패Forward를 통해 이동할 URL을 지정
    URL 주소는 고정하고, 페이지만 변경

logout() 관련 설정

httpSecurity.logout(logOutConfig->{
                    logOutConfig.logoutUrl("/logout") // 로그아웃 URL
                            .invalidateHttpSession(true) // 로그아웃 시 Session을 없앨건지 여부 설정
                            .deleteCookies("JSESSIONID") // 해당 쿠키를 삭제
                            .clearAuthentication(true); // 인증정보 삭제 여부 결정
                })
  • logoutConfig.logoutUrl("/URL명")
    로그아웃 수행 시 기본 로그아웃 페이지 URL ( = /logout )이 아닌, 커스텀 로그아웃 페이지 URL을 지정하는 메서드

  • logoutConfig.invalidateHttpSession(boolean)
    로그아웃 시 기존 로그인한 세션 정보를 삭제할 건지 여부를 결정
    boolean으로 지정

  • logoutConfig.deleteCookies("쿠키명")
    세션이 저장되는 쿠키( JSESSIONID )를 삭제

  • logoutConfig.clearAuthentication(boolean)
    인증정보 삭제 여부를 결정
profile
공부기록 블로그

0개의 댓글