[Security] 스프링 시큐리티(Spring Security) 살펴보기
스프링 시큐리티(Security)란?
스프링 프레임워크에서 액세스 토큰을 제공하고 인증 및 인가에 대한 설정을 할 수 있도록 제공하는 어플리케이션이다.
시큐리티를 통하여 스프링에서의 로그인 기능, 권한 설정, 보안 등에 대하여 설정하고 구현할 수 있다.
1. 의존성 추가
build.gradle에 다음 의존성을 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-security'
이를 통하여 시큐리티에서 제공하는 기능들을 사용할 수 있다.
2. 구현 가능 기능
그렇다면 스프링 시큐리티에서 제공하는 기능들은 무엇이 있을까?
- Authentication Filter
Authentication(인증)과 관련된 필터를 직접 설정할 수 있다.
필터를 통하여 클라이언트의 요청에 대하여 권한을 확인할 수 있다.
- Security Configuration
configuration에 인증에 대한 필터 설정, 인증 및 인가에 대한 예외 핸들링 지정, 보안 적용 등을 설정한다.
요청과 응답에 대한 HttpSecurity 객체가 Authentication Filter와 같은 필터의 적용 대상이다.
( 이 때 보안 설정에 대한 WebSecurity 객체와는 구분을 해두자! )
- Token Provider
token에 대한 기능들을 구현할 클래스를 만든다.
token에 대한 Claim 객체 설정, token의 정보만 가져오는 메소드, token의 유효성을 확인하는 메소드 등을 구현한다.
2-1. JWT 형식의 토큰 발급
일반적으로 token에 대하여 JWT(Json Web Token)을 사용한다.
JWT의 구조
- header : 가장 앞부분으로, 토큰의 타입, 어떤 알고리즘이 적용되었는지등에 대한 내용이 저장된다.
- payload : 토큰에 대한 속성 정보가 저장된다. (ex. 토큰의 만료시간, 토큰의 주인 이름 등) Claims의 Body 부분에 해당된다. 접근성이 매우 높기 때문에 비밀번호와 같은 민감한 개인정보를 저장하면 안 된다.
- signature : 토큰의 유효성 검증 부분을 담당한다.
JWT의 형식의 토큰을 통하여 관리를 한다.
로그인을 하면 토큰을 발급받고, 이 토큰에 대하여 유효성을 검증하며 접근에 대한 허용을 한다.
3. 시큐리티에서의 에러 처리
시큐리티에서 예외가 일어난다면 두 가지가 존재한다.
- AuthenticatinoEntryPoint
Authentication(인증)에 대한 예외를 처리하는 클래스다. 직접 commence 메소드를 오버라이딩하여(재정의) 인증에 대한 에러의 응답에 대하여 설정할 수 있다.
- AccessDeniedHandler
Authorization(인가)에 대한 예외를 처리하는 클래스다. 직접 handle 메소드를 오버라이딩하여(재정의) 인가에 대한 에러의 응답에 대하여 설정할 수 있다.
일반적으로 인증오류의 경우 HttpStatus 401 값을 사용하며, 인증은 성공했으나, 인가의 오류 같은 경우엔느 403 값을 사용한다.
각각의 에러 처리 class를 추가하면 Configuration에 HttpSecurity 클래스에 대하여 각각의 핸들링 클래스를 설정하여,
인증과 인가 에러에 대한 핸들링을 지정한다.
이러한 흐름으로 프로젝트 전반적인 인증 및 인가에 대한 필터와 예외를 처리한다.