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 의존성 설정
xxxxxxxxxx
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.0'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.springframework.security:spring-security-test'
}
필자는 intellij를 이용하여 프로젝트를 만들었습니다. 다른 IDE를 사용하시는 분은 위의 Gradle Config를 참고하여 Dependency를 추가해주세요.
1.2 application.yml 설정
spring
h2
console
enabledtrue
path /h2-console
jpa
hibernate
ddl-auto create
generate-ddltrue
handlebars
suffix .html
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파일을 생성합니다.
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="Login">
</form>
</body>
</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를 생성합니다.
xxxxxxxxxx
public class MainController {
"/login") // .loginPage("LOGIN_PAGE")에서 설정한 LOGIN_PAGE와 일치해야 함 (
public String getLoginForm() {
return "loginPage";
}
}
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
으로 지정하겠습니다.
<body>
<form action="/doLogin" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="Login">
</form>
</body>
이어 loginPage의 form태그의 action의 url을 위에서 설정한 url(/doLogin)로 변경합니다.
2.2 form Parameter 변경해보기
public class SecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/doLogin")
.usernameParameter("id")
.passwordParameter("pw");
}
}
form 전송시 사용할 parameter의 key값을 변경하기 위해서는 .usernameParameter()
와 passwordParameter()
를 이용하면 됩니다. 저는 각각 id, pw
으로 지정하였습니다.
<body>
<form action="/doLogin" method="POST">
<input type="text" name="id">
<input type="password" name="pw">
<input type="submit" value="Login">
</form>
</body>
input의 name 속성의 값을 위에서 지정한 id, pw
으로 지정합니다.
3. Authentication Page URL 설정
앞서 우리가 한 설정을 통해서는, 정말 로그인이 필요한 페이지에 접근할 때 Spring Security에서, Custom Form Page로 이동시키는지를 확인하기 어렵습니다. 따라서 여러 handler와 Page를 추가하고, Authorize 설정을 해보겠습니다. 우리가 만든 Custom Login Form Page로 이동이 되어지는지 확인해보도록 하겠습니다.
3.1 Security 설정
xxxxxxxxxx
public class SecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/login")
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/doLogin")
.usernameParameter("id")
.passwordParameter("pw");
}
}
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에 대한 설정을 모두 처리한 후, 제일 마지막에 사용되어야 합니다.
public class MainController {
"/") (
public String getIndex() {
return "index";
}
"/main") (
public String getMain() {
return "main";
}
"/login") (
public String getLoginForm() {
return "loginPage";
}
}
/, /main에 대한 핸들러를 생성합니다.
모든 접근이 허용된 이외의 아무 url로 접근을 시도합니다.
우리가 만든 Custom Form Page로 자동으로 이동됩니다.
'FrameWork > Spring Security' 카테고리의 다른 글
Spring Security - SpringSecurity 이용하기 4 (Database를 이용한 Login 구현) (4) | 2020.02.23 |
---|---|
Spring Security - SpringSecurity 이용하기 3 (logout 기능 추가하기) (0) | 2020.02.23 |
Spring Security - SpringSecurity 이용하기 2 (login Success Handle) (0) | 2020.02.22 |
SpringSecurity - Kakao OAuth2 Client 사용하기 (8) | 2019.07.06 |
SpringSecurity - SpringSecurity 간단한 설정과 예제 (2) | 2019.07.01 |