728x90
반응형
Spring Security
Architecture
Spring Security란? | 인증(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' 클래스를 사용해 설정 |
|
처리 과정 | 1. 로그인 요청(HTTP 요청) 2. UserPasswordAuthenticatioToken 발급 - Filter는 HttpServletRequest에서 Principal과 Credential을 추출해 토근을 발급 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에 담아 보관 |
🔥ISSUE🔥
1. Spring Security 기본 변수명
더보기
Spring Security에서 .formLogin 설정을 따로 하지 않으면, default로 username, password로 변수명이 설정됨
-> 그렇기 때문에 변수명을 username, password로 맞추거나 아래와 같이 설정해줄 수 있음
2. Axios를 통한 서버로 데이터 전송간의 문제 발생
더보기
적절한 Content-Type을 설정해 데이터 전송 오류를 줄일 수 있음
- Axios는 기본적으로 헤더의 타입은 `application/json`설정
- Html 폼(form) 데이터를 전송해야하는 경우 `application/x-www-form-urlencoded` 로 설정
- 파일 업로드를 위한 Html 폼(form) 데이터를 전송할 경우 `multipart/form-data`로 설정
728x90
반응형
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 97(CS 면접 복습) (0) | 2024.06.27 |
---|---|
크래프톤 정글 5기 TIL - Day 96(CS 면접 복습) (0) | 2024.06.25 |
크래프톤 정글 5기 TIL - Day 71 ~83(Virtual Memory) (0) | 2024.06.03 |
크래프톤 정글 5기 TIL - Day 70 (0) | 2024.05.30 |
크래프톤 정글 5기 TIL - Day 67~69(Pintos Project 2) (0) | 2024.05.28 |