Spring Security - Principle

ChoiDevv·2022년 12월 15일
0

다시 작성하게 된 계기

열심히 다른 분들이 쓴 블로그, 공식 문서를 보면서 스프링 시큐리티를 적용해보려고 노력했다. 근데 아무리 해도 내 기준에서는 안되길래 뭐가 문제일까 고민했고 결국은 내가 방식을 잘못 선택했더라..

내가 하고싶었던 방식은 Ajax 방식으로 CSR로 하고 싶었고 찾아서 적용하려던 부분은 폼 로그인이었어서 당연히 동작을 안했던 거다. 난 바보인 듯

이 참에 시큐리티의 동작 방식인 뭐.. WebSecurityConfigurerAdapter에서 정적 자원을 관리함으로 시작해 User뭐시기 토큰을 받고~ 등.. 을 제대로 정리해보려고 한다.

어디까지나 인프런에서 제공하는 강의를 가지고 뭐 몇 설정은 내 입맛대로 변경하고 있지만 그 틀은 변하지 않을 것이라고 보기에 관련해 이미 정리를 해둔 분들은 많을 것이라고 생각한다.

워낙에 넓은 영역이라 한 번에는 정리가 안될 거 같고.. 하루에 1시간 씩은 투자해서 일 끝나고 와서도 해보려고 한다. 가급적 강의를 사서 보는 걸 추천하고 그마저 돈이 아까우시다면 부족한 내 글을 참고해서 도움됐으면 좋겠다.

적용한 버전

2022년 12월 18일 기준으로 인텔리제이의 얼티메이트를 사용하고 있는데 자꾸 gradle을 받으면 에러가 난다. 어차피 아직 주니어라 테스트 코드 관련해서 JUnit4 버전을 기용하려고 다운그레이드 하고 있긴 한데 스프링 부트 버전도 그냥 다운 그레이드하고 있다.

스프링 부트의 경우에는 2.1.7.RELEASE, 그레이들은 4.10.2를 사용한다. 해당 부분 다운그레이드는 구글에 널렸으니 잘 참고해서 적용해도 좋을 듯하다. 내가 했다는 건 결국 모두가 할 수 있다는 거

Gradle

강의는 maven을 쓰고 있는데 난 gradle로 했다. maven 생긴 게 구리기도 하고 점점 추가되는 의존성에 maven 식이라면 너무 코드가 지저분했고 gradle을 선택했다.

Security 적용

  1. 가장 먼저 프로젝트를 만들었으면 테스트를 하자.
@RestController
public class SecurityController {

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

간단하게 컨트롤러 하나 만들어준다.


이젠 나도 개발자가 되었다. 아 참고로 롬복을 사용하고 있는데 이 의존성에 대한 건 다음 문단에 적겠다.

  1. gradle 설정을 하자.
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compileOnly  'org.projectlombok:lombok'

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile('com.h2database:h2:')

    implementation 'org.springframework.boot:spring-boot-starter-security'
}

나중에 쓰려고 자잘한 것도 몇 개 넣었고 아직 의존성에 추가하지 않은 것도 있다. 가장 밑에 spring security 관련 의존성을 넣고 인텔리제이에 생기는 파란 버튼 눌러줘서 추가한다.

  1. 다시 실행하자.

뭔가 생겼다. 아까 스프링 시큐리티 관련 의존성을 추가해서 페이지가 잠겼다고 생각하면 된다. 실행된 인텔리제이의 터미널을 보면 아마 어떤 값을 톰캣이 던져주고 있을 것이다. 유저 네임에는 user, 패스워드에는 그걸 입력하면 다시 접속될 것이다.

그치만 그건 매우 귀찮으니까 프로퍼티에 고유값을 넣어주자.

  1. application.properties에 추가하자.
spring.security.user.name=root
spring.security.user.password=1234

요래 추가하면 root, 1234을 입력하면 들어가질 것이다.

문제점

보안 기능이 1도 없던 내 개발 페이지에 보안 기능 넣었으니 끝난 거 아닌가.. 라고 생각할 수도 있는데 이제 시작이다.

현재 이 웹사이트는 잠겨있긴 하나 회원가입 기능도 없고 프로퍼티에 설정해둔 저 유저 네임과 비밀번호만 입력해야 들어갈 수가 있다. 하지만 우리가 원하는 그림은 회원가입을 딱 DB에 저장해서 로그인 시도하면 해당 부분을 검증해가지고 로그인해지는 그림..

그렇기 위해서는 몇 가지를 추가해줘야 한다. 사실 이 몇가지가 어려워서 강의를 산거다 난

SecurityConfig

시큐리티에 대해 보안 설정을 해주는 클래스인 SecurityConfig를 설정해준다.

스프링 시큐리티에서 정적 자원에 대한 보안 기능 설정 등.. 기본적으로 WebSecurityConfigurerAdapter 라는 클래스가 설정해준다. 인가와 인증에 대한 설정은 여기서 이루어진다고 보면 된다.

WebSecurityConfigurerAdapter 내에 HttpSecurity라는 클래스가 있고 이 친구가 인가와 인증에 대한 부분을 설정해주는 것이다. 이 부분의 디폴트 값을 보면 해당 클래스 내를 좀 봐야한다.



위 이미지부터 대략적인 설명은 쟤는 인증에 대한 부분이고 아래는 인가에 대한 부분이다. 인증과 인가의 차이를 좀 알아야 하는데 인증은 말 그래도 접근하는 유저에 대한 검증인 것이고 인가는 그 유저에 대한 권한을 검증하는 것이다.

다시 본론으로 조금 돌아오면 우리가 필요한 것은 인가에 대한 부분의 오버라이딩이 필요하다. 프로퍼티에 임시적으로 만들긴 했지만 접근하는 유저는 있고 이 유저가 어디까지 접근할 수 있게 하는지 조정해야하기 때문에 이 부분을 관련해서 오버라이딩을 한다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .anyRequest().authenticated()
                .and()
                    .formLogin();
    }

}

위의 코드는 간략하게 인가를 설정했다. 요청에 대해 어떤 요청이더라도 무조건 로그인을 해야 접근할 수 있다는 의미의 코드이다.

세션

현재 우리가 사용하는 방식은 세션 기반의 방식이라고 할 수 있다. WAS 서버는 종료하지 않고 브라우저만 껐다 켜본다. 그럼 첫번째는 로그인을 하지만 껐다 키면 로그인이 되어있음을 알 수 있다.


그 이유는 JSESSIONID라는 녀석 때문이다. 스프링 자체에서 로그인이 완료되면 토큰 값을 세션에 저장하는데 이 녀석을 가지고 인증이 완료된 셈이다.

이걸 말하는 이유는 스프링 시큐리티의 동작을 이해하려고 하다 보면 만나기 때문이다. 해당 부분은 조금 더 강의를 진행하면서 정리하도록 하겠다.

profile
기억보단 기록을

0개의 댓글