1) Spring Security
: Spring 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해주는 프레임워크
CSRF
: 사이트 간 요청 위조 (Cross-site request forgery)
- 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달함.
- CSRF 설정이 되어있는 경우 html에서 CSRF 토큰 값을 넘겨주어야 요청 수신 가능
- 쿠키 기반의 취약점을 이용한 공격이기 때문에 REST 방식의 API에서는 disable 가능
Spring Security - Filter Chain
- Spring에서 모든 호출은 DispatcherServlet을 통과하게 하고 이후에 각 요청을 담당하는 Cotroller로 분배되는데, 이 때 각 요청에 대해 공통적으로 처리해야할 때 DispatcherServlet 이전 단계인 Filter가 필요
- Spring Security도 인증 및 인가를 처리하기 위해 Filter를 사용.
이때 Spring Security는 FilterChainProxy를 통해 상세 로직을 구현하고 있음. - Spring Security가 Filter 기반으로 동작하고 있다는 것❗
Form Login 기반 인증
: 인증이 필요한 URL 요청이 들어왔을 때 인증이 되지 않았다면 로그인 페이지를 반환하는 형태
- Security에서 제공하는 기본적인 Form Login 기반 인증
내부에서 인증이 어떤 식으로 처리되는지가 중요.
가장 많이 살펴보는 필터가 바로 UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter (⭐)
: Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter
- 기본적으로 Form Login 기반을 사용할 때 username과 password 확인하여 인증
- 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증 시도
- 실패하면 SecurityContextHolder를 비움
- 성공하면 SecurityContextHolder에 Authentication을 세팅하여 인증 처리 완료
- SecurityContextHolder
- SecurityContextHolder안에 존재하는 SecurityConext는 인증이 완료된 사용자의 상세정보(Authentication)를 저장
- SecurityConext는 SecurityContextHolder로 접근 가능
// 예시코드 SecurityContext context = SecurityContextHolder.createEmptyContext(); Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities); context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다. SecurityContextHolder.setContext(context);
- Authentication
- 현재 인증된 사용자를 나타내며 SecurityContext에서 가져올 수 있음.
- principal : 사용자를 식별
- Username/Password 방식으로 인증할 때 일반적으로 UserDetails 인스턴스를 넣음.
- credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비움
- authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용
- UserDetailsService
- username/password 인증방식을 사용할 때 사용자를 조회하고 검증한 후 UserDetails를 반환.
- Custom하여 Bean으로 등록 후 사용 가능.
- UserDetails
- 검증된 UserDetails는 UsernamePasswordAuthenticationToken 타입의 Authentication를 만들 때 사용되며 해당 인증객체는 SecurityContextHolder에 세팅됨.
- Custom하여 사용 가능.
2) Spring Security : 로그인
- 사용 전과는 다르게, 앞단에 Spring Security가 인증 처리를 해줘 Client의 요청은 모두 Spring Security 를 거침
- Spring Security 역할
- 인증/인가
- 성공시 : Controller로 Client 요청 전달
➡️ Client요청 + 사용자 정보(UserDetails) - 실패시: Controller로 Client 요청 전달 ❌
➡️ Client에게 Error Response 보냄
- 성공시 : Controller로 Client 요청 전달
- 인증/인가
로그인 처리 과정
- Client
- ) 로그인 시도
- ) 로그인 시도할 username, password 정보를 HTTP body로 전달 (POST 요청)
- ) 로그인 시도 URL은 WebSecurityConfig 클래스에서 변경 가능.
- 인증 관리자 (Authentication Manager)
- ) UserDetailsService에게 username 전달하고 회원상세 정보 요청
- UserDetailsService
- ) 회원 DB에서 회원 조회
(정보가 존재하지 않을 시 Error 발생) - ) 회원정보가 존재하면 UserDetalis로 변환
- ) UserDetails를 "인증 관리자"에게 전달
- ) 회원 DB에서 회원 조회
- "인증 관리자"가 인증 처리
- ) Client가 로그인 시도한 username, password와
UserDetailsService가 전달해준 UserDetails의 username, password 가 일치하는지 확인 - ) Client가 보낸 평문의 password를 암호화하여 UserDetails의 password 암호문 비교
- ) 인증 성공시, 세션에 로그인 정보 저장
인증 실패시, Error 발생
- ) Client가 로그인 시도한 username, password와
3) Validation
: 데이터가 요구사항이나 규칙에 맞는지 검사하는 것.
Bean Validation
- 간편하게 사용할 수 있는 여러 annotation을 제공해줌.
@NotNull
|
null 불가
|
@NotEmpty
|
null, “” 불가
|
@NotBlank
|
null, “”. “ “ 불가
|
@Size
|
문자 길이 측정 (최대값, 최소값 한 번에 정해줄 때 사용)
|
@Max
|
최대값
|
@Min
|
최소값
|
@Positive
|
양수
|
@Negative
|
음수
|
@Email
|
E-mail 형식
|
@Pattern
|
정규 표현식
|
@Valid
- 데이터 검증을 하고 싶은 Dto 앞에 @Valid를 달아야 해당 객체에 데이터 검증이 일어날 수 있음.
용어 정리
- UsernamePasswordAuthenticationToken
: 인증된 사용자의 정보가 담긴 Authentication의 종류 중 하나
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] Entity 연관관계 (1) | 2023.11.14 |
---|---|
[Spring] RestTemplate (0) | 2023.11.10 |
[Spring] Filter (0) | 2023.11.09 |
[Spring] JWT / 패스워드 암호화 (0) | 2023.11.08 |
[Spring] Authentication / Authorization / Cookie / Session (1) | 2023.11.08 |