Spring Security(주저리 주저리 메모장)
Spring Security는 프로젝트에 있어서 로그인한 유저를 관리해주는 프레임워크다.
여기에서 관리란 애플리케이션의 보안(인증과 권한, 인가 등)을 말한다.
현재 프로젝트에서 적용할 사항은 아래와 같다.
1. ID, Passwd를 이용한 로그인(인증)
2. 사용자에 대한 권한부여(접근 제어)
3. 세션 관리
4. 위 정보들에 대한 보관 및 관리
Spring Security의 기본적인 세팅들은 참고하여 진행을 하고
추가적인 사항들은 추후에 구글링하여 적용할 계획
xml을 이용하여 기본 구성(세팅)을 하는 경우도 있지만, 현재 참고하는 곳은 java파일 3개로 세팅을 한다.
- gradle 추가하는 것 말고, xml이나 properties는 수정하지 않음
기본 세팅
gradle에 Spring Security 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
SpringSecurityConfig 파일에 아래 추가
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.defaultSuccessUrl("/view/dashboard", true)
.permitAll()
.and()
.logout();
}
}
.anyRequest().authenticated() : 어떠한 URI로 접근하던지 인증이 필요
formLogin() : 폼방식 로그인을 사용 / logout()도 필요하니 추가
defaultSuccessUrl : 로그인 성공 시 이동할 URI
예외처리
.antMatchers("/chk").permitAll() : 경로는 수정 가능하며, 로그인 없이 접근 가능해야 하는 URI 설정
> 클라우드를 사용하는 경우에 일반적으로 로드밸런서를 사용한다. 이때, 로드밸런서에 상태 체크 URI를 작성해야 하고 이런 경우 Spring Security에서 인증을 진행하지 않아야먄 정상적으로 처리가 가능
> 추가적으로 css나 이미지 파일 등 인증이 필요하지 않은 경우에도 별도로 WebSecurity를 인자로 갖는 configure를 오버라이팅해서 예외처리가 가능
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/chk").permitAll() // LoadBalancer Chk
.anyRequest().authenticated()
.and()
.formLogin()
.defaultSuccessUrl("/view/dashboard", true)
.permitAll()
.and()
.logout();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/static/js/**","/static/css/**","/static/img/**","/static/frontend/**");
}
}
만약, 로그인 페이지를 커스텀하는 경우에 WebSecurity예외처리를 하지 않으면 화면이 깨지게 된다.
커스텀 페이지
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/chk").permitAll() // LoadBalancer Chk
.antMatchers("/manage").hasAuthority("ROLE_ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/view/login")
.loginProcessingUrl("/loginProc")
.usernameParameter("id")
.passwordParameter("pw")
.defaultSuccessUrl("/view/dashboard", true)
.permitAll()
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logoutProc"));
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/static/js/**","/static/css/**","/static/img/**","/static/frontend/**");
}
}
.loginPage("/view/login") : 커스텀 페이지로 로그인 페이지를 변경
.loginProcessingUrl("/loginProc") : 별도의 컨트롤러 없이, 폼 로그인 형태이므로 해당 주소를 어디로 처리할지 정해준다.
위의 /view/login 에서 <form method="post" action="/loginProc">와 같이 폼의 액션을 정해주면 Spring Security쪽으로 id와 passwd를 보내게 된다.
.usernameParameter("id") : 유저 아이디에 해당하는 폼의 name을 변경(default는 username)
> 위와 같은 상황에서 input은 <input type="text" name="id">이 되어야 한다.
.passwordParameter("pw") : 유저 비밀번호에 해당
> 위와 같은 상황에서 input은 <input type="password" name="pw">이 되어야 한다.
.antMatchers("/manage").hasAuthority("ROLE_ADMIN") : 해당 사용자가 ADMIN의 role을 가지고 있어야만 /manage 이하의 uri에 접근 가능하게 된다.(role은 db에 넣는 방식으로 진행하면 될듯)
'.logoutRequestMatcher(new AntPathRequestMatcher("/logoutProc")) : /logoutProc를 호출하면 로그아웃이 되며, 인증한 것이 사라지기 때문에 다시 로그인 페이지로 자동으로 이동이 된다.(default는 /logout)
인증
보통 로그인은 db에 암호화되어 있는 id와 passwd를 가지고 와서 비교를 하는 방식을 많이 사용한다.해당 과정을 처리하기 위해 UserDetailsService를 implements하는 클래스가 필요하다.다음으로, 위의 SpringSecurityConfig파일에 해당 클래스로 id와 passwd를 인증하겠다는 처리를 해야한다.
여기까지 하고 다른 블로그를 참고하였다....
Spring Boot 회원가입 구현 해보자!
IntelliJ : 2020.3.2.communityspring boot : 2.6.1 src/main/resources/application.ymlsrc/main/resources/templates/...html 회원 가입 시 저장할 유저 정보 객체를 만든다.
velog.io
Spring Security어렵네