SpringSecurity(2-2. 로그인)

Walker·2021년 7월 5일
0

SpringSecurity

목록 보기
3/4
post-thumbnail

지난 글에 이어서 권한에 따른 로그인 기능을 완성해보자!

먼저 로그인 테스트를 위해 인증 받은 사용자 정보를 가공으로 설정한다.
(실제로는 DB 정보를 읽어와서 인증 사용자로 가지고 있을 텐데 그 부분은 더 알아봐야겠다.)

이후 해당 정보로 로그인을 시도해도 인증은 실패한다.
그 이유는 Csrf 필터에 걸리기 때문이다.

CSRF웹사이트 공격의 한 방법으로 Csrf 필터는 이러한 공격으로부터
웹사이트와 사용자를 보호하기 위한 것이다.

구체적인 CSRF 공격 방법은 다음과 같다.

  1. 공격자공격 코드(삭제, 수정, 전송)가 담긴 게시물을 등록한다.
<img src="https://homepage/user/delete">
  1. 일반 사용자가 공격자가 등록한 게시글을 열람한다.
  2. 해당 게시글 열람시 등록한 공격 코드가 실행되며 공격자의 의도가 달성된다.

출처 : https://codevang.tistory.com/282

위의 경우에서 Csrf 필터가 존재한다면 요청("https://homepage/user/delete")이 왔을 때
해당 요청에 Csrf 토큰(임의의 난수)이 있는지를 확인하여 유효한 Csrf 토큰이 있는 경우에만
요청을 실행하므로 유효한 Csrf 토큰이 없는 공격자의 공격 코드는 실행되지 않는다.

위와 같이 httpSecurity.csrf().disable()로 해당 필터를 해제 할 수도 있으나
보안상 좋지 않으므로 불특정 다수에게 서비스하는 경우 위험하다.

다시 로그인으로 돌아와 Code에서 설명하자면 위의 actualToken 부분이 null이라
Csrf 필터에서 요청이 걸러졌음을 알 수 있다.


th:action="@{/login}"

프론트 템플릿인 타임리프의 경우 위와 같이 작성하면 Csrf 토큰을 요청에 추가해주며
개발자 도구로 확인하면 위와 같은 Csrf 토큰(난수 value)를 확인 할 수 있다.

다음은 권한(User, Admin)에 따른 접근을 제한해보자.

@EnableGloabalMethodSecurity(prePostEnabled= true)

위 어노테이션을 설정하면 유저의 권한에 따라 접근을 제어하게 되며

Controller에서 @PreAuthorize 어노테이션으로
어떤 권한을 가진 사용자에게 접근을 허가할 지를 세부적으로 설정 할 수 있다.

권한이 없는 페이지에 접근하면 403 Forbidden 에러와 함께 접근이 거부된다.

별도의 403 페이지를 만들어 사용자에게 안내하고 싶다면
exceptionHandling()에서 위와 같이 설정하면 된다.

보통 일반 유저유저 페이지만 가능하고 관리자 페이지에는 접근하지 못하지만
관리자관리자 페이지 뿐 아니라 유저 페이지도 접근이 가능하므로
권한의 범위 설정이 필요하다.

위와 같이 RoleHierarchy를 통해 권한의 위계관계를 설정 해주면
ROLE_ADMIN은 ROLE_USER의 권한을 포함하는 권한을 가지게 된다.

3편이나 길게 적어놨지만 사실 아직 스프링 시큐리티를 안다고 하기엔

'아직 갈 길이 멀다...'

이제는 사용해보면서 좀 더 익숙해지는 것이 필요하다는 생각이 들고
스프링 시큐리티가 좀 더 많이 적용되어 있는 프로젝트를 보고 싶기도 하다!

profile
I walk slowly, but I never walk backward. -Abraham Lincoln-

0개의 댓글