spring security를 알아보자 - 1
ㅇ 보안이 중요한 이유
웹 애플리케이션이 중요한 데이터를 갖고있기 때문에 데이터 보호 뿐 아니라 비지니스 로직또한 보호해야 한다.
구글 검색엔진만해도 많은 알고리즘을 갖고있고, 이것을 보안으로 보호하고있다.
비기능적 요구사항은 고객의 비지니스 로직과 상관이 없는 요구사항으로 보안,성적,코딩기준 모두 비기능적 요구사항.
우린 개발단계부터 보안을 생각해야함.
인증과 권한을 구현하는것은 개발자의 몫이다.
왜 보안이 중요한가? 없으면 데이터 침애, 보안 취약점, 웹앱 내의 공격으로 이어질 수 있다.
CSRF, XSS rhdrur, 취약한 인증공격과 같이 보안공격들이 존재하는데 모두 고려해햐함.
ㅇ 보안없이 간단한 spring boot 앱 구현
spring initializr에서 그동안은 프로젝트 유형을 gradle-groovy로만 만들었는데 이번 강의에서는 Maven을 선택했다.
이렇게 하고 프로젝트를 열어보자.
그리고 저기 build module ~ 를 누르고
컨트롤러를 만들어보자.
controller 패키지를 만들고 거기에 Java Class로 WelcomeController를 만들고
@RestController를 붙혀주자. 그리고 @GetMapping("/welcome") 을 붙혀주고 String을 반환하는 sayWelcome메서드를 만들어 아무 문장이나 return 하고, springbootapplication 을 run 해보고 localhost:8080/welcome 에 들어가보면
이렇게 내가 리턴해놓은 문장이 뜬다.
이렇게 보안없는 REST 서비스를 만든것이다.
이제 이 애플리케이션을 보안으로 보호해보자.
지금은 아무나 서비스를 호출을 할수있고 응답을 받을 수 있다.
Spring Security 의존성을 추가해보자.
Spring Security에서 기본으로 제공하는 Username은 user 이므로, user를 입력하고 로그에 password를 입력하면 다시 localhost:8080/welcome 으로 잘 들어가진다.
Spring Security는 매번 이렇게 password를 요구하지않는다. 같은 브라우저만 사용한다면 유저의 세션ID나 토큰 세부 정보를 저장해줘서 계속 자격증명을 요구하지 않는다.
하지만 서버를 재시작할때마다 새로우 패스워드가 생성되어 편리하지 않다.
고유의 username과 password를 설정해서 사용해보자.
그러려면 애플리케이션 속성파일인 application.properties에서 설정을 따로 해줘야 한다.
공식문서에 아래와같이 나와있다.
이렇게 설정해줬다.
이렇게 재시작할때마다 새로운 비밀번호를 찾을필요가없어졌다.
ㅇ Spring Security를 사용하는 이유
애플리케이션 보호는 항상 재밌지않다. 고유의 코드나 고유단체 프레임워크를 적용해서 웹앱을 보호하는것은 매우 어려움.
Spring Security 팀이 따로 존재해 보안에만 집중하는 개발자들로 이뤄져 우리는 사용만하면 수준높은 보안을 구현하기 쉽기 때문이다.
인증 및 권한부여에 다양한 보안기준을 지원한다.
ㅇ 서블릿과 필터
Spring Security의 내부 플로우는 위의 사진처럼 흐른다.
그 전에 알아야할것이 Java 의 서블릿과 필터다.
나도 사실 정확히 이해하고 사용하지못했었다. 이번기회에 알아보자.
Java 웹앱은 요청을 받으면 그걸 HTTP 프로토콜로 전송한다. 브라우저는 HTTP 프로토콜을 이용해 웹앱에 요청을 보낼수가 있다. 하지만 Java 웹앱은 HTTP 요청을 이해할 수 없다. 고로 Java 코드와 브라우저 사이에서 중계자의 역할이 필요한데 그것이 서블릿 컨테이너(웹 서버)다. 서블릿 컨테이너가 하는일은 브라우저로부터 받은 HTTP 메시지를 ServletRequest object 로 변환함. Java 코드 프레임워크에 이 object 를 준다. 다시 브라우저 요청을 보내려고 할때, 서블릿 컨테이너는 HTTP ServletRequest object를 가지고 브라우저가 이해할 수 있는 HTTP 메시지로 변환해줌. 서블릿은 이렇게 중요한만큼 복잡하다. 하지만 또 복잡한만큼 아무도 직접사용하지 않는다. 그것이 우리가 Spring, Spring boot 를 사용하는 이유다. 그저 우리는 REST 서비스, MVC paths, 웹페이지를 지정하는데 그럼 spring ,spring boot가 자동으로 서블릿을 생성해주고 담당해 처리해준다.
필터는 특별한 종류의 서블릿으로, 웹애플리케이션에 들어오는 모든 요청을 가로 챌 수 있다. 이런 필터에는 실질적인 비지니스 로직이 실행되기 전에 일어나길 바라는 프리로직을 정의할 수 있다. 이런 필터를 사용해야지만 Spring Security는 웹애플리케이션에 한 설정에 따라 보안을 시행함.