강의 노션 자료만으로 이해가 안되서 따로 찾아 공부하고 정리
스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어준다.
이해가 쉽게 비유해보자면
어느 회사든 각 다들 맡은 업무가 있다.
검찰청에 가면 아무나 막 들어갈 수 있는 것이 아닌, 어떤 용무로 어디서 왔는지 앞에 앉아 계신 분께서 인증과 인가를 담당하신다.
어디서 어떤 용무로 왔는지 신분증으로 인증을 하고,
예를 들어 형사 3과로 볼 일이 있어서 왔다면 형사 3과로 갈 수 있는 카드키 목걸이를 주며 인가해주신다.
그렇다면 Security도 Spring이라는 업무 공간에서 검찰청 앞 쪽에 앉아 계신 분 처럼 인증과 인가를 해주는 것으로 볼 수 있다.
그리고 그 분께서는 신분증이 있냐 없냐, 신분증이 있더라도 해당 형사 3과로 갈 수 있는 권한이 있냐 없냐를 보고 인가를 해주신다.
Security도 또한 인증과 권한 부분을 Filter 흐름에 따라 처리한다는 부분이 비슷하다고 볼 수 있다.
인증(Authentication)
- 검찰청에 들어가려는 자가 누구인지 신분증으로 확인하는 절차
- 즉, 사이트에 접속하려는 자를 username과 password로 확인
인가, 권한(Authorization)
- 신분증 확인 후 무슨 과에 볼일이 있는지 확인하고 들어갈 수 있는 카드키를 주는 절차
- 즉, 로그인된 사용자가 뭘 할 수 있고, 특정 페이지나 리스소에 접근 할 수 있는지 권한을 판단
검찰청 비유를 들어보면 당연한거겠지만,
신분증으로 본인이 누구인지 먼저 확인 시켜준 후 (인증) -> 무슨 과에 무슨 일을 보러 왔는지 증빙할 수 있는 것을 내민다. (인가, 권한)
또, 그 카드키를 줄 수 있는 사람은 이 사람이 진짜 그런 사건이 있어서 왔는지 아닌지 확인 후 줄 수 있다. (필터)
위에서 보는 것과 같이 인증 절차를 거친 후 권한 절차를 진행하게 된다.
또 생각해보면 그 검찰청 직원 분이 무급으로 그런 일을 시킨다면 그냥 오는 사람 가는 사람 안막고 다 들여보내 줄 것이다.
Security도 마찬가지로 의존성을 추가하지 않으면 아무론 보안, 인증을 하지 않을 것이므로
build.gradle에 의존성 추가를 해줘야 한다.
그리고 난 후 그 직원 분이 아무런 말도 없이 일을 할 순 없으니 위에서 "그래 너 그 일 해" 라고 해서 일을 하시는 것일 것이다.
그렇다면 Security도 마찬가지로 Security 지원을 가능하게끔 활성화 시켜줘야 한다.
이는 @EnableWebSecurity
을 WebSecurityConfig
라는 class에 적어줌으로써 활성화가 된다.
CSRF(Cross site request forgery)란, 실제 서버가 아닌 공격자가 의도한 위조된 페이지에서 요청을 하게 만드는 것이다.
예를 들자면, a라는 사이트에 게시글을 적으려고 하는데
공격자가 url 주소마저 미묘하게 바꿔 알아차리지 못하게 한 후 사용자가 인사글이라던가, 판매 글을 올리게 되지만 중간에서 페이지 스틸한 공격자 페이지에는 공격자가 원하는 데이터가 적혀 있기 때문에 사용자가 뭘 적든 간에 공격자가 원하는 데이터 예를 들자면 돈을 빌려준다던가, 성매매한다는 등의 미리 입력해둔 것이 게시 되게 된다.
이러한 공격을 막기 위해 CSRF설정을 꼭 해줘야 한다. -> SecurityFilterChain
정보통신망법과 개인정보보호버에 의해 비밀번호 암호화 의무
사용자 검증 흐름
1. 회원가입
2. 비밀번호 암호화 하여 저장
3. 로그인
4. 입력한 정보를 통해 암호화된 비밀번호와 입력한 비밀번호 비교
5. 인증 성공 시 JWT 토큰 생성 후 Header에 추가 및 반환 -> client는 쿠키저장소에 저장
6. 요청 진행할 때마다 JWT 토큰 같이 보내 서버에서 확인 후 요청 수행
Username은 무조건 user
password는 spring 로그로 확인됨 (서버 시작시마다 변경)
로그인 후 저장된 쿠키의 세션 값은 새로고침을 해도 계속 같은 값으로 있다.
하지만 그 세션을 임의로 삭제하면 다시 로그인을 할 수 있는 페이지로 옮겨진다.
이처럼 Spring Security는 session 방식을 사용해서 인증 처리를 한다.
권한설정 @Secured("권한 이름") 선언
@Secured 활성화 @EnableGlobalMethodSecurity(securedEnabled = true)
403(Forbidden)
클라이언트 오류 상태. 서버에 요청이 전달되었지만, 권한 때문에 거절