Spring Security

5w31892p·2022년 12월 23일
0

Spring

목록 보기
11/30

강의 노션 자료만으로 이해가 안되서 따로 찾아 공부하고 정리


:: Spring Security

스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어준다.

이해가 쉽게 비유해보자면
어느 회사든 각 다들 맡은 업무가 있다.
검찰청에 가면 아무나 막 들어갈 수 있는 것이 아닌, 어떤 용무로 어디서 왔는지 앞에 앉아 계신 분께서 인증과 인가를 담당하신다.
어디서 어떤 용무로 왔는지 신분증으로 인증을 하고,
예를 들어 형사 3과로 볼 일이 있어서 왔다면 형사 3과로 갈 수 있는 카드키 목걸이를 주며 인가해주신다.
그렇다면 Security도 Spring이라는 업무 공간에서 검찰청 앞 쪽에 앉아 계신 분 처럼 인증과 인가를 해주는 것으로 볼 수 있다.

그리고 그 분께서는 신분증이 있냐 없냐, 신분증이 있더라도 해당 형사 3과로 갈 수 있는 권한이 있냐 없냐를 보고 인가를 해주신다.

Security도 또한 인증과 권한 부분을 Filter 흐름에 따라 처리한다는 부분이 비슷하다고 볼 수 있다.

인증(Authentication)

  • 검찰청에 들어가려는 자가 누구인지 신분증으로 확인하는 절차
  • 즉, 사이트에 접속하려는 자를 username과 password로 확인

인가, 권한(Authorization)

  • 신분증 확인 후 무슨 과에 볼일이 있는지 확인하고 들어갈 수 있는 카드키를 주는 절차
  • 즉, 로그인된 사용자가 뭘 할 수 있고, 특정 페이지나 리스소에 접근 할 수 있는지 권한을 판단

검찰청 비유를 들어보면 당연한거겠지만,
신분증으로 본인이 누구인지 먼저 확인 시켜준 후 (인증) -> 무슨 과에 무슨 일을 보러 왔는지 증빙할 수 있는 것을 내민다. (인가, 권한)
또, 그 카드키를 줄 수 있는 사람은 이 사람이 진짜 그런 사건이 있어서 왔는지 아닌지 확인 후 줄 수 있다. (필터)

위에서 보는 것과 같이 인증 절차를 거친 후 권한 절차를 진행하게 된다.


또 생각해보면 그 검찰청 직원 분이 무급으로 그런 일을 시킨다면 그냥 오는 사람 가는 사람 안막고 다 들여보내 줄 것이다.
Security도 마찬가지로 의존성을 추가하지 않으면 아무론 보안, 인증을 하지 않을 것이므로
build.gradle에 의존성 추가를 해줘야 한다.

그리고 난 후 그 직원 분이 아무런 말도 없이 일을 할 순 없으니 위에서 "그래 너 그 일 해" 라고 해서 일을 하시는 것일 것이다.
그렇다면 Security도 마찬가지로 Security 지원을 가능하게끔 활성화 시켜줘야 한다.
이는 @EnableWebSecurityWebSecurityConfig 라는 class에 적어줌으로써 활성화가 된다.


CSRF(Cross site request forgery)란, 실제 서버가 아닌 공격자가 의도한 위조된 페이지에서 요청을 하게 만드는 것이다.
예를 들자면, a라는 사이트에 게시글을 적으려고 하는데
공격자가 url 주소마저 미묘하게 바꿔 알아차리지 못하게 한 후 사용자가 인사글이라던가, 판매 글을 올리게 되지만 중간에서 페이지 스틸한 공격자 페이지에는 공격자가 원하는 데이터가 적혀 있기 때문에 사용자가 뭘 적든 간에 공격자가 원하는 데이터 예를 들자면 돈을 빌려준다던가, 성매매한다는 등의 미리 입력해둔 것이 게시 되게 된다.
이러한 공격을 막기 위해 CSRF설정을 꼭 해줘야 한다. -> SecurityFilterChain


:: Spring Security 동작 구조


:: Spring Security 주요 컴포넌트

  1. Spring Security 와 Filter
    security는 요청 들어오면 자동으로 filterChain 구성한다.
    filterChain은 filter를 chain 형태로 묶어 놓은 것이고,
    filter는 요청 전달 전 후 url 패턴에 맞는 모든 요청 필터링하는 것이다.
    CSRF, XSS 등도 보안검사를 통해 올바른 요청이 아니면 모두 차단한다.
    security는 filter를 사용해 인증, 인가를 구현한다.
  1. SecurityFilterChain
    spring 보안 filter 결정하는데 사용되는 filter이다.
  1. AbstractAuthenticationProcessingFilter
    사용자의 자격 인증하기 위한 베이스 필터
  1. UsernamePasswordAuthenticationFilter
    AbstractAuthenticationProcessingFilter를 상속
    form login 기반 사용시 username, password 확인하여 인증하고,
    인증이 필요한 url이 들어왔을 때 인증되지 않는다면 로그인페이지를 반환한다.
  1. SecurityContextHolder
    인증된 사용자의 상세 정보 저장한다.
    SecurityContext란 SecurityContextHolder 로 접근할 수 있으며 Authentication 객체를 가지고 있는 것
  1. Authentication
    인증된 사용자를 나타냄
    SecurityContext에서 가져올 수 있음
    principal : 사용자 식별
    credentials : 사용자 인증에 사용 후 비움
    authorities : 부여한 권한을 GrantedAuthority로 추상화 하여 사용
  1. UserDetailsService
    사용자 조회, 인증 후 UserDetails 반환
    custom하여 bean으로 등록후 사용 가능
  1. UserDetails
    검증된 UserDetails는
    UsernamePasswordAuthenticationToken 타입의 Authentication를 만들 때 사용되며
    해당 인증객체는 SecurityContextHolder에 세팅된다.

:: 비밀번호 암호화

정보통신망법과 개인정보보호버에 의해 비밀번호 암호화 의무

사용자 검증 흐름
1. 회원가입
2. 비밀번호 암호화 하여 저장 
3. 로그인 
4. 입력한 정보를 통해 암호화된 비밀번호와 입력한 비밀번호 비교 
5. 인증 성공 시 JWT 토큰 생성 후 Header에 추가 및 반환 -> client는 쿠키저장소에 저장
6. 요청 진행할 때마다 JWT 토큰 같이 보내 서버에서 확인 후 요청 수행

Spring Security의 default 로그인 기능

Username은 무조건 user
password는 spring 로그로 확인됨 (서버 시작시마다 변경)
로그인 후 저장된 쿠키의 세션 값은 새로고침을 해도 계속 같은 값으로 있다.
하지만 그 세션을 임의로 삭제하면 다시 로그인을 할 수 있는 페이지로 옮겨진다.

이처럼 Spring Security는 session 방식을 사용해서 인증 처리를 한다.


:: @Secured

권한설정 @Secured("권한 이름") 선언

@Secured 활성화 @EnableGlobalMethodSecurity(securedEnabled = true)

403(Forbidden)
클라이언트 오류 상태. 서버에 요청이 전달되었지만, 권한 때문에 거절

0개의 댓글