프로그래밍 공부/Spring

Spring Security란?

Wonuk 2022. 1. 19. 17:52
반응형

Spring Security란?

'인증'과 '인가'를 제공하는것에 초점을 맞춘 프레임워크 입니다.

 

이전 포스팅 링크

https://wonuk.tistory.com/154?category=1025481

 

인증(Authentication)과 인가(Authorization)란 무엇인가?

용어정리 '인증'이란? 식별가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정입니다. 예) 출입증으로 건물에 출입 할 수 있습니다. '인가'란? 인증된 사용자에 대한 자원 접근 권한 확

wonuk.tistory.com

https://wonuk.tistory.com/155?category=1025481

 

쿠키(Cookie), 세션(Session), 토큰(Token)

용어 간단정리 인증 : 나는 누구인가 인가 : 나의 권한은 어디까지인가 https://wonuk.tistory.com/154 인증(Authentication)과 인가(Authorization)란 무엇인가? 용어정리 '인증'이란? 식별가능한 정보로 서비스..

wonuk.tistory.com


Spring Security 특징

1. 서블릿 API 통합

 

2. Spring Web MVC와의 선택적 통합

 

3. 인증과 권한 부여를 모두 포괄적이고 확장 가능한 지원

 

4. 세션 고정, clickjacking, 사이트 간 요청 위조 등과 같은 공격으로부터 보호

세션 고정
사용자 로그인 시 항상 일정하게 고정된 세션 ID값을 사용하는 취약점
Clickjacking
사용자가 클릭하고 있다고 인지하는 것과
다른 어떤 것을 클릭하게 속이는 악의적인 기법
사이트 간 요청 위조
csrf라고 부르며 사용자가 자신의 의지와는 무관하게
공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격 기법

한마디로 정리하자면,

웹 인증과 인가를 편하게 구현하기 위한 특징들입니다.


Spring Security의 요청 처리방법

 

스프링 시큐리티는 서블릿필터 체인을 자동으로 구성하고

요청을 거치게 합니다.

 

기본적으로 사용하는 필터들이 많이 있습니다.

그래서 우리는 필요한 필터들 만을 그 안에서 사용합니다.


로그인 인증 구조

 

1. 유저가 로그인을 시도하여 HTTP 요청이 들어옵니다.

 

2. AuthenticationFilter가 http 서블릿 리퀘스트에서

   사용자가 보낸 정보를 인터셉트 합니다.

   이를 인증을 담당할 AuthenticationManager 인터페이스에게

   인증용 객체인 유저네임 패스워드 Authentication 토큰을 만들어서

   위임을 하게됩니다.

 

AuthenticationManager가 어떻게 흘러가는지 자세히 알아봅시다.

AbstractAuthentication 프로세싱 필터는

웹 기반 인증요청에서 사용되는 컴포넌트 입니다. 

아이디 비밀번호로 되어있는 Post Form 데이터를 포함한

요청을 처리하게 됩니다.

 

사용자 비밀번호를 다른 필터로 전달하기 위해서

Authentication 객체를 생성하고 일부 프로퍼티를 설정합니다.

이후 Authentication 매니저로 보내 주게됩니다.

 

여기서 인증 요청을 받고 Authentication에 들어갈

사용자 이름 등과 같은 정보들로 내용을 채웁니다.

 

Authentication Provider에서 실제 인증이 일어나게 됩니다.

인증이 성공하면 Authentication이 '됐다'라는 것을 증명합니다.

실패를 하게되면 Authentication Exception을 발생하게 됩니다.

 

다시 이어서

실제로 인증할 Authentication Provider에게

Authentication 객첼르 전달합니다.

 

이후 UserDetailsService에 가서 이 Authentication을 가지고

DB에 있는 유저임을 알게 된다면

UserDetails라는 객체로 꺼내서 유저 세션을 생성하게 됩니다.

 

여기서 나온 유저 디테일들을 스프링 시큐리티의

인메모리 세션 저장소인 시큐리티컨텍스트 폴더에 저장하고

유저 세션 ID와 함께 응답을 보내게 됩니다.

 

이후에 요청 쿠키에서 JSESSION ID를 검증후

JSESSION ID가 유효하다면 인증을 하게 됩니다.


시큐리티의 주요 필터

SecurityContextPersistenceFilter

 - SecurityContextRepository를 통해 SecurityContext를 Load / Save 처리

 

LogoutFilter

 - 로그아웃 URL(기본값: /logout)로의 요청을 감시하여 해당 사용자를 로그아웃 시킴

 

UsernamePasswordAuthenticationFilter

- ID/PW 기반 Form 인증 요청 URL(기본값: /login)을 감시하여 사용자를 인증함

 

ExceptionTransiationFilter

 - 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달

   Exception Handler와 비슷한 역할입니다.

 

FilterSecurityInterceptor

- 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임

  이 필터가 실행되는 시점에는 사용자가 인증됐다고 판단


스프링 시큐리티 사용방법

1. xml

검색을 하다보면 이러한 xml파일을 작성하는것을 볼 수 있습니다.

하지만 스프링 프레임워크 3.2에서 어노테이션을 통한 자바 설정을 지원하기 때문에

스프링 시큐리티 3.2부터는 xml 설정을 하지 않고 

 

2. JAVA annotation

이렇게 간단하게 자바 기반으로 설정할 수 있습니다.

 

 

WebSecurityConfigAdapter의 구현체인

SecurityConfig

@Configuration : 어노테이션 기반 환경구성

 

@EnableWebSecurity : 시큐리티를 사용할 수 있도록 설정

 

@EnableGlobalMethodSecurity(

    securedEnabled = true,                   @Secured

    jsr250Enabled = true,                     @RolesAllowd

    prePostEnabled = true                    @PreAuthorize, @PostAuthorize

)

: 해당 어노테이션을 통해 우측의 @Secured, @RolesAllowd, @PreAuthorize, @PostAuthorize

어노테이션을 컨트롤러에서 사용을 할 수 있게 만들어줍니다.

이때 이와 같이 인증을 설정해주는 어노테이션들 입니다.

 

그리고 클래스 안에서 필요한 필터들을 생성해주지만

양이 많아서 // 필요한 Bean(Filter들) 생성 으로 대체하였습니다.

 

@Override

public void configure(~~){~~}

Configure 메소드를 오버라이드해서 어떤 유저 DTO Service를 사용할지,

어떤 패스워드 인코더를 사용할지 명시를 해주고

 

@Override

public AuthenticationManager(~~)[~~]

어떤 Authentication 매니저를 사용할지 명시합니다.

 

@Override

protected void configure(~~){~~}

이 메소드에서 많은 것을 설정하게 됩니다.

.cors() -> cors 허용

 

.sessionManagement() -> sessionManagement 정책 설정

 

.csrf() -> csrf 방지

 

.formLogin() -> 폼기반 로그인 인증

 

.httpBasic() -> http 기반 인증

 

.exceptionHandling() -> ExceptionHandler 설정

(authenticationEntryPoint로 설정)

 

.authorizeRequests() -> 어떤 URI에 어떤 인증을 거치는지 명시

permitAll -> 인증없이 허용

hasRole("ADMIN") -> 사용자 권한 확인 후 인가

userInfoEndpoint() -> userService로 설정

success or failure Handler -> 성공, 실패 핸들링을 파라미터 안의 클래스로 설정

 

요청을 처리하기 전에 어떤 필터를 거치는지 설정하는데

tokenAuthenticationFilter만 알아보겠습니다.

doFilterInternal 메소드

if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt))

-> 요청에 토큰이 있고 토큰이 유효하다면 토큰을 통해

    유저의 정보를 불러와서 인증을 채우게 됩니다.

앞서 보았던 AuthenticationManager 역할의 일부입니다.


출처

테코톡 - Spring Security

 

https://www.youtube.com/watch?v=aEk-7RjBKwQ&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=105

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형