진짜 개발자
본문 바로가기

FrameWork/Spring Security

Spring Security - SpringSecurity 이용하기 1 (custom login form 구현)

728x90
Spring Security Custom Login Form 구현 (in Spring Boot)

SpringSecurity 이용하기 - 1 : 현재 포스트 (custom login form 구현)

SpringSecurity 이용하기 - 2 : https://galid1.tistory.com/698 (login Success Handle)

SpringSecurity 이용하기 - 3 : https://galid1.tistory.com/699 (logout 기능 추가하기)

SpringSecurity 이용하기 - 4 : https://galid1.tistory.com/700 (database를 이용한 로그인 구현)






이번 포스팅에서는 Spring Boot에서 Spring Security이용시 Custom Form Login을 구현하는 방법에 대해 알아보도록 하겠습니다.

 

https://github.com/galid1/security_customFormLogin

한번에 구현하지 않고 천천히 설정을 알아보며 구현해나아갈 예정입니다. 완성된 소스를 원하시는 분은 위의 링크를 이용해주세요.

 

 

 

 

1. Profject 생성 및 설정

1.1 의존성 설정

필자는 intellij를 이용하여 프로젝트를 만들었습니다. 다른 IDE를 사용하시는 분은 위의 Gradle Config를 참고하여 Dependency를 추가해주세요.

 

 

1.2 application.yml 설정

h2, jpa, handlebars관련 설정을 위와 같이 합니다. handlebars의 경우 기본 suffix가 .hbs이기 때문에 편의를 위해 .html로 변경하기 위한 설정을 추가했습니다. (필자는 application.properties대신 application.yml을 사용하였습니다.)

 

 

 

 

1.3 Security 설정

HttpSecurity에 있는 주석중 한 부분인데요, SpringSecurity FormLogin설정시 기본적으로 생성되는 설정입니다. 위의 내용들을 천천히 알아갈 것입니다.

 

 

WebSecurityConfiguererAdapater를 상속받는 Configuration 클래스를 생성한뒤, @EnableWebSecurity어노테이션을 Class레벨에 부여하고, configure(HttpSecurity http)를 오버라이딩합니다.

 

csrf().disable()

csrf 토큰 검사를 비활성화 하는 로직입니다.

 

formLogin().loginPage("/login")

form을 통한 Login을 활성화하고, 사용자가 Login이 필요한 페이지에 접근했을때, 사용자에게 보여줄 Custom Login Form Page를 띄워줄 handler의 url을 지정합니다. .loginPage()를 설정하지 않는 경우, Spring Security에서 제공하는 기본 Form Login Page가 나타납니다.

 

 

 

1.4 Custom Login Form Page 생성

custom Login Form에 사용될 html 페이지를 작성합니다. 우선 resources/templates/ 위치에 html파일을 생성합니다.

 

 

간단한 form을 작성합니다.

 

login 처리 URL

action url은 /login을 지정합니다. 이 url은 Spring Security에서 Login처리를 위한 기본(default) URL로 설정되어 있으며, 이 url 역시 Spring Security 설정에서 변경할 수 있습니다. 뒤에서 설명드리도록 하겠습니다.

 

 

input name

user id를 위한 parameter key값은 기본적으로 username입니다.

user pw을 위한 parameter key값은 기본적으로 password입니다.

위의 각 parameter key값 역시 커스터마이징이 가능합니다. 이 역시 뒤에서 같이 설명드리겠습니다.

 

 

 

 

1.5 Controller 생성

이제 앞서 설정한 login form 페이지를 띄워줄 Controller를 생성합니다.

 

login page를 띄우기 위한 url은 Spring Security설정시, .loginPage("LOGIN_PAGE")에서 설정한 url을 이용해야 합니다.

 

 

 

1.7 테스트

기본적으로 CustomLogin Form을 만들기위한 설정은 완료했습니다. 이상하죠? id, password를 설정한 적도 없는데 말이죠, 우선한번 실행해보도록 하겠습니다.

 

실행해보면 콘솔창에 security에서 자동으로 생성해주는 비밀번호가 나타납니다. 이것을 이용하여 로그인을 해봅시다.

 

.loginPage()에서 지정한 url로 접근하면, 앞서 작성한 Login Form이 나타납니다. 이어서 로그인 정보를 입력합니다. id는 기본적으로 user이며, password의 경우 application 실행시 console에 나타난 값을 이용하면 됩니다.

 

아직, login 이후 처리로직을 만들지 않았기 때문에, 성공시 위와 같이 빈 페이지가 나타납니다.

 

실패시, 위와 같이 url 끝에 error가 붙게 됩니다.

 

 

 

 

 

2. Form 설정 변경해보기

2.1 Login 처리 URL 변경해보기

.loginProcessingUrl()에 원하는 url을 입력합니다. 저는 /doLogin으로 지정하겠습니다.

 

이어 loginPage의 form태그의 action의 url을 위에서 설정한 url(/doLogin)로 변경합니다.

 

 

 

2.2 form Parameter 변경해보기

form 전송시 사용할 parameter의 key값을 변경하기 위해서는 .usernameParameter()passwordParameter()를 이용하면 됩니다. 저는 각각 id, pw으로 지정하였습니다.

 

input의 name 속성의 값을 위에서 지정한 id, pw으로 지정합니다.

 

 

 

 

 

3. Authentication Page URL 설정

앞서 우리가 한 설정을 통해서는, 정말 로그인이 필요한 페이지에 접근할 때 Spring Security에서, Custom Form Page로 이동시키는지를 확인하기 어렵습니다. 따라서 여러 handler와 Page를 추가하고, Authorize 설정을 해보겠습니다. 우리가 만든 Custom Login Form Page로 이동이 되어지는지 확인해보도록 하겠습니다.

 

 

3.1 Security 설정

authorizeRequests()를 이용해, Access 제한을 허용합니다.

 

antMatchers

antMatchers를 이용해, control할 url을 지정합니다. 이후, denayAll(), permitAll(), hasRoll(), authenticated() 메소드를 이용하여, 모두 거절하거나, 허용, 그리고 로그인한 User가 특정 Role을 가진 경우, 마지막으로 인증이 된경우에만 지정한 url에 접근할 수 있도록 할 수 있습니다.

antMatchers("/login").permitAll()/login으로 접근하는 모든 사용자에 대해 접근을 허용한 설정입니다.

*antMatchers에서 지정한 url이외의 경우 모두 인증이 필요하도록 설정할 것입니다. 따라서, 이외의 모든 url로 접근하는 경우, login Form Page를 띄우는 /login으로 redirected 되어지는데요, 이 때, /login에 대한 접근이 인증이 필요하다면, 계속해서 /login으로 다시 보내기 때문에, 무한 루프에 빠지게 됩니다. 따라서 /login을 처리하는 url은 permitAll()을 통해 모든 사용자가 접근 가능하도록 설정해야 합니다.

 

 

anyRequest()

anyRequest()의 경우 antMatcher를 이용해 지정한 url 이외의 모든 url을 지정하는 메소드입니다. authenticated() 메소드는 인증이 되어진 사용자만 접근할 수 있도록 제한하는 메소드입니다.

*anyRequest()의 경우 무조건 antMatcher()를 통해 특정 url에 대한 설정을 모두 처리한 후, 제일 마지막에 사용되어야 합니다.

 

 

/, /main에 대한 핸들러를 생성합니다.

 

모든 접근이 허용된 이외의 아무 url로 접근을 시도합니다.

 

우리가 만든 Custom Form Page로 자동으로 이동됩니다.