[Spring Security] Authentication and Authorization

in·2023년 9월 13일
0

Spring

목록 보기
7/7

Spring Security

Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임 워크
➡️ 인증과 권한에 대한 부분을 Filter 흐름에 따라 처리(보안 처리를 자체적으로 구현하지 않아도 필요한 기능 쉽게 구현 가능)

✔️ 인증(Authenticate)
해당 사용자가 본인이 맞는지 확인하는 절차
ex.로그인

✔️ 인가(Authorize)
인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차


➡️ 스프링의 DispatcherServlet 앞단에 Filter 형태로 위치
Dispatcher로 넘어가기 전에 Filter가 요청을 가로채서 클라이언트의 리소스 접근 권한을 확인하고 없는 경우 인증 요청 화면으로 자동 redirect

특징

  • Filter 기반 동작
    ➡️ Spring MVC와 분리되어 관리하고 동작
  • Bean으로 설정 가능
  • 세선, 쿠키 방식으로 인증
  • 인증 관리자는 UsernamePasswordAuthenticationFilter, 접근 결정 관리자는 FilterSecurituInterceptor가 수행

Spring Security Filter

➡️ UsernamePasswordAuthenticationFilter : 클라이언트가 리소스레 대한 접근 권한이 없을 때 처리를 담당하는 필터

API 인증 및 권한 부여를 위한 작업 순서

  1. 회원가입, 로그인 API 구현
  2. 리소스 접근 가능한 ROLE_USER 권한을 가입 회원에게 부여
  3. Spring Security 설정에서 ROLE_USER 권한을 가지먄 접근 가능하도록 세팅
  4. 권한이 있는 회원이 로그인 성공하면 리소스 접근 가능한 JWT 토큰 발급
  5. 해당 회원은 권한이 필요한 API 접귽 시 JWT 보안 토큰을 사용
    ➡️ 접근 제한이 필요한 API에는 보안 토큰을 통해서 이 유저가 권한이 있는지 여부를 Spring Security를 통해 체크하고 리소스를 요청할 수 있도록 구성

Spring Security Configuration

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .httpBasic().disable() // rest api 이므로 기본설정 사용안함. 기본설정은 비인증시 로그인폼 화면으로 리다이렉트
                .cors().configurationSource(corsConfigurationSource())
                .and()
                .csrf().disable() // rest api이므로 csrf 보안이 필요없으므로 disable처리.
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // jwt token으로 인증하므로 세션은 필요없으므로 생성안함.
                .and()
                .authorizeRequests() // 다음 리퀘스트에 대한 사용권한 체크
                .antMatchers("/*/signin", "/*/signin/**", "/*/signup", "/*/signup/**", "/social/**").permitAll() // 가입 및 인증 주소는 누구나 접근가능
                .antMatchers(HttpMethod.GET, "home/**").permitAll() // home으로 시작하는 GET요청 리소스는 누구나 접근가능
                .anyRequest().hasRole("USER") // 그외 나머지 요청은 모두 인증된 회원만 접근 가능
                .and()
                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class); // jwt token 필터를 id/password 인증 필터 전에 넣는다

    }

✔️ CSRF(Cross Site Request Forgrey)
웹 사이트 취약점 공격 방지를 위햐 사용하는 기술
스프링 시큐리티가 CSRF 토큰 값을 세션을 통해 발행하고 웹 페이지에서는 폼 전송시 해당 토큰을 함께 전송하여 실제 웹 페이지에서 작성된 데이터가 전달되는지를 검증하는 기술

[참고 자료]

🔗링크
🔗링크
🔗링크

0개의 댓글

Powered by GraphCDN, the GraphQL CDN