[Spring Security] 2. Spring Security filter

개발자·2022년 4월 28일
0

Spring Security

목록 보기
2/11
post-thumbnail

이번 시간에는 기본 시큐리티 설정을 해 볼 것이다.

먼저 Controller 를 수정하여 여러 함수를 추가하여 테스트해보고

스프링 시큐리티 필터를 생성하여 테스트 해볼 것이다.

controller/IndexController.java

package com.cos.securiy1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller // View Return
public class IndexController {

    @GetMapping({"","/"})
    public String index(){
        // 머스테치 기본폴더 src/main/resources/
        // ViewResolver 설정 : templates (prefix) , mustache(suffix) - 생략 가능.
        return "index"; // src/main/resources/templates/index.mustache 를 찾게된다.
    }

    @GetMapping("/user")
    public String user(){
        return "user";
    }

    @GetMapping("/admin")
    public String admin(){
        return "admin";
    }

    @GetMapping("/manager")
    public String manager(){
        return "manager";
    }

    // 스프링 시큐리티가 해당 주소를 낚아챈다.
    @GetMapping("/login")
    public String login(){
        return "login";
    }

    @GetMapping("/join")
    public String join(){
        return "join";
    }

    @GetMapping("/joinProc")
    public @ResponseBody String joinProc(){
        return "회원가입 완료됨!";
    }
}
  • 이전 시간에 구성한 index 페이지에 user, admin, manager, login, join, joinProc 함수를 추가 하였다.

  • login은 스프링 시큐리티가 주소를 낚아채 우리가 생성한 login 페이지가아닌 지난 시간에 나온 로그인 페이지가 나오게 되었다.

  • localhost:8080/user

  • localhost:8080/admin .....

  • 다음과 같이 입력하며 화면이 잘 나오는지 테스트한다.

config/SecurityConfig

package com.cos.securiy1.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity // 활성화 , 스프링 시큐리티 필터가 스프링 필터 체인에 등록
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable(); // 비활성화
        http.authorizeRequests()
                .antMatchers("/user/**").authenticated() // 다음과 같은 주소는 인증이 필요
                .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") // 인증뿐 아니라 권한이 있어야함
                .anyRequest().permitAll() // 다른 것은 모두 허용
                .and()
                .formLogin()
                .loginPage("/login"); // 로그인 페이지 설정
    }
}
  • 다음 코드와 같이 스프링 시큐리티 필터를 설정하였다.

  • http.csrf() 는 정상적인 사용자가 의도치 않는 위조요청을 보내는것을
    막기 위해서 html에서 csrf 토큰이 포함되어야만 요청을 받는것이다.

  • 하지만 우리는 비활성화를 하기로 하였다. 이유는 rest api에서는
    csrf의 공격으로 부터 안전하고 매번 csrf 토큰을 받는것은 불필요하다고 생각되기 때문이다

  • authorizeReuquests를 통해 다음을 설정하였다.

  • /user 주소로 시작되는 주소는 인증이 필요하며

  • /manager, /admin 주소로 시작되는 주소는 인증과 권한이 모두 필요하다

  • 그 이외에 것은 모두 허용하며

  • 로그인 페이지를 설정하여 비로그인시 로그인 화면으로 가도록 하였다.

0개의 댓글