이번 시간에는 preAuthorized에 대해서 간단하게 알아봅시다.

 


 도서관 토이 프로젝트 중에서, 인증 처리를 구현해야 하는 부분이 있었습니다. 그리고, 특정 권한을 가져야 api를 수행하게끔 하는 기능도 있었습니다. 스프링 시큐리티는 익숙하지 않아서, 테스트용 프로젝트를 하나 더 만든 다음에, 기능을 나누어서 구현하게 되었습니다. 해당 부분에 대해서는 이 레포에서 천천히 다뤄보도록 하겠습니다.

 

 테스트용 프로젝트의 flow입니다. 인증 처리를 구현하고, 인가 처리를 하고, 그에 따라서 api에 접근할 수 있게 할 계획입니다. 한꺼번에 하기에는 양이 너무 많으니, 이번 시간에는 인가 부분만 해 보도록 하겠습니다.

 

 인증하고 인가에 대한 것은 이 글에서 언급을 했어요. 이 글에서 언급할 것은 preAuthorize를 이용한 인가 처리이니, 이것만 보도록 하겠습니다. 제가 티스토리에 로그인을 했어요. 그런데, 뜬금없이 다른 블로그의 글을 삭제할 수 있다고 해 볼게요. 그러면, 많은 블로그들이 아작이 날 겁니다.

 

 그래서, 내 블로그가 아닌 다른 블로그의 글들을 '삭제'할 수 있는 권한은 주지 말아야 해요. 대신에, 내가 내 블로그 글들을 수정하고 삭제할 수 있는 권한은 있어요. 허가된 작업입니다. 이렇게, 어떠한 일에 대한 권한을 주는 작업을 인가라고 하는데요. 오늘은 그 작업을 해 보려고 합니다.

 

 먼저, 프로젝트의 구조입니다. securityConfig, testController, DemoApplication 이렇게 3개의 클래스가 있고, 설정 파일이 하나 있어요. 하나씩 보겠습니다.

 

 server.port는 익숙하실 거고요. spring.security.user에 대한 게 좀 있는데요. name은 id를 의미합니다. 그리고 password는 패스워드, roles는 어떤 역할이 주어졌는지를 의미합니다. 예를 들어서 ADMIN 역할, USER 역할 등이 있어요. 위 예제에서는 ID인 유저가 가진 권한은 USER임을 알 수 있어요.

 

 

 이제 securityConfig를 볼게요. WebSecurityConfigurerAdapter를 상속받습니다. 그리고 configure 함수를 오버라이딩 했는데요. csrf만 껐습니다. 이는, post, delete 등의 요청에서, token이 없어서 403이 떨어지는 것을 피하게 하기 위해서입니다. 18번째 줄에서 HttpSecurity 메타 데이터를 초기화 합니다. 다음에, 23번째 줄에서, csrf를 비활성화 시켜요. csrf에 대한 것은, 언제 한 번 언급할 기회가 있을 듯 합니다. 그리고, 어노테이션 3개를 달았는데요.

 

 EnableGlobalMethodSecurity가 있어요. prePostEnabled를 true로 셋팅했는데요. 이는 preAuthorize, postAuthorized를 사용하기 위함입니다.

 

 

 컨트롤러에는 preAuthorized 어노테이션이 있습니다. 문서에 따르면 안에 들어 있는 조건식을 만족할 때 invoke를 시킨다고 되어 있어요. 예를 들어서, testDelete를 보면, hasRole('ROLE_ADMIN') 이라고 되어 있는데요. 이는 ADMIN 역할을 가지고 있을 때에만, 발동된다는 의미입니다.

 

 testGet은 어떤가요? hasRole('ROLE_USER')라고 되어 있어요. 이는 USER 역할을 가지고 있다면 invoke가 된다는 의미에요.

 


 그러면, postman으로 api를 호출해 보면서 이해를 해 봅시다.

 

 

 Basic Auth에 application.properties에서 setting한 username과 password를 입력합니다.

 

 

 그 다음에, GET /test를 호출했어요. 그랬더니 상태 코드 200을 돌려줍니다. 이 api는 role이 USER이면 invoke가 되는데요. 제가 프로퍼티 파일에서 설정한 유저의 role이 USER였어요. 그러므로, 정상적으로 수행이 됩니다.

 

 도식화 해 보면 위와 같아요.

 

 

 post는 아무런 인가 없이 실행시킬 수 있어요. 인증이 된 누구나 실행시킬 수 있으니, 200이 떨어지게 됩니다.

 

 

 DELETE /test는 어떨까요? 이것은 role이 'ADMIN'이여야 invoke가 됩니다. 프로퍼티 파일에서 디폴트 유저의 role은 관리자가 아닌 유저로 설정되어 있습니다.

 

 따라서, 주황색 부분이 실행되지 않고, 403이 떨어지게 됩니다. 여기까지 적용한 변경 사항들은 여기서 보실 수 있어요. 다음에는, 유저 정보를 어떻게 얻어올 것인지에 대해서 보도록 하겠습니다.