티스토리 뷰

Security/Spring

Spring Security Summary

SalaYH 2023. 4. 16. 23:48
반응형

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 인증절차

  1. 사용자가 웹 사이트에 있는 보호된 자원에 접근을 시도
  2. 사용자는 웹 브라우저를 통해 CAS 서비스에서 CAS 서버로 리다이렉트 되어 로그인을 요청
  3. 사용자는 자격증명(ID, Password)를 제시
  4. 사용자의 자격증명이 유효한 경우, 서비스티켓(사용자 인증 위한 일회용 토큰)과 함께 보호된 자원으로 리다이렉트
  5. CAS 서비스는 서비스 티켓의 유효성과 만료기간 등을 검증
  6. 티켓이 유효한 경우 신뢰관계를 형성 및 사용자는 정상적인 권한부여 체크를 진행

CAS 사용 시 로그아웃

로그아웃 처리 시 CAS 서버에서는 여전히 로그인 상태로 되어 있기 때문에 로그아웃을 요청해야 함

 

CAS 로그아웃 절차

  1. 사용자가 로그아웃을 요청
  2. 웹 애플리케이션은 브라우저를 통해 CAS 서버로 리다이렉트 하여 CAS에서 로그아웃되도록 요청
  3. CAS 서버가 CAS 서비스에 로그아웃을 요청
  4. 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