Authorization 필요한 리소스 설정
스프링 시큐리티를 이용해서 특정한 리소스 (자원-웹의 경우 특정한 URL)에 접근 제한을 하는 방식은 대표적으로 설정을 통해서 패턴을 지정하거나 어노테이션을 이용해서 적용하는 방법이 있습니다.
SecurityConfig 클래스에 다음과 같이 추가합니다.
@Override
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests()
.antMatchers("/sample/all").permitAll();
}
http.authorizeRequests()로 인증이 필요한 자원들을 설정할 수 있고, antMatchers()는 **/*와 같은 앤트 스타일의 패턴으로 원하는 자원을 선택할 수 있습니다.
permitAll()은 모든 사용자에게 허락한다는 의미라서 로그인하지 않은 사용자도 익명의 사용자로 간주되어 접근이 가능하게 됩니다.
HttpSecurity 객체는 대부분의 경우 연속적으로 .을 이용해서 처리하는 builder 방식의 구성이 가능합니다.
/sample/member라는 경로는 USER라는 ROLE이 있는 사용자만 사용할 수 있도록 구성해보겠습니다.
@Override
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests()
.antMatchers("/sample/all").permitAll()
.antMatchers("/sample/member").hasRole("USER");
http.formLogin(); // 인가/인증 문제시 로그인 화면
}
formLogin() 은 별도의 디자인을 적용하기 위해 추가적인 설정이 필요합니다.
loginPage()나 loginProcessUrl(), defaultSuccessUrl(),failureUrl() 을 이용해서 필요한 설정을 지정할 수 있습니다.
대부분의 애플리케이션은 고유한 디자인을 적용하기 때문에 loginPage()를 사용해서 별도의 로그인 페이지를 이용하는 경우가 많습니다.
USER라는 단어는 ROLE_USER라는 상수와 같은 의미입니다. 시큐리티 내부에서 USER를 상수처럼 인증된 사용자를 의미하는 용도로 사용하기 때문에 미리 알고 있어야 합니다.
시큐리티는 기본적으로 CSRF(Cross Site Request Forgery - 크로스 사이트 요청 위조)라는 공격을 방어하기 위해 임의의 값을 만들어서 이를 GET 방식을 제외한 모든 요청 방식 (POST, PUT, DELETE)에 포함 시켜야 정상적인 동작이 가능합니다.
CSRF 공격은 '사이트간 요청 위조'라고 할 수 있습니다.
서버에서 받아들이는 정보가 특별히 사전 조건을 검증하지 않는다는 단점을 이용하는 공격방식으로 CSRF를 이요해서 단순히 게시물의 조회수를 늘리는 등의 조작부터 피해자의 계정을 이용하는 다양한 공격이 가능합니다.
A라는 사이트에 특정 사용자의 등급을 변경하는 URI가 존재한다는 것을 알고 해당 URI에 파라미터가 필요하단 것을 알게됐다고 가정해봅시다.
www.abcddddefga.zzzzz/?grade=admin&account=123
공격자는 A 사이트의 관리자가 자주 방문하는 B사이트에 img, form 태그를 이용해서 URI를 추가한 게시물을 작성합니다. A사이트의 관리자는 자신이 평상시 방문하던 B사이트를 방문하고 공격자가 작성한 게시물을 보게됩니다. 이때 img 태그등에 사용된 URI가 호출되고 서버에넌 로그인한 관리자의 요청에 의해 공격자는 admin 등급으로 변경됩니다.
A 사이트에 로그인이 되어 있는 상태라면 A사이트 서버 입장에서는 로그인한 사용자의 정상적인 요청으로 해석됩니다.
CSRF 공격은 서버에서 받아들이는 요청을 해석하고 처리할 때 어떤 출처에서 호출이 진행되었는지 따지지 않기 때문에 생기는 허점을 노리는 공격 방식입니다.
'사이트간 요청 위조'라고 하지만현실적으로 하나의 사이트 내에서도 가능합니다. img, uri를 이용할 수 있기 때문에 손쉽게 공격할 수 있는 방법이 됩니다.
CSRF 토큰은 기본적으로 세션당 하나씩 생성됩니다. 일반적인 세션을 이용하고, form태그를 이용하는 방식에선 CSRF토큰이 보안상 권장되지만, REST방식에서 매번 CSRF 토큰의 값을 알아내야하는 불편함이 있기 때문에 경우에 따라 CSRF 토큰발행을 하지 않는 경우도 있습니다.
csrf 토큰 비활성화
http.csrf().disable();
http.logout()을 사용할 때 주의해야할 점은 CSRF 토큰을 사용할 때는 반드시 POST 방식으로만 로그아웃 처리를 해야하는 것입니다.
'Spring + Boot' 카테고리의 다른 글
JPA와 Entity , 동적 쿼리 처리를 위한 Querydsl 설정 (0) | 2021.04.18 |
---|---|
Spring Security - 3 (0) | 2021.04.17 |
Spring Security 연동하기 -1 (0) | 2021.04.15 |
JPA 쿼리 메서드 기능 @Query (0) | 2021.04.08 |
JPA 페이징 / 정렬 처리하기 (0) | 2021.04.08 |