Form-based Login
。HTML의 <form> 태그를 기반으로 동작하는 세션 기반 로그인 방식
▶ Spring Security 사용 시 기본적으로 세션 기반 로그인 페이지가 도출
。Form-base Login 방식으로 로그인하는 경우 Cookie로 JSESSONID라는 이름으로 Session ID를 전달하여 브라우저의 로그인 상태를 유지
。따로 Authentication 객체를 지정하지 않은 경우 기본적으로 root 계정을 제공
- 기본 생성되는
루트 계정
id : user
pw : 콘솔창 도출
▶ 인증 시 인증세션을 유지
Form-based Login 특징
Session 기반 인증 방식이므로, CSRF Protection이 반드시 활성화
사용자가 인증을 완료한 경우 해당 사용자에 대해 Session Cookie를 발급
。용자가 수행하는 모든 API 호출에 대하여 일일이 로그인 할 필요없이 해당 Session Cookie를 HTTP Request에 포함하여 전송
Client가 Server에 Mapping된 resource(= URL)를 요청 시 해당 URL이 인증을 요구하는 경우 자동으로 Login page를 반환
。Custom Login Page를 생성하여 UI를 변경하여 사용 가능.
Session Cookie
。브라우저가 실행되는동안 유지되는 Cookie로서 사용자의 브라우저 종료 시 자동으로 삭제.
▶ 사용자 세션을 유지하거나 로그인 상태 관리 시 사용.
。사용자가 로그인 시 Server는 Session Cookie를 발급하고, Client는 이를 HTTP Request에 포함하여 Server로 전송.
。Spring에서 formLogin()등의 인증방식을 통해 로그인 시 생성.
▶ 검사 → All → Headers → Request Header의 Cookie에서 생성된 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 Class의 static method로서 정의됨.
formLogin() 관련 설정
。Spring Securirt의 HTML 기반 <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")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
.clearAuthentication(true);
})
logoutConfig.logoutUrl("/URL명")
。로그아웃 수행 시 기본 로그아웃 페이지 URL ( = /logout )이 아닌, 커스텀 로그아웃 페이지 URL을 지정하는 메서드
logoutConfig.invalidateHttpSession(boolean)
。로그아웃 시 기존 로그인한 세션 정보를 삭제할 건지 여부를 결정
▶ boolean으로 지정
logoutConfig.deleteCookies("쿠키명")
。세션이 저장되는 쿠키( JSESSIONID )를 삭제
logoutConfig.clearAuthentication(boolean)
。인증정보 삭제 여부를 결정