Spring Boot(5) - Spring Security
1. 인증과 인가
1-1. 인증
- 식별된 사용자를 확인하는 과정
- 사용자가 제공한 자격증명을 활용
1-2. 인증 타입
- Type 1: 지식 기반(알고 있는 것)
- Type 2: 소유 기반(가지고 있는 것)
- Type 3: 특징 기반(생물학적 특징, 필기체 서명 등)
1-3. 2-factor 인증
- 다중 인증이라고도 함
- 2개 이상의 인증 타입을 활용하는 것
1-4. 인가
- 권한부여라고도 함
- 권한을 확인하는 과정
- 인증된 사용자의 행위에 대한 수행 가능 여부 판단
- 역할 지정 방식을 주로 사용 -> RBAC(Role-based Access Control)
2. 접근 통제
2-1. 정의
- 중요 정보 자산을 보호하기 위한 방법
- 보안의 3요소
- 암호화는 접근 통제가 깨진 경우를 대응하는 방법임
2-2. 계층
2-2-1. 화면
- 1계층
- 권한이 있는 사용자에게 특정 기능이 보이도록 함
- 관리자 페이지 버튼 등
2-2-2. 기능
- 2계층
- 화면에 보이지 않더라도 직접 호출 시 기능 사용이 가능할 수 있음
- 요청한 사용자의 권한을 확인하는 절차를 도입해야 함
2-2-3. 데이터
- 3계층
- 데이터 제공 전에 데이터에 대한 접근 권한 및 접근 가능한 데이터 범위를 확인
- 보이지 않는 게시글 접근, 타인의 결제 내역 접근 등이 3계층 통제에 실패한 것
3. Spring Security 적용하기
3-1. 설치하기
- spring-boot-starter-security 의존성으로 사용 가능
- 일단 설치하면 모든 요청이 기본 로그인 페이지로 리다이렉트 됨
- 기본 설정 PW는 로그 레벨을 info로 해서 확인 가능
3-2. 설정 클래스 사용하기
- SecurityFilterChain 등을 설정
- 로그인 페이지에 직접 접근할 수 없어지므로, 커스텀 로그인 구현이 필요
3-3. 커스텀 로그인
- 로그인을 위한 Controller를 정의해서 구현 가능
- 로그인 View를 만들고, SecurityFilterChain에 연결
- 모든 페이지가 커스텀 로그인 페이지로 리다이렉트 됨
3-4. 추가 설정
3-4-1. 보안 설정
3-4-2. Hash
- 지정된 길이만큼의 유일한 값을 결과로 제공
- Message Digest라고 함
- 키의 길이를 늘림으로써 복호화 난이도를 올릴 수 있음
- 암호화 시스템에서 적용 가능 -> 비밀번호 암호화 등
3-4-3. Hash 보안 위협 대응
- 해시 크래킹 기법
- 해시 값을 이용해서 원문을 찾는 방법
- 동일 해시 알고리즘에 값을 넣으면서 원문 유추
- 공격 방법
- 해시 크래킹 대응
- 원문 복잡도 늘리기
- 해시 다중 수행
- 솔트 적용
4. Spring Security 응용
4-1. BCryptPasswordEncoder 의존성
- Spring Security에서 제공하는 패스워드 암호화 도구
- 평문 패스워드 해시를 DB에 저장하고, 로그인 시 입력 패스워드와 해시된 패스워드를 비교
4-2. 회원가입
- SecurityConfiguration에 BCryptPasswordEncoder을 Bean으로 등록
- 사용자 저장을 위한 엔티티, DTO 등을 설정
- Service 레이어 등을 설정하고, 필요하다면 Role 지정 로직 추가
- 가입 화면, 컨트롤러 등을 생성
4-3. 리다이렉션
- SecurityFilterChain에 경로 지정
- AuthenticationSuccessHandler를 상속해서 CustonAuthenticationSuccessHandler을 만들어주기
4-4. CSRF
- Spring Security에서 CSRF 공격 방어를 위한 절차를 자동으로 수행
- CSRF 비활성화 시 방어 절차를 생략 -> 선행 페이지를 사용하지 않고 API 호출 테스트 가능