본문 바로가기
개발/SpringBoot

[Spring Security] 스프링시큐리티 사용하는 이유, 사용하지 않았을 때 차이 비교

by yo.na 2024. 2. 17.

 
 

✔ 사용하는 이유

1.  Spring Security 를 사용하지 않았을 때의 요청

 
누구나 정보 확인이 가능하다.

public - 정보를 볼 수 있는 사람을 컨트롤 할수 없다.
annonymous - 누가 요청했는지 알수 없다.
unprotected - 누군가 악의적으로 브라우저 기반의 취약점을 이용할 수 있다.
 
1-1. Spring Security 사용하지 않았을 때 존재하지 않는 endpoint 요청

 
404 가 나쁜 것은 아니지만 이와같이 존재하지 않는 endpoint 임을 알려주면 이 또한 취약점이 될 수 있다.
 

2. Spring Security 를 사용했을 때의 요청

스프링 시큐리티를 추가한 후 이전과 같은 요청을 보내보았다.

 
아무나 데이터 조회가 가능했던 이전과 달리 401이 나오는걸 확인할 수 있다.
이는 Spring Security 의 기본 값이 스프링부트의 모든 요청에 대해 자동으로 인증(authentication) 을 요구하기 때문이다.
 
Spring Security는 security 에 대한 실패 응답을 할 때 REST 규칙을 사용한다.
 

실패 유형

인증 오류 (authentication errors) : 401
인가 오류 (authorization errors) : 403
 
2-1.  Spring Security 사용했을 때 존재하지 않는 endpoint 요청

 
예상했던 404가 아닌, 401이 나오는 것을 확인 할 수 있다.
보안적으로 404를 대중(public) 과 공유하지 않는 것이 좋다.

3. Spring Security 를 사용했을 때 인증 된 사용자의 요청

앞서 한 테스트는 로그인 하지 않은 사용자인 경우이다.
Spring security 를 사용한 스프링부트를 실행시키면 Using generated security password 라는 UUID 를 준다.
이번에는 해당 password 를 이용하여 로그인 한 사용자로 HTTP Basic Auth 방식으로 요청을 보내보았다.

 
인증된 사용자에게 스프링 시큐리티를 사용하기 전(1번) 테스트와 같이 정보가 조회되는 것을 볼 수 있다.
 
3-1.  Spring Security 사용했을 때, 인증된 사용자의 존재하지 않는 endpoint 요청

 
404 상태로 나오는 것을 확인 할 수 있다.
스프링시큐리티(1-1)를 사용하지 않은 경우일 때와 같은 결과이다.
즉, 스프링 시큐리티는 인증된 사용자에게는 404 임을 알려주고 인증되지 않은 사용자에게는 401 상태를 보여준다.
 

4. PUT, POST,  DELETE  요청

모든 요청에는 기본적으로 인증이 필요하지만 PUT, POST, DELETE 에는 한 단계 더 높은 수준의 보안이 필요하다.

 
POST 요청에는 401이 나오는 것을 확인 할 수 있다.
Spring Security 는 csrf 토큰 없이는 post 를 승인하지 않기 때문이다.
 

void shouldCreateANewCashCard() throws Exception {
  String location = this.mvc.perform(post("/cashcards")
      .with(csrf())

 
 

✔참고

https://spring.academy/courses/spring-academy-secure-rest-api-oauth2