경주장

[인증 API] form 인증 본문

스프링/스프링 시큐리티

[인증 API] form 인증

달리는치타 2022. 1. 9. 21:30

Post방식으로 Client가 username, password를 전송한다.

 

Server는 Session을 생성하고 Session에 최종 성공한 인증 결과를 담은 Authentication 타입의 객체를 포함한

Security Context를 생성하고 이것을 Session에 저장함 : 인증성공!

 

다시 요청이 들어오면

인증을 받은 사용자의 요청에 포함된 세션 인증 토큰의 존재여부 판단 한다.

 

protected void configure(HttpSecurity http) throws Exception {
	 http.formLogin()
                .loginPage("/login.html")   				// 사용자 정의 로그인 페이지
                .defaultSuccessUrl("/home")				// 로그인 성공 후 이동 페이지
	            .failureUrl("/login.html?error=true")		// 로그인 실패 후 이동 페이지
                .usernameParameter("username")			// 아이디 파라미터명 설정
                .passwordParameter("password")			// 패스워드 파라미터명 설정
                .loginProcessingUrl("/login")			// 로그인 Form Action Url
                .successHandler(loginSuccessHandler())		// 로그인 성공 후 핸들러
                .failureHandler(loginFailureHandler())		// 로그인 실패 후 핸들러
}

 

 


사용자 정의 로그인 페이지 활용 - loginPage

form로그인의 하위 api인 loginPage를 사용해 custom login 페이지를 설정해보자!

이때 /user/login에 해당되는 getMapping의 설정을 해주어야 한다. 하지만 위의 설정과 controller만으로는 리소스에 접근 할 수 없다. 그 이유는

 

로그인 페이지 자체도 위의 authorization 정책에 따라 anyRequest에 해당되므로 authentication되어야 하기 때문이다.

이때 기본적으로 권한이 없는 상태에서 리소스에 접근을 하게 되면 로그인페이지로 redirection을 시키는데 이때 recurssive한 호출이 발생해서 로그인 페이지를 정상적으로 접근 할 수 없다.

 

리디렉션 횟수가 너무 많다!

이를 막기위해서 /user/login의 endpoint에 대한 인가정책을 permitAll로 수정해야한다.

그 방식은

위 코드의 주석 중 하나는 푸는 것이다. 모두 같은 역할을 한다.


defaultSuccessUrl과 failureUrl

 

defaultSuccesUrl(String defaultSuccessUrl, boolean alwaysUse);

로그인성공시 이동 페이지를 설정합니다.

이때 defaultSuccessUrl의 경우 alwaysUse flag가 있는데 이는 해당 defaultSuccessUrl을 항상 사용할지의 여부를 결정할 수 있습니다. (default : false)

 

예를들어 alwaysUse가 false인 경우(default) login url로 직접 이동을 하여 로그인을 성공 한 경우에만 defaultSuccessUrl로 redirection이 됩니다. 즉, 권한미흡 등의 이유로 loginPage로 redirect되어 넘어오고 로그인을 진행 한다면 접속하고자 했던 경로로 이동하게됩니다. 

ㅁalwaysUse가 true라면 항상 설정한 경로로 redirect됩니다.

 

failureUrl(String authenticationFailureUrl)

failureUrl은 로그인 실패시 redirect경로를 설정하는 api입니다.


usernameParameter, passwordParameter, loginProcessingUrl

로그인 페이지 html의 username, password 파라미터의 이름과 form태그의 action 속성의 경로를 설정할 수 있습니다.

default는 각각 "username" , "password", "/login"입니다.


successHandler, failureHandler

 

request, response와 각각 인증, 예외 객체를 담은 로그인 성공,실패 핸들러를 설정할 수 있습니다.

defaultSuccessUrl및 failureUrl과 비슷한 역할을 하면서 동시에 여러 객체를 전달 받기 때문에 더욱 정교한 작업을 할 수 있습니다.

 

url기반의 success, failure 설정은 handler가 설정되면 무시됩니다.