인증(Authentication), 권한(Authorize) 부여 및 보호 기능을 제공하는 프레임워크(Java / Java EE) - 인증 : 해당 사용자가 본인이 맞는지를 확인하는 절차 - 인가 : 인증된 사용자가 요청된 자원에 접근 가능한가를 결정하는 절차
인증(Authentication) 방식
1. Principal-Credential 방식 : username, password를 이용하는 방식 2. 이중 인증(two factor 인증) : 사용자가 입력한 개인정보를 인증 후, 다른 인증 체계(ex: 물리적인 카드 등)를 이용해 두가지의 조합으로 인증하는 방식 3. 하드웨어 인증 : 자동차 키와 같은 방식
* Spring Security는 Principal-Credential 기반의 인증을 사용 - Principal : 아이디(Username) - Credential : 비밀번호(Password)
*Principal-Credential 기반의 인증을 통해서 특정 자원에 대한 접근을 제어하기 위한 권한을 가짐 * 특정 권한을 얻기 위해서 유저는 인증정보(Authentication)가 필요하고 관리자는 해당 정보를 참고해 권한을 인가(Authorization)함
구성 요소
1. SecurityContext - 인증된 사용자 정보를 저장하고 접근할 수 있는 Context(사용자 정보와 권한을 참조할 때 사용) - Authentication 객체를 꺼내올 수 있음 2. AuthenticationManager - 인증을 처리하는 주요 인터페이스 - 다양한 인증 제공자(Authentication Provider)를 사용할 수 있도록 구성 3. AuthenticationProvider - 실제 인증 논리를 구현한 컴포넌트 - 여러 개의 AuthenticationProvider를 구성해 다양한 인증 방식을 지원 가능 4. UserDetailsService - 사용자 정보를 로드하는 인터페이스 - 데이터베이스나 다른 외부 시스템에서 사용자 정보를 가져옴(DB의 사용자 정보를 조회) 5. GrantedAuthority - 사용자가 가지고 있는 권한을 나타내는 객체(ex : ROLE_USER, ROLE_ADMIN) 6. SecurityFilterChain - HTTP 요청에 대해 필터링을 적용해 보안을 강화 - 인증(Authentication)과 권한 부여(Authorization)를 처리하는 여러 필터를 포함
주요 기능
1. 폼 기반 인증(Form-based Authentication) - 로그인 페이지를 통해 사용자의 아이디와 비밀번호를 입력받아 인증 2. HTTP Basic/Digest 인증 - HTTP 헤더를 사용해 간단한 인증을 수행(RESTful API)에서 많이 사용 3. OAuth2 및 OpenID Connect - 소셜 로그인이나 타사 인증 제공자, 즉 제3자를 통해 인증을 처리(Spring Security OAuth2 모듈) 4. 메서드 수준 보안 - 어노테이션을 사용해 특정 메소드에 대한 접근 권한을 제어(@PreAuthorize,@Secured 등) 5. CSRF(Cross Site Request Forgery : 크로스 사이트 요청 위조) 보호 - 크로스 사이트 요청 위조 공격을 방지하는 기능을 제공(기본적으로 활성화 되어있음) 6. 세션 관리 - 세션 고정 공격(Session Fixation)을 방직하고, 세션 타임아웃 등을 설정할 수 있음
설정 방법
1. XML 설정 - XML 파일을 사용해 보안 설정을 구성 - 유연한 설정이 가능하지만, 최근에는 잘 사용되지 않음
2. Java Configuration - Java 기반 설정을 사용해 보안 설정을 구성 - '@EnableWebSecurity' 어노테이션과 'WebSecurityConfigurerAdapter' 클래스를 사용해 설정
3. AuthenticationManager에게 인증 객체 전달 - Filter는 AuthenticationManager에게 인증 객체(토큰)를 전달 3-1. 인증을 위해 AuthenticationProvider에게 인증 객체 전달 - 토큰이 올바른 유저인지 확인 3-2. 전달받은 인증 객체의 정보를 UserDetailService에 전달
4. UserDetails 구현 객체 생성 - UserDetailsService는 전달받은 사용자 정보를 통해 DB에서 알맞은 사용자를 찾고, 이를 기반으로 UserDetails를 구현한 객체를 반환 4-1. UserDetails 객체를 AuthenticationProvider에 전달
5. ProviderManager에게 권한을 담은 검증된 인증 객체를 전달 - Authentication은 전달받은 UserDetails를 인증해 성공하면 ProviderManager에게 권한을 부여한 검증된 인증 객체를 생성 및 전달(주로 비밀번호 검증 / 성공하면 Authentication 객체 생성) 5-1. 검증된 인증 객체를 AuthenticationFilter에게 전달
6. 검증된 인증 객체를 SecurityContextHolder의 SecurityContext에 저장 - Filter가 UserDetails 정보를 SecurityContextHolder에 저장
[SecurityContextHolder, SecurityContext, Authentication 모듈] - 인증에 성공하면 Principal과 Credential 정보를 Authentication에 담음 - Spring Security에서 Authentication을 SpringContext에 보관 - SpringContext를 SecurityContextHolder에 담아 보관
- Axios는 기본적으로 헤더의 타입은 `application/json`설정 - Html 폼(form) 데이터를 전송해야하는 경우 `application/x-www-form-urlencoded` 로 설정 - 파일 업로드를 위한 Html 폼(form) 데이터를 전송할 경우 `multipart/form-data`로 설정
인증(Authentication), 권한(Authorize) 부여 및 보호 기능을 제공하는 프레임워크(Java / Java EE) - 인증 : 해당 사용자가 본인이 맞는지를 확인하는 절차 - 인가 : 인증된 사용자가 요청된 자원에 접근 가능한가를 결정하는 절차
인증(Authentication) 방식
1. Principal-Credential 방식 : username, password를 이용하는 방식 2. 이중 인증(two factor 인증) : 사용자가 입력한 개인정보를 인증 후, 다른 인증 체계(ex: 물리적인 카드 등)를 이용해 두가지의 조합으로 인증하는 방식 3. 하드웨어 인증 : 자동차 키와 같은 방식
* Spring Security는 Principal-Credential 기반의 인증을 사용 - Principal : 아이디(Username) - Credential : 비밀번호(Password)
*Principal-Credential 기반의 인증을 통해서 특정 자원에 대한 접근을 제어하기 위한 권한을 가짐 * 특정 권한을 얻기 위해서 유저는 인증정보(Authentication)가 필요하고 관리자는 해당 정보를 참고해 권한을 인가(Authorization)함
구성 요소
1. SecurityContext - 인증된 사용자 정보를 저장하고 접근할 수 있는 Context(사용자 정보와 권한을 참조할 때 사용) - Authentication 객체를 꺼내올 수 있음 2. AuthenticationManager - 인증을 처리하는 주요 인터페이스 - 다양한 인증 제공자(Authentication Provider)를 사용할 수 있도록 구성 3. AuthenticationProvider - 실제 인증 논리를 구현한 컴포넌트 - 여러 개의 AuthenticationProvider를 구성해 다양한 인증 방식을 지원 가능 4. UserDetailsService - 사용자 정보를 로드하는 인터페이스 - 데이터베이스나 다른 외부 시스템에서 사용자 정보를 가져옴(DB의 사용자 정보를 조회) 5. GrantedAuthority - 사용자가 가지고 있는 권한을 나타내는 객체(ex : ROLE_USER, ROLE_ADMIN) 6. SecurityFilterChain - HTTP 요청에 대해 필터링을 적용해 보안을 강화 - 인증(Authentication)과 권한 부여(Authorization)를 처리하는 여러 필터를 포함
주요 기능
1. 폼 기반 인증(Form-based Authentication) - 로그인 페이지를 통해 사용자의 아이디와 비밀번호를 입력받아 인증 2. HTTP Basic/Digest 인증 - HTTP 헤더를 사용해 간단한 인증을 수행(RESTful API)에서 많이 사용 3. OAuth2 및 OpenID Connect - 소셜 로그인이나 타사 인증 제공자, 즉 제3자를 통해 인증을 처리(Spring Security OAuth2 모듈) 4. 메서드 수준 보안 - 어노테이션을 사용해 특정 메소드에 대한 접근 권한을 제어(@PreAuthorize,@Secured 등) 5. CSRF(Cross Site Request Forgery : 크로스 사이트 요청 위조) 보호 - 크로스 사이트 요청 위조 공격을 방지하는 기능을 제공(기본적으로 활성화 되어있음) 6. 세션 관리 - 세션 고정 공격(Session Fixation)을 방직하고, 세션 타임아웃 등을 설정할 수 있음
설정 방법
1. XML 설정 - XML 파일을 사용해 보안 설정을 구성 - 유연한 설정이 가능하지만, 최근에는 잘 사용되지 않음
2. Java Configuration - Java 기반 설정을 사용해 보안 설정을 구성 - '@EnableWebSecurity' 어노테이션과 'WebSecurityConfigurerAdapter' 클래스를 사용해 설정
3. AuthenticationManager에게 인증 객체 전달 - Filter는 AuthenticationManager에게 인증 객체(토큰)를 전달 3-1. 인증을 위해 AuthenticationProvider에게 인증 객체 전달 - 토큰이 올바른 유저인지 확인 3-2. 전달받은 인증 객체의 정보를 UserDetailService에 전달
4. UserDetails 구현 객체 생성 - UserDetailsService는 전달받은 사용자 정보를 통해 DB에서 알맞은 사용자를 찾고, 이를 기반으로 UserDetails를 구현한 객체를 반환 4-1. UserDetails 객체를 AuthenticationProvider에 전달
5. ProviderManager에게 권한을 담은 검증된 인증 객체를 전달 - Authentication은 전달받은 UserDetails를 인증해 성공하면 ProviderManager에게 권한을 부여한 검증된 인증 객체를 생성 및 전달(주로 비밀번호 검증 / 성공하면 Authentication 객체 생성) 5-1. 검증된 인증 객체를 AuthenticationFilter에게 전달
6. 검증된 인증 객체를 SecurityContextHolder의 SecurityContext에 저장 - Filter가 UserDetails 정보를 SecurityContextHolder에 저장
[SecurityContextHolder, SecurityContext, Authentication 모듈] - 인증에 성공하면 Principal과 Credential 정보를 Authentication에 담음 - Spring Security에서 Authentication을 SpringContext에 보관 - SpringContext를 SecurityContextHolder에 담아 보관
- Axios는 기본적으로 헤더의 타입은 `application/json`설정 - Html 폼(form) 데이터를 전송해야하는 경우 `application/x-www-form-urlencoded` 로 설정 - 파일 업로드를 위한 Html 폼(form) 데이터를 전송할 경우 `multipart/form-data`로 설정