웹·앱 백엔드 개발의 절대 비중 ‘Java’, 개발의 핵심 Spring Security의 역할

2024-09-04 17:36
  • 카카오톡
  • 네이버 블로그
  • url
전자정부프레임워크 공통 기능 구현한 컴포넌트 개발 웹 프레임워크...유연성 및 경량화 핵심
Spring Security, 맞춤 보안 기능 제공 통해 잠재적인 보안 위협 차단 가능


[보안뉴스 김영명 기자] 웹 애플리케이션 백엔드 개발 언어는 Java, PHP, ASP.NET이 대표적이다. 특히 우리나라는 Java 사용 비율이 월등히 높다. Java 개발 프레임워크는 Spring, JSF, Hibernate, Structs 등이 있으며, 국내 웹 백엔드 개발에서는 Spring이 사실상 표준이 되고 있다.


▲SQL Injection 공격 과정[이미지=이글루코퍼레이션]

한국지능정보사회진흥원이 제작 및 배포한 전자정부프레임워크는 정부 및 공공기관, 공기업 등의 웹사이트에 자주 사용되는 공통 기능들을 Spring 프레임워크와 대표적인 Java 라이브러리(MyBatis, Apache Commons 등)를 이용해 미리 구현해 놓은 공통 컴포넌트로 이를 개발하기 위한 개발 환경, 실행 환경 등으로 구성된 웹 프레임워크다.

Java Spring 프레임워크는 오픈소스 애플리케이션 프레임워크로 기업 대상으로 확장 가능한 앱을 개발하기 위한 기능과 인프라를 지원하는 경량화된 솔루션이다. 대규모 데이터 처리와 트랜잭션이 동시에 이뤄지는 대규모 환경 개발에 사용된다.

Java Spring 프레임워크 이전에는 서버 사이드 컴포넌트 아키텍처인 Enterprise Java Beans(이하 EJB)를 사용해 웹 애플리케이션을 개발 및 서비스했다. 하지만 EJB는 설정과 개발이 복잡하고, 2.x 이전 버전에서는 여러 파일을 개발자가 직접 만들고 명시적으로 의존성을 관리해야 했다. 또한 기술 구현이 어렵고 환경 설정이 복잡했다. 따라서 기존의 무거운 컨테이너를 대신해 유연성이 큰 경량 프레임워크의 필요성이 대두됐으며, 전 Spring Source 로드 존슨(Rod Johnson) 공동 창립자는 2002년 Java Spring 프레임워크 초기 버전을 공개했다.


▲웹 애플리케이션 개발 프로세스[이미지=이글루코퍼레이션]

Java Spring 프레임워크의 핵심 프로그래밍 모델은 순수 자바 객체(Plain Old Java Object, POJO), 의존성 주입(Dependency Injection, DI), 제어의 역전(Inversion of Control, IoC), 관점 지향 프로그래밍(Aspect-Oriented Programming, AOP), 일관된 서비스 추상화(Portable Service Abstraction, PSA)가 있다.

먼저 ‘순수 자바 객체(Plain Old Java Object)’를 살펴보면, Java Spring 프레임워크는 특정 프레임워크나 라이브러리에 종속되지 않고 순수 자바 객체(Plain Old Java Object, POJO) 기반의 프로그래밍 모델로 앱을 구성한다. 즉, 특정 제약이나 요구사항에 종속되지 않아 Spring 컨텍스트 없이 POJO를 테스트할 수 있어 유연한 코드 작성과 재사용이 쉬워진다.


▲POJO 코드 및 POJO가 아닌 코드(좌부터)[이미지=이글루코퍼레이션]

다음으로 ‘의존성 주입(Dependency Injection)’을 보면, 의존성이란 객체가 서로 의존하는 관계로 하나의 객체가 내부의 다른 객체를 사용하고 있음을 의미한다. Java Spring 프레임워크에는 문제 해결을 위해 객체의 생성과 라이프사이클 관리를 Spring 컨테이너에 위임해 Java Spring이 실행될 때 컨테이너가 의존성이 필요한 객체를 직접 생성하고 관계를 맺어준다. 이렇게 생성된 객체를 빈(Benn)이라고 하며 이러한 일련의 과정을 의존성 주입이라고 한다.

세 번째로 ‘제어의 역전(Inversion of Control)’은 객체의 생성과 객체 간의 의존성 관리를 개발자가 아닌 Spring 컨테이너가 담당하도록 해 객체 간의 결합도를 낮추고 애플리케이션의 유연성과 재 사용성을 높이는 디자인 패턴이다.

네 번째로 ‘관점 지향 프로그래밍(Aspect-Oriented Programming)’은 애플리케이션 또는 소프트웨어 개발에서 비즈니스 로직과 별개로 여러 모듈에서 공통으로 필요한 로깅, 보안, 트랜잭션 관리, 예외 처리 등의 부가 기능을 분리해 모듈화하는 것이다.

다섯 번째로 ‘일관된 서비스 추상화(Portable Service Abstraction)’는 다양한 플랫폼과 환경에서 동일한 서비스를 사용하도록 제공하는 기능으로, 트랜잭션 관리, 메시징, 이메일 등 다양한 서비스를 서비스 추상화로 만든다. 이를 통해 개발자는 일관된 서비스를 사용하게 된다.


▲Java Spring 환경에서의 HTTP 요청 처리 흐름도[이미지=이글루코퍼레이션]

다음으로 Spring Security 프레임워크를 살펴본다. 웹 애플리케이션에서의 보안 기능은 서비스 측면과 밀접한 관계로 비즈니스 로직, 모듈, 네트워크 등에 미치는 영향을 고려하고, 다양한 공격 기법에 대응 및 복잡한 보안 요구사항은 보안 기능 구현의 어려움을 가중시킨다. 이를 개선하기 위해 Java Spring 프레임워크의 서브 프로젝트로 시작된 것이 바로 Spring Security이다. Spring Security는 Java Spring 프레임워크 환경에 맞춤 보안기능을 제공하는 강력하고 포괄적인 프레임워크다. 주요 기능은 사용자 인증, 권한 부여, 웹 기반 보안 설정, 보안 이벤트 처리, XSS(Cross-Site Script) 및 CSRF(Cross-Site Request Forgery) 방어가 있다.

Spring Security의 주요 아키텍처를 보면 Java Spring MVC 프레임워크에서 클라이언트로부터의 모든 HTTP 요청은 DispatcherServlet이 먼저 수신한다. DispatcherServlet은 Java EE의 HttpServlet 클래스를 상속받아 구현된 프론트 컨트롤러로, 수신한 HTTP 요청 정보에 기반해 적절한 컨트롤러에 요청 처리를 위임하는 역할을 한다. 또한, 운영 환경에 따라 서버로 들어오는 모든 요청을 공통으로 적용할 부가 작업이 있을 때는 Filter가 이를 처리한다.

javax.servlet.Filter 인터페이스를 구현한 클래스인 Filter는 Java Spring 컨테이너 외부의 웹 컨테이너에 위치한다. Filter 단계에서 인증, 인가, 로깅, 인코딩 등의 보안 기능을 수행하면 Java Spring 컨테이너에 도달하기 전에 잠재적인 보안 위협을 차단할 수 있다.

Spring Security에 의해 인증된 사용자의 정보는 SecurityContextHolder에 저장된다. 개발자는 필요할 때 SecurityContextHolder를 참조해 보안 컨텍스트에 접근할 수 있으며 현재 사용자의 권한 확인이나 사용자 정보를 가져와 보안 정보를 효율적으로 사용하게 된다.

클라이언트와 서버 분리가 요구되면서 다양한 웹 기반의 Java 기술이 등장하고, 기술적 변화는 프로젝트 구성의 복잡성을 유발하며 개발 속도 저하를 가져왔다. Java Spring 벤더는 이러한 문제를 개선하고 현대적인 개발 환경에 맞는 서비스를 제공하기 위해 Spring Boot Starter 프로젝트를 공개했다. Spring Boot Starter는 간편한 설정, 빠른 시작 및 개발 속도 향상, 자동 설정, 내장 서버, 운영 편의성 등을 중점으로 개발됐다. Spring Boot는 모듈화된 형태로 제공돼 기존보다 의존성 관리가 훨씬 간단해졌고, 웹 서버가 하나의 파일에 내장된 상태로 빌드되어 배포도 간편해졌다. 또한, 복잡한 Java Spring 설정을 자동화해 개발자가 쉽고 빠르게 애플리케이션을 개발할 수 있는 환경을 갖추게 됐다.


▲CSRF(Cross-Site Request Forgery) 공격 시나리오[이미지=이글루코퍼레이션]

Spring Security를 활용한 인증 단계의 SQL 인젝션(SQL Injection) 방어를 살펴본다. 사용자 로그인 수행 단계에서 발생할 수 있는 대표적인 보안 위협에는 SQL Injection, 인증 정보 유출, 인증 시도 제한 기능 부재, 가짜 웹 사이트를 이용한 피싱, 취약한 비밀번호 허용 등이 있다. 이 중에서도 가장 위험도가 높은 취약점은 SQL Injection이다.

SQL Injection 취약점은 권한이 없는 사용자가 인증 단계를 우회해 타 사용자의 계정으로 로그인하거나, 데이터베이스에 저장된 데이터를 조회, 수정, 삭제할 수 있고 더 나아가 저장 프로시저를 악용해 원격에서 시스템 명령어를 실행하는 것도 가능하다.

이때 문제의 사용자 인증 쿼리 구조를 살펴보면, 외부 입력 값을 동적으로 쿼리에 할당해 사용자가 입력한 값을 문자열 그대로 삽입하며 작동한다. 반면에 formLogin API를 사용한 경우, 추가적인 입력 값 검증 없이도 SQL Injection 공격으로부터 안전함을 확인할 수 있다.


▲인증 및 인가 간략 요청 흐름도[이미지=이글루코퍼레이션]

다음으로 Spring Security를 활용한 크로스사이트 요청 위조(Cross-Site Request Forgery) 방어에 대해 살펴본다. 크로스사이트 요청 위조(Cross-Site Request Forgery, 이하 CSRF)는 웹 애플리케이션 환경에서 발생하는 보안 취약점 중 하나로, 공격자가 사용자로 가장해 사용자가 의도하지 않은 요청을 서버에 보내도록 하는 공격이다. CSRF 공격은 사용자가 현재 인증된 세션을 유지하고 있을 때 발생하며, 공격자는 사용자의 권한을 도용해 자동 게시글 등록, 정보 수정, 회원 가입 등의 악의적인 요청을 수행할 수 있다.

CSRF 취약점에 알려진 대응방안으로는 HTTP GET 메서드 대신 POST 메서드 사용, CSRF 토큰 사용, HTTP Referer 헤더 검사, SameSite 쿠키 속성 사용, Double Submit Cookie 등이다. Spring Security는 이 대응을 위해 CSRF 토큰 생성 및 검증 기능을 제공한다.

Spring Security는 CsrfFilter를 통해 CSRF 토큰을 자동으로 생성하고 관리하는 기능을 제공한다. 먼저 서버로 HTTP 요청이 수신되면, 보안 필터 체인이 동작해 요청을 처리한다. 이 과정에서 안전한 HTTP 메서드 요청은 허용하고 다른 모든 요청은 CSRF 토큰이 포함된 헤더나 요청 매개변수가 존재하는지 검사해 유효성을 확인한다.

이글루코퍼레이션 관계자는 “지금까지 Spring Security의 CSRF 보호 기능이 어떠한 방식으로 CSRF 공격을 효과적으로 방어하는지 살펴봤다”며 “다만 CSRF 토큰은 HTML 폼 필드에 숨겨져 있어 클라이언트 측에서 페이지 조작이 가능하다면 공격자는 이 토큰을 탈취해 보호 기능을 무력화할 수 있다”고 설명했다. 이어 “Spring Security는 이번에 다룬 인증, 인가, CSRF 방어 외에도 XSS 방지, 세션 고정 공격 방지, 클릭재킹 방지 등 여러 보안 기능을 기본으로 지원한다”며 “곧 출시 예정인 7.x 버전에서는 더욱 강력한 보안기능이 제공될 것”이라고 덧붙였다.
[김영명 기자(boan@boannews.com)]

<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>

헤드라인 뉴스

TOP 뉴스

이전 스크랩하기


과월호 eBook List 정기구독 신청하기

    • 이노뎁

    • 인콘

    • 엔텍디바이스코리아

    • 마이크로시스템

    • 다봄씨엔에스

    • 아이디스

    • 씨프로

    • 웹게이트

    • 씨게이트

    • 하이크비전

    • 한화비전

    • ZKTeco

    • 비엔에스테크

    • 비엔비상사

    • 원우이엔지
      줌카메라

    • 지인테크

    • 인텔리빅스

    • 이화트론

    • 다누시스

    • 테크스피어

    • 렉스젠

    • 슈프리마

    • 혜성테크윈

    • 시큐인포

    • 미래정보기술(주)

    • 비전정보통신

    • 다후아테크놀로지코리아

    • 경인씨엔에스

    • 지오멕스소프트

    • 성현시스템

    • 한국씨텍

    • 프로브디지털

    • 디비시스

    • 유니뷰코리아

    • 스피어AX

    • 투윈스컴

    • 세연테크

    • 트루엔

    • 위트콘

    • 유에치디프로

    • 주식회사 에스카

    • 포엠아이텍

    • 세렉스

    • 안랩

    • 제이슨

    • 에스지에이솔루션즈

    • 이롭

    • 샌즈랩

    • 쿼리시스템즈

    • 신우테크
      팬틸드 / 하우징

    • 에프에스네트워크

    • 네이즈

    • 케이제이테크

    • 셀링스시스템

    • 에이티앤넷

    • 아이엔아이

    • (주)일산정밀

    • 새눈

    • 에스에스티랩

    • 유투에스알

    • 태정이엔지

    • 네티마시스템

    • HGS KOREA

    • 에이앤티코리아

    • 미래시그널

    • 두레옵트로닉스

    • 지와이네트웍스

    • 넥스트림

    • 에이앤티글로벌

    • 현대틸스
      팬틸트 / 카메라

    • 지에스티엔지니어링
      게이트 / 스피드게이트

    • 동양유니텍

    • 모스타

    • 엔에스정보통신

    • 구네보코리아주식회사

    • 엘림광통신

    • 엔시드

    • 넥스텝

    • 메트로게이트
      시큐리티 게이트

    • 포커스에이치앤에스

    • 티에스아이솔루션

    • 엠스톤

    • 글로넥스

    • 유진시스템코리아

    • 카티스

    • 세환엠에스(주)

Copyright thebn Co., Ltd. All Rights Reserved.

MENU

회원가입

Passwordless 설정

PC버전

닫기