Spring Security란?
Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization or 권한부여)기능을 지원하는 보안 프레임워크
Spring Security로 할 수 있는 보안 강화기능
1. 다양한 유형(폼 로그인 인증, 토큰 기반 인증, OAuth2 기반 인증, LDAP 인증)의 사용자 인증 기능 적용
2. 애플리케이션 사용자의 역할(Role)에 따른 권한레벨 적용
3. 애플리케이션에서 제공하는 리소스에 대한 접근 제어
4. 민감한 정보에 대한 데이터 암호화
5. SSL적용
6. 일반적으로 알려진 웹 보안공격 차단
Principal(주체)
프로세스가 성공적으로 수행된 사용자의 계정 정보
작업을 수행할 수 있는 사용자, 또는 디바이스, 시스템등
Authentication(인증)
사용자가 본인이 맞음을 증명하는 절차
Credential(신원증명정보)가 필요함 - 사용자를 식별하기 위한 정보 : 주민등록증,패스워드
Authorization(인가, 권한부여)
Authentication(인증)이 정상적으로 수행된 사용자에게 하나 이상의 권한(authority)을 부여하여
특정 애플리케이션의 특정 리소스에 접근하게 허가하는 과정
Access Control(접근제어)
사용자가 애플리케이션의 리소스에 접근하는 행위를 제어하는 것
SSR(Server Side Rendering) 방식으로 구현된 샘플로 실습진행
Spring Security의 기본 구조와 동작방식을 이해하기 쉬운 방식이 서버에서 HTML을 만들어 클라이언트로 내려주는 SSR 방식이기때문
세션기반의 폼 로그인 방식을 적용하기 가장 적합하다
UserDetails
인터페이스
구현체가 필요함
SecurityConfiguration
설정 정보를 담은 클래스(인증매커니즘,접근규칙(cors),세션관리등)
JavaConfiguration
회원가입에 필요한 MemberService를 선택하는 설정정보가 담긴 클래스
- SSR (Server-Side Rendering - 서버 사이드 렌더링):
- 서버에서 초기 페이지를 렌더링한 후, 클라이언트에게 전송합니다.
- 브라우저가 페이지를 받으면 사용자에게 보여줍니다.
- 초기 로딩 속도는 느릴 수 있지만, 검색 엔진 최적화(SEO)에 유리합니다.
- React, Angular, Vue와 같은 프레임워크에서도 SSR을 지원합니다.
- CSR (Client-Side Rendering - 클라이언트 사이드 렌더링):
- 초기에는 비어 있는 HTML 페이지를 받아오고, 이후 JavaScript를 사용하여 동적으로 컨텐츠를 렌더링합니다.
- 초기 로딩 속도는 빠르지만, 검색 엔진 최적화가 어렵습니다.
- 단일 페이지 어플리케이션(SPA)에서 주로 사용되며, React, Angular, Vue와 같은 프레임워크에서 CSR을 채택하는 경우가 많습니다.
SSR은 완성된 페이지를 만들어서 보내주며 느린 초기 로딩이지만 SEO에 좋고,
CSR은 브라우저에 빈 페이지를 먼저 보내주고, 거기에 필요한 정보를 자바스크립트로 가져와서 채워 빠른 초기 로딩이지만 SEO에는 좀 약한 특징
1. 의존 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
2. Spring Security에서 제공해주는 기본 로그인정보를 사용할 수있다
user / 로그에서 나오는 password 입력해서 자격증명에 성공해야함
-> 하지만 이 방식은 매번 실행시 패스워드가 바뀌고 회원 각자의 인증정보로 로그인하는것이 불가능함
Spring Security의 @Configuration을 통해 인증방식을 설정
SecurityConfiguration 클래스에 인증과 권한부여설정하면 됨
🌟데이터베이스 연동없는 로그인인증
Spring Security에서 지원하는 InMemory User를 사용
CSRF설정 비활성화
InMemoryUserDetailsManager 데이터베이스 연동없이 테스트
withDefaultPasswordEncoder() 테스트 환경시 사용자계정정보를 고정시켜서 사용
회원가입폼을 통한 InMemory User 등록
1. MemberService Bean등록을 위한 JavaConfiguration 구성
2. InMemoryMemberService 클래스 구현
🌟데이터베이스 연동을 통한 로그인인증
InMemory User는 다시 시작하면 메모리에 등록된건 모두 사라지기 때문에
회원정보를 데이터베이스를 이용해서 관리
Custom UserDetailsService를 이용
User의 Role을 DB에서 관리하기
1.User권한정보를 저장하기위한 테이블생성
2.User의 권한정보(Role)를 데이터베이스에 저장하는 작업
3.로그인 인증시 User의 권한정보를 데이터베이스에서 조회하는 작업
Custom AuthenticationProvider 사용하는 방법
Custom UserDetailsService를 사용해 로그인하는 방식은 내부적으로 인증을 대신 처리해주는 방식이지만
Custom AuthenticationProvider를 이용해 직접 로그인 인증을 처리
AuthenticationProvider 인터페이스의 구현 클래스는
authenticat(Authentication authentication) 메서드와
supports(Class<?> authentication) 메서드를 구현해야 함
✨Custom AuthenticationProvider 이용시 인증 실패할 때
왜 "Whitelebel Error Page"가 표시될까?
MemberService에서 등록된 회원정보가 없으면 BusinessLogicException을 throw하는데
Custom AuthenticationProvider를 거쳐 그대로 Spring Security내부로 throw되기 때문
Spring Security에서는 인증 실패시 authenticationException이 throw되지 않으면
Exception에 대한 별도의 처리를 하지 않고 서블릿 컨테이너인 톰캣쪽으로 처리를 넘김
그러면 "/error" URL로 포워딩하는데 뷰페이지를 별도로 구성하지 않았기때문에 디폴트페이지("Whitelebel Error")를 표시함
🍀해결책 : Custom AuthenticationProvider에서 Exception이 발생할 경우
catch해서 AuthenticationException으로 rethrow해주면 됨
'개발공부🌷 > Spring Security' 카테고리의 다른 글
Spring Security JWT 인증 (0) | 2023.12.13 |
---|