http.authorizeRequests().antMatchers(”xxx”).permitAll()
http.authorizeRequests().antMatchers("/sign-up").permitAll()
.anyReqeust().authenticated()
...
http.addFilterAfter(jwtAuthenticationProcessingFilter(), LogoutFilter.class);
👉 ”/sign-up” URL에 대해서 permitAll()로 인가 처리를 했다.
나머지 URL에 대해서는 인증을 거친 사용자만 인가 처리를 했다.
(인가 처리 : 해당 URL에 접근이 가능하도록 하는 것)
처음 Spring Security를 사용했을 때 코드를 따라치다보니
permitAll()이 무엇을 의미하는지 정확히 알지 못했다.
또한 인증과 인가의 차이에 대해서도 잘 알지 못했었다.
그렇다보니 authorizeRequests()가 인증과 관련 없는 인가 처리에만 관련된 메소드로 생각해서,
“/sign-up”이 permitAll()이어도 인가 처리만 된 것이고, 인증은 거쳐야하지 않나? 라고 생각했었다.
내가 만든 JwtAuthenticationProcessingFilter는 “/login” 이외의 요청이 들어왔을 때 작동하는데,
리프레시 토큰과 액세스 토큰이 둘 다 존재하지 않는 요청 시에
이 인증 필터를 통과하지 못하기 때문에 403 Error를 반환한다.
그래서 JwtAuthenticationProcessingFilter가 “/sign-up” URL을 검증할 때,
회원 가입할 때는 액세스 토큰과 리프레시 토큰이 존재하지 않기 때문에
인증이 실패하고 403 에러가 뜰 것이라고 생각했다.
하지만, 정상적으로 회원가입이 되었었다.
왜 이런 상황이 발생하는지, 인증과 인가의 개념을 더 알아본 후에 이해하게 됐다.
인증(Authentication)과 인가(Authorization)의 개념
1. 인증(Authentication)
* 사용자가 누구인지 확인하는 절차
ex) 사용자가 회원인지 확인
2. 인가(Authorization)
* 사용자가 요청을 실행할 수 있는 권한이 있는지 확인하는 절차
* 사용자의 권한 관련!
ex) 사용자가 홈페이지에 게시글 작성을 할 수 있는 권한이 있는지 확인
인증 처리 후 인가 처리
개념만 봐도 알 수 있듯이, 인증 처리가 완료된 후에 인가 처리가 이루어진다.
사용자가 회원인지도 모르는데 해당 사용자의 권한을 확인할 수는 없다.
이러한 개념을 통해서 결국,
anyReqeust().authenticated()의 의미는 인증을 거친 사용자만 인가 처리를 해준다는 것이고,
permitAll()은 인증을 거치지 않고, 정확히 말하면 이미 인증된 사용자로 처리 후
이미 인증된 사용자로 처리했기 때문에 인증 필터를 거치치 않고 인가 처리를 해준다는 것으로 이해하니 이해하기 쉬웠다.
http.authorizeRequests().antMatchers("/sign-up").permitAll()
.anyReqeust().authenticated()
따라서, “/sign-up” URL 요청 시에는 인증 필터를 거치지 않고
인가 처리가 되어 접근이 가능한 것이었다.