WIPIVERSE

OGNL

OGNL(Object-Graph Navigation Language)은 Java 플랫폼을 위한 오픈 소스 표현 언어(Expression Language, EL)이다. Java 언어가 지원하는 전체 표현 범위보다 간결한 구문을 사용하면서도, JavaBeans 규약을 따르는 객체의 프로퍼티(getProperty/setProperty 메서드)를 읽고 쓰거나, Java 클래스의 메서드를 실행하는 기능을 제공한다. 또한 배열 조작, 리스트 프로젝션(list projection), 선택(selection), 람다 표현식(lambda expression) 등의 추가 기능을 지원한다.

OGNL은 Luke Blanshard와 Drew Davidson이 OGNL Technology에서 창안하였다. 초기에는 프런트엔드 컴포넌트와 백엔드 객체 간의 연결을 프로퍼티 이름으로 매핑하는 방식에서 시작되었으며, 이후 Drew Davidson이 KVCL(Key-Value Coding Language)을 만들었고, Luke Blanshard가 ANTLR을 사용하여 이를 재구현하면서 OGNL이라는 이름을 사용하기 시작하였다. 이후 OpenSymphony에서 개발을 이어받았으나 OpenSymphony는 2011년에 운영을 종료하였고, 현재는 Apache Commons 프로젝트의 일부로 유지보수되고 있다.

OGNL은 Java의 리플렉션(reflection)과 인트로스펙션(introspection)을 사용하여 런타임 애플리케이션의 객체 그래프(Object Graph)에 접근한다. 이를 통해 컴파일 시점이 아닌 객체 그래프의 상태에 기반하여 프로그램 동작을 변경할 수 있다.

OGNL을 사용하는 주요 프로젝트

  • WebWork 및 그 후속인 Apache Struts 2
  • Apache Tapestry (4 및 이전 버전)
  • Spring Web Flow
  • Apache Click
  • MyBatis (SQL 매퍼 프레임워크)
  • Thymeleaf (Java XML/XHTML/HTML5 템플릿 엔진)
  • FreeMarker (Java 템플릿 엔진)

보안 이슈

OGNL은 객체 그래프 내에서 실행 가능한 코드를 생성하거나 변경할 수 있는 특성으로 인해, 이를 사용하는 프레임워크에 심각한 보안 취약점을 야기할 수 있다. Apache Struts 2의 여러 버전에서 OGNL 표현식 주입(OGNL Expression Injection)을 통한 원격 코드 실행(Remote Code Execution, RCE) 취약점이 반복적으로 발견되었다. 대표적으로 CVE-2017-5638(Struts 2 취약점)은 대규모 공격에 악용된 사례로 널리 알려져 있으며, Atlassian Confluence 역시 OGNL 관련 보안 취약점(CVE-2021-26084, CVE-2022-26134 등)으로 여러 차례 영향을 받은 바 있다.

라이선스 및 배포

OGNL은 BSD 라이선스로 배포되며, Java로 작성되어 Java Virtual Machine(JVM) 위에서 동작하는 크로스플랫폼 소프트웨어이다. 최신 버전은 Apache Commons OGNL 저장소(github.com/apache/commons-ognl)를 통해 관리되고 있다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기