티스토리 뷰
반응형
Spring Security
- WebSecurityConfigureAdapter를 상속받은 Config 클래스에 @EnableWebSecurity 어노테이션을 연결하면 SpringSecurityFilterChain이 자동으로 포함됨
#../configuration/SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
}
- WebSecurityConfigureAdapter 클래스는 Spring Security의 웹 보안 기능의 초기화 및 설정을 담당
- HttpSecurity 클래스는 인증 및 인가 설정을 제공
- WebSecurityConfigureAdapter 클래스를 상속하는 Config 클래스에서 configure(HttpSecurity http) 메서드를 오버라이드하여 보안설정을 구현함
- URL 경로에 따른 권한설정 가능 (.antMatcher() 순차 고려되기 때문에 작성 순서가 중요함)
#SecurityConfig.java
...
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequrests()
.formLogin()
.loginPage("/login/form")
.loginProcessingUrl("/login")
.failureUrl("/login/form?error")
.usernameParameter("username")
.passwordParameter("password")
.defualtSucessUrl("/main")
.logout()
.logoutUrl("/logout")
.logoutSucessUrl("/login?logout")
.antMatchers("/resources/**").permitAll()
.antMatchers("/login/*").permitAll()
.antMatchers("/").hasAnyRole("ANONYMOUS", "ROLE_USER")
.antMatchers("/admin/**").hasRole("ROLE_ADMIN")
.antMatchers("/**").has AnyRole("ROLE_USER", "ROLE_ADMIN")
}
사용자 정보 확인
- SecurityContextHolder를 사용하여 현재 로그인한 사용자에 대한 정보를 확인
...
SecurityContext context = SecurityContextHolder.getContext();
Authentication authN = context.getAuthentication();
if (authN != null){
username = authN.getName();
}
...
- AuthenticationProvider 객체에 원한을 위임해 사용자의 인증여부를 결정
#UserAuthenticationProvider.java
...
@Component
public class UserAuthenticationProvider implements AuthetnicationProvider {
...
public Authentication authenticate( Authentication authentication) throw AuthenticationException {
UserAuthToken token = (UserAuthToken) authentication;
String username = token.getName();
UserInfo user = null;
if(username != null){
user = UserService.findUserbyName(username);
}
...
}
}
#SecurityConfig.java
...
@Authowired
UserAuthenticationProvider authProvider;
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider);
}
SecurityContextHolder | - 사용자 인증방법 중 가장 쉬운 방법 - 새롭게 생성된 사용자를 인증하거나 비정상적인 방식으로 인증을 시도할 때 잘 작동 |
UserDetailsService | - 사용자 정의 UserDetailsService 객체를 생성하는 것은 스프링 시큐리티가 사용자 정의 도메인 모델에 기반한 보안결정을 내릴 수 있게 해주는 쉬운 매커니즘 - 사용자명과 패스워드를 기반으로 인증을 하지 않는 경우에는 작동하지 않음 |
AuthenticationProvider | - 개발자가 원하는 매개변수를 이용해 인증가능함 |
CAS (Central Authentication Service)
- 오픈소스 SSO 서버로 중앙 집중식 접근제어 및 조직 내 웹 기반 자원에 대한 인증기능을 제공
CAS 인증절차
- 사용자가 웹 사이트에 있는 보호된 자원에 접근을 시도
- 사용자는 웹 브라우저를 통해 CAS 서비스에서 CAS 서버로 리다이렉트 되어 로그인을 요청
- 사용자는 자격증명(ID, Password)를 제시
- 사용자의 자격증명이 유효한 경우, 서비스티켓(사용자 인증 위한 일회용 토큰)과 함께 보호된 자원으로 리다이렉트
- CAS 서비스는 서비스 티켓의 유효성과 만료기간 등을 검증
- 티켓이 유효한 경우 신뢰관계를 형성 및 사용자는 정상적인 권한부여 체크를 진행
CAS 사용 시 로그아웃
로그아웃 처리 시 CAS 서버에서는 여전히 로그인 상태로 되어 있기 때문에 로그아웃을 요청해야 함
CAS 로그아웃 절차
- 사용자가 로그아웃을 요청
- 웹 애플리케이션은 브라우저를 통해 CAS 서버로 리다이렉트 하여 CAS에서 로그아웃되도록 요청
- CAS 서버가 CAS 서비스에 로그아웃을 요청
- CAS 서버는 사용자에게 로그아웃을 확인해줌
페이지 수준 권한부여
- 특정 사용자의 요청 컨텍스트를 기반으로 애플리케이션 기능을 사용
- 미세 권한부여는 일반적으로 페이지의 특정 부분을 선택적으로 허용
- MVC 애플리ㅣ케이션의 컨트롤러 계층에서 사용자 권한을 확인하연 컨트롤러가 접근결정을 내리고, 결정 결과를 뷰에 제공된 모델 데이터에 바인딩
@PreAuthorize("hasRole('ROLE_ADMIN')") @RequestMapping("/admin") ... |
- 어노테이션 추가를 통해 메서드 단위로 비즈니스 계층에서의 접근허용 처리 - 메서드 대신 클래스에 적용할 경우, 비즈니스에서 전체 클래스에 대한 보안정책을 정의 가능 |
@RoleAllowed({"ROLE_USER", "ROLE_ADMIN"}) @RequestMapping("/main") ... |
- JSR-250 공통 어노테이션 사용 |
@Secured("ROLE_ADMIN") @RequestMapping("/admin") ... |
- 외부 의존성이 필요하지 않으며, @RoleAllowed와 동일 기능 제공 |
사용자 정의 권한부여
- FilterSecurityInterceptor 서블릿 필터를 제공하여 특정 요청의 수락여부를 결정
- 서블릿 필터가 호출되면 시스템은 유효한 사용자가 로그인되었다고 판단함
- getAuthroities() 메서드를 통해 특정 요청의 허용여부를 판별
- 권한부여 과정은 사용자가 보안자원에 접근할 수 있는지 여부를 결정하는 과정
...
private boolean hasPermission(Authentication auth, Event event, Object permission) {
boolean bResult = false;
...
GrantedAuthority adminRole = new SimpleGrantedAuthority("ROLE_ADMIN");
if(auth.getAuthorities().contains(adminRole)) {
bResult = true;
}
...
return bResult;
}
...
반응형
'Security > Spring' 카테고리의 다른 글
Spring Security 보호기능 (0) | 2023.04.17 |
---|---|
SpringBoot 기초 (0) | 2020.05.08 |
SpringBoot 소스진단 시 검색 키워드 (0) | 2020.05.04 |
댓글
반응형
최근에 올라온 글
- Total
- Today
- Yesterday