jQuery 기반의 무료 차트 라이브러리 소개

웹 개발자라면 데이터 시각화가 얼마나 중요한지 잘 알고 계실 겁니다. 데이터를 시각적으로 표현하면 사용자에게 더 직관적이고 이해하기 쉬운 정보를 제공할 수 있습니다. 오늘은 jQuery 기반의 무료 차트 라이브러리 몇 가지를 소개해드리겠습니다.

1. Chart.js

Chart.js는 HTML5 기반의 차트 라이브러리로, 간단하고 명확한 API를 제공하여 다양한 차트를 쉽게 만들 수 있습니다. 라인 차트, 바 차트, 파이 차트 등 다양한 차트 유형을 지원하며, 커스터마이징이 용이합니다. Chart.js는 특히 초보자에게 추천할 만한 라이브러리입니다. 또한, Chart.js는 반응형 디자인을 지원하여 다양한 디바이스에서 차트를 아름답게 표시할 수 있습니다. Chart.js의 문서화가 잘 되어 있어, 사용자가 쉽게 시작할 수 있습니다.

라이선스: MIT 라이선스
GitHub: Chart.js
웹사이트: Chart.js

2. jqPlot

jqPlot은 jQuery 기반의 차트 플러그인으로, 다양한 차트 유형을 지원합니다. 라인 차트, 바 차트, 파이 차트 등 기본적인 차트 외에도 캔들스틱 차트와 같은 고급 차트도 구현할 수 있습니다. 또한, 플러그인 구조로 되어 있어 필요에 따라 기능을 확장할 수 있습니다. jqPlot은 다양한 플러그인과 함께 사용할 수 있어, 차트의 기능을 더욱 풍부하게 만들 수 있습니다. 또한, jqPlot은 다양한 브라우저와 호환되며, 모바일 디바이스에서도 원활하게 작동합니다.

라이선스: MIT 라이선스
GitHub: jqPlot
웹사이트: jqPlot

3. Flot

Flot은 jQuery 기반의 차트 라이브러리로, 인터랙티브한 차트를 쉽게 만들 수 있습니다. 플러그인 구조로 되어 있어 다양한 기능을 추가할 수 있으며, 성능이 뛰어나 대용량 데이터 처리에도 적합합니다. Flot은 특히 실시간 데이터 시각화에 강점을 가지고 있습니다. 또한, Flot은 다양한 브라우저와 호환되며, 모바일 디바이스에서도 원활하게 작동합니다. Flot의 문서화가 잘 되어 있어, 사용자가 쉽게 시작할 수 있습니다.

라이선스: MIT 라이선스
GitHub: Flot
웹사이트: Flot

4. Highcharts (무료 버전)

Highcharts는 강력한 기능을 제공하는 차트 라이브러리로, 상업용으로는 유료이지만 비상업용 프로젝트에서는 무료로 사용할 수 있습니다. 다양한 차트 유형을 지원하며, 커스터마이징이 용이하고, 문서화가 잘 되어 있어 사용하기 편리합니다. Highcharts는 다양한 데이터 소스와 통합할 수 있어, 복잡한 데이터 시각화에도 적합합니다. 또한, Highcharts는 반응형 디자인을 지원하여 다양한 디바이스에서 차트를 아름답게 표시할 수 있습니다.

라이선스: 비상업용 프로젝트에 한해 무료
GitHub: Highcharts
웹사이트: Highcharts

5. Morris.js

Morris.js는 간단하고 사용하기 쉬운 jQuery 기반의 차트 라이브러리로, 라인 차트, 바 차트, 도넛 차트 등을 지원합니다. Morris.js는 특히 데이터 시각화의 미적 요소에 중점을 두어, 아름답고 직관적인 차트를 만들 수 있습니다. 또한, Morris.js는 JSON 데이터를 쉽게 처리할 수 있어, 동적인 데이터 시각화에 적합합니다. Morris.js의 문서화가 잘 되어 있어, 사용자가 쉽게 시작할 수 있습니다.

라이선스: MIT 라이선스
GitHub: Morris.js
웹사이트: Morris.js

6. Billboard.js

Billboard.js는 네이버에서 개발한 jQuery 기반의 차트 라이브러리로, 다양한 차트 유형을 지원하며, 사용하기 쉽고 강력한 기능을 제공합니다. Billboard.js는 특히 반응형 디자인을 지원하여 다양한 디바이스에서 차트를 아름답게 표시할 수 있습니다. 그러나 최신 버전에서는 Internet Explorer(IE)를 지원하지 않으므로, 다른 브라우저를 사용하는 것이 좋습니다.

라이선스: MIT 라이선스
GitHub: Billboard.js
웹사이트: Billboard.js

7. Dygraphs

Dygraphs는 대용량 데이터 시각화에 적합한 jQuery 기반의 차트 라이브러리입니다. 실시간 데이터 업데이트와 줌 기능을 지원하여, 복잡한 데이터를 효과적으로 시각화할 수 있습니다. Dygraphs는 특히 금융 데이터 시각화에 강점을 가지고 있습니다.

라이선스: MIT 라이선스
GitHub: Dygraphs
웹사이트: Dygraphs

8. Sparklines

Sparklines는 작은 크기의 차트를 생성하는 데 특화된 jQuery 기반의 차트 라이브러리입니다. 주로 데이터 테이블이나 텍스트 내에 삽입하여 간단한 데이터 시각화를 제공하는 데 사용됩니다. Sparklines는 다양한 차트 유형을 지원하며, 사용하기 쉽고 가벼운 라이브러리입니다.

라이선스: MIT 라이선스
GitHub: Sparklines
웹사이트: Sparklines

결론

jQuery 기반의 무료 차트 라이브러리는 다양하게 존재하며, 각 라이브러리마다 장단점이 있습니다. 프로젝트의 요구사항에 맞는 라이브러리를 선택하여 데이터를 효과적으로 시각화해보세요. 위에서 소개한 라이브러리들은 모두 사용하기 쉽고 강력한 기능을 제공하므로, 여러분의 웹 개발 프로젝트에 큰 도움이 될 것입니다.

IE에서 사용가능한 배열에서 중복 제거하기 

	    this.removeDuplicates = function(arr) {
	        var uniqueArray = [];
	        var seen = {}; // 이미 본 값을 추적하는 객체

	        for (var i = 0; i < arr.length; i++) {
	            if (!seen[arr[i]]) { // 이미 본 값이 아니면
	                uniqueArray.push(arr[i]); // 배열에 추가
	                seen[arr[i]] = true; // 본 값을 추적
	            }
	        }
	        return uniqueArray;
	    }

'Web > Javascript' 카테고리의 다른 글

TypeScript를 공부 가이드  (0) 2023.02.27
toString()의 사용법과 활용 예시  (0) 2023.02.14
조건문 좀더 편하게 사용하기  (0) 2023.01.13

쉽게 말해..서비스에 걸리는 부하를 분산해주는 로드 밸런서입니다.

 

ALB나 기타 로드밸런서들은  서비스의 부하를 줄여 안정성과 가용성을 기대할 수 있습니다.

그중 ALB는 아래와 같은 장점을 가지고 있습니다. 

  -  고가용성 지원
  -  사용자 인증과 같은 보안 향상
  -  다양한 레벨의 부하에 대한 유연한 응답
  -  애플리케이션 밀착 모니터링 및 검수

 

AWS ALB vs. ELB: 로드 밸런서 비교

AWS에서 제공하는 로드 밸런서에는 여러 종류가 있지만, 특히 **Application Load Balancer (ALB)**와 **Elastic Load Balancer (ELB)**가 많이 사용됩니다. 이 두 로드 밸런서는 각기 다른 기능과 용도로 설계되었으며, 이 포스트에서는 그 차이점을 알아보겠습니다.

ELB (Elastic Load Balancer)

  • 정의: ELB는 AWS의 전반적인 로드 밸런싱 솔루션의 총칭으로, Classic Load Balancer를 포함합니다.
  • 기능:
    • TCP 및 HTTP/HTTPS 트래픽 지원
    • EC2 인스턴스 간의 트래픽 분산
  • 용도: 단순한 레이어 4(전송 계층) 로드 밸런싱이 필요할 때 적합
  • 설정: 간단한 설정, 기본적인 로드 밸런싱 기능 제공

ALB (Application Load Balancer)

  • 정의: ALB는 ELB의 한 종류로, 애플리케이션 계층에 최적화된 로드 밸런서입니다.
  • 기능:
    • 레이어 7(애플리케이션 계층)에서 작동
    • URL 기반 및 호스트 기반 라우팅 지원
    • WebSocket 및 HTTP/2 지원
  • 용도: 마이크로서비스 아키텍처와 복잡한 웹 애플리케이션에 적합
  • 설정: 다양한 라우팅 옵션과 고급 기능 제공, 설정이 다소 복잡할 수 있음

주요 차이점 요약

기능/특징ELBALB

계층 레이어 4 레이어 7
지원하는 트래픽 TCP, HTTP/HTTPS HTTP/HTTPS
라우팅 기능 기본적인 로드 밸런싱 복잡한 라우팅 규칙 가능
용도 간단한 트래픽 분산 마이크로서비스 및 복잡한 웹 애플리케이션

 

이러한 차이점을 바탕으로, 애플리케이션의 필요에 따라 적절한 로드 밸런서를 선택하는 것이 중요합니다.

1.환경

ALB(Application Load Balancer) 사용

SSL 인증서 적용

HTTPS 통신만 허용

ALB -> Tomcat 형태의 인프라 구성

 

2.현상

Request Header에 Content-Type을 포함한 여러 해더정보를 전송하였고 Method는 POST를 이용했다.

그러나 서버에 수신된 Request Header는 Content-Type이 Null이고 Method도 GET으로 수신이 되었다.

 

파일업로드 처리를 위해 httpservletrequest 를 multiparthttpservletrequest 로 캐스팅 하는과정에 Cast Exception이 발생하였다.

 

Request Body또한 비어 있어 inputstream을이용하여 강제로 꺼내보려 했지만 꺼낼 수 없었다.

 

3.원인 및 해결방법

클라이언트에서 http를 이용하여 요청이 올경우 ALB에서 https로 포워딩 해주게 된다.

그 과정에 Content-Type을 잃어버리고 Method도 Get으로 변경되며 Request Body도 유실되는 상황이 발생함.

Spring framework의 @Requestbody 어노테이션도 당연히 안되었다.

 

3-1. 해결방법 #1

http로밖에 전송할 수 없는 상황인경우 ALB의 특정URL 패턴에 예외를 두어 http 통신이 될 수 있도록 조치한다.

 

3-2 해결방법 #2

당연한 소리겠지만 스펙에 맞게 https로 request요청을 송신한다.

 

 

4.잡설

나는 서버에 request를 송신하는 주체가 브라우저가 아닌 다른 CS 프로그램으로 해당 프로그램에서 http로만 전송이 가능하도록 개발되어 있었고.. http로 통신가능하도록 ALB에 요청을 한뒤 테스트하여 해결방안에 대한 방향성을 찾을 수 있었다.

스프링을 사용한다면 MultipartResolver를 설정하고,  전송되는 form Tag에 enctype="multipart/form-data" 옵션을 추가하고 등등 여러가지 글이 있지만 해결되지 않아서 고생을 했지만.....

 

 

import javax.sql.DataSource;

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@PropertySource("classpath:/application.properties")
public class DatasourceConfiguration {
	@Autowired
	private ApplicationContext applicationContext;
	
	@Bean
	@ConfigurationProperties(prefix="spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		return new HikariConfig();
	}
	
	@Bean
	public DataSource dataSource() throws Exception {
		DataSource dataSource = new HikariDataSource(hikariConfig());
		return dataSource;
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		
		sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
		sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*Mapper.xml"));
		return sqlSessionFactoryBean.getObject();
	}

	
	@Bean(name="batchSqlSessionTemplate") 
	public SqlSessionTemplate batchSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { 
		 return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH); 
	}
	
	@Bean(name="sqlSessionTemplate") 
	public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
	
	
	/**
	 * 트렌젝션 관리
	 * @param dataSource
	 * @return
	 */
	@Bean
	public PlatformTransactionManager transactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
	

	
}

 

 

 

 

아래와같이 적용

	/**
	 * DB컨넥션 후 Connection객체를 반환한다.
	 * @return
	 * @throws SQLException
	 */
	private Connection getConnection() throws Exception{

		ApplicationContext ctx = ApplicationContextAwareExtends.getApplicationContext();
		DataSource dataSource =  ctx.getBean(DatasourceConfiguration.class).dataSource();
		
		return dataSource.getConnection();
	}
1. 연결 유지
tools -> Preferences -> Oracle -> Connection -> Check connection 체크

2. 연결 정보 저장
tools -> Preferences -> Oracle -> Logon History -> Definition -> Store with password 체크

3. 자동 선택 하여 쿼리 실행
tools -> Preferences -> Window Types -> SQL Window -> AutoSelect statement 체크
체크 하지 않는 경우 실행 하고자 하는 쿼리를 블럭 지정 후, F8 키를 눌러 실행 하여야 한다.체크 한 경우 F8 키로 쿼리 실행시 세미콜론(;) 단위로 실행 한다.

4. Null 값의 셀 색상 설정
tools -> Preferences -> Window Types -> SQL Window -> Null value cell color 에서 선택

5. 글꼴 설정
tools -> Preferences -> User Interface -> Fonts 에서 설정

 

환경 구성

ALB / tomcat9 / spring boot 2.5.7

 

application.properties에 아래와같이 수정하여도 실제 적용이 안되는 경우

server.servlet.session.cookie.domain = [도메인]
server.servlet.session.cookie.path = /
server.servlet.session.cookie.http-only= true
server.servlet.session.cookie.same-site=None
server.servlet.session.cookie.secure=true

 

해당 설정이 적용되지 않는 이유는  AWS의 ALB를 사용하는 경우에는  AWS ALB가 기본적으로 HttpOnly 속성은 적용하고, SameSite, Secure 속성은 적용하지 않기 때문에 타겟 그룹 설정에서 쿠키 설정을 변경해야 한다고 한다.

 

하지만 ALB에서 설정을 안해주는 경우가 있다. (다른분들은 다 그냥 하시던데요..??)

 

그럼 남은건 Tomcat에 설정하는 방법이다.

 

Cookie secure 설정 : tomcat폴더/conf/sever.xml 파일을 수정한다.

<Connector connectionTimeout="20000" port="88" protocol="HTTP/1.1" redirectPort="8443" secure="true"
/>

위의 내용과 같이 https 설정이 아니어도 그냥 secure 설정 한다. (https/SSL인증서 설정은 ALB에 되어있다.)

 

sameSite 설정 : 

 

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
    <!-- sameSite -->
    <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor" sameSiteCookies="Strict"/>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />

 

 

 

 

 

@Value 어노테이션으로 application.properties의 값을 가져올 수 있습니다. 

 

@Value 어노테이션은 Spring boot에서 제공하는 어노테이션입니다. 빈(bean)이 생성되는 시점에 

값을 할당하기 위해 사용됩니다. 

 

일반적으로 개발, 품질, 운영서버와 같이 환경 값이 변경되는 경우 application.properties에 설정된 값을 사용하기 위해 사용되기도 합니다. 

 

아래와 같이 application.properties에 값이 설정되어 있을 때

#EAI Call Url
eai.call.url=http://abc.abccdd.com/restapi/

 

@Value 어노테이션을 이용하여 갑을 주입하는 방법은 아래와 같습니다.

@Value("${eai.call.url}")
private String eaiUrl;

 

eaiUrl이라는 String 변수에 http://abc.abccdd.com/restapi/ 값이 담기게 됩니다. 

 

주의할 점은 변수 선언시 static으로 선언하면 값이 주입되지 않습니다. 

<project xmlns="http://maven.apache.org/POM/4.0.0"

             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

             <modelVersion>4.0.0</modelVersion>

             <parent>

                           <groupId>org.springframework.boot</groupId>

                           <artifactId>spring-boot-starter-parent</artifactId>

                           <version>2.5.7</version>

                           <relativePath/>

             </parent>

             <groupId>ap-drwb</groupId>

             <artifactId>ap-drwb</artifactId>

             <version>1.0.0</version>

             <packaging>war</packaging>

             <name>drwb</name>

             <description>drwb</description>


 

             <properties>

                           <java.version>17</java.version>

                           <spring.version>5.3.13</spring.version>

                           <spring.boot.version>2.5.7</spring.boot.version>

                           <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

             </properties>


 

             <repositories>

                           <repository>

                                        <id>cenrtal</id>

                                        <url>https://repo1.maven.org/maven2/</url>

                           </repository>

                           <repository>

                                        <id>redhat-ga</id>

                                        <url>https://maven.repository.redhat.com/ga/</url>

                           </repository>

                           <repository>

                                        <id>mulesoft-ga</id>

                                        <url>https://repository.mulesoft.org/nexus/content/repositories/public/</url>

                           </repository>

                           <!--

                           <repository>

                                        <id>mergyaPub</id>

                                        <url>https://nexus.emergya.es/nexus/content/repositories/public/</url>

                           </repository>-->

             </repositories>


 

             <dependencies>

                           <!-- marked the embedded servlet container as provided --> 

                           <dependency>

                               <groupId>javax.servlet</groupId>

                               <artifactId>javax.servlet-api</artifactId>

                               <scope>provided</scope>

                           </dependency>

                           <dependency>

                               <groupId>org.bouncycastle</groupId>

                               <artifactId>bcmail-jdk14</artifactId>

                               <version>1.38</version>

                           </dependency>

                           <dependency>

                               <groupId>org.bouncycastle</groupId>

                               <artifactId>bcprov-jdk14</artifactId>

                               <version>1.38</version>

                           </dependency>

                           <dependency>

                               <groupId>org.bouncycastle</groupId>

                               <artifactId>bctsp-jdk14</artifactId>

                               <version>1.38</version>

                           </dependency>

                           <dependency>

                               <groupId>org.codehaus.castor</groupId>

                               <artifactId>castor</artifactId>

                               <version>1.2</version>

                           </dependency>

                           <dependency>

                               <groupId>commons-beanutils</groupId>

                               <artifactId>commons-beanutils</artifactId>

                               <version>1.8.3</version>

                           </dependency>

                           <dependency>

                               <groupId>commons-codec</groupId>

                               <artifactId>commons-codec</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>commons-collections</groupId>

                               <artifactId>commons-collections</artifactId>

                               <version>3.2</version>

                           </dependency>

                           <dependency>

                               <groupId>commons-dbcp</groupId>

                               <artifactId>commons-dbcp</artifactId>

                               <version>1.4</version>

                           </dependency>

                           <dependency>

                               <groupId>commons-digester</groupId>

                               <artifactId>commons-digester</artifactId>

                               <version>2.1</version>

                           </dependency>

                           <dependency>

                               <groupId>commons-lang</groupId>

                               <artifactId>commons-lang</artifactId>

                               <version>2.4</version>

                           </dependency>

                           <dependency>

                               <groupId>commons-logging</groupId>

                               <artifactId>commons-logging</artifactId>

                               <version>1.1.1</version>

                           </dependency>

                           <dependency>

                               <groupId>dom4j</groupId>

                               <artifactId>dom4j</artifactId>

                               <version>1.6.1</version>

                           </dependency>

                           <dependency>

                               <groupId>org.eclipse.jdt</groupId>

                               <artifactId>ecj</artifactId>

                               <version>3.18.0</version>

                           </dependency>

                           <dependency>

                               <groupId>net.sf.ezmorph</groupId>

                               <artifactId>ezmorph</artifactId>

                               <version>1.0.4</version>

                           </dependency>

                           <dependency>

                               <groupId>com.zaxxer</groupId>

                               <artifactId>HikariCP</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.fasterxml.jackson.core</groupId>

                               <artifactId>jackson-annotations</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.fasterxml.jackson.core</groupId>

                               <artifactId>jackson-core</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.fasterxml.jackson.core</groupId>

                               <artifactId>jackson-databind</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.fasterxml.jackson.datatype</groupId>

                               <artifactId>jackson-datatype-jdk8</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.fasterxml.jackson.datatype</groupId>

                               <artifactId>jackson-datatype-jsr310</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.fasterxml.jackson.module</groupId>

                               <artifactId>jackson-module-parameter-names</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>jakarta.annotation</groupId>

                               <artifactId>jakarta.annotation-api</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.jasypt</groupId>

                               <artifactId>jasypt</artifactId>

                               <version>1.9.3</version>

                           </dependency>

                           <dependency>

                               <groupId>com.sun.mail</groupId>

                               <artifactId>javax.mail</artifactId>

                               <version>1.5.2</version>

                           </dependency>

                           <dependency>

                               <groupId>jfree</groupId>

                               <artifactId>jcommon</artifactId>

                               <version>1.0.15</version>

                           </dependency>

                           <dependency>

                               <groupId>eclipse</groupId>

                               <artifactId>jdtcore</artifactId>

                               <version>3.1.0</version>

                           </dependency>

                           <dependency>

                               <groupId>jfree</groupId>

                               <artifactId>jfreechart</artifactId>

                               <version>1.0.12</version>

                           </dependency>

                           <dependency>

                               <groupId>net.sf.json-lib</groupId>

                               <artifactId>json-lib-ext-spring</artifactId>

                               <version>1.0.2</version>

                           </dependency>

                           <dependency>

                               <groupId>org.slf4j</groupId>

                               <artifactId>jul-to-slf4j</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.apache.logging.log4j</groupId>

                               <artifactId>log4j-api</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>log4j</groupId>

                               <artifactId>log4j</artifactId>

                               <version>1.2.14</version>

                           </dependency>

                           <dependency>

                               <groupId>org.bgee.log4jdbc-log4j2</groupId>

                               <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>

                               <version>1.16</version>

                           </dependency>

                           <dependency>

                               <groupId>org.apache.logging.log4j</groupId>

                               <artifactId>log4j-to-slf4j</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>ch.qos.logback</groupId>

                               <artifactId>logback-classic</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>ch.qos.logback</groupId>

                               <artifactId>logback-core</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.navercorp.lucy</groupId>

                               <artifactId>lucy-xss</artifactId>

                               <version>1.6.3</version>

                           </dependency>

                           <dependency>

                               <groupId>org.mybatis</groupId>

                               <artifactId>mybatis</artifactId>

                               <version>3.5.14</version>

                           </dependency>

                           <dependency>

                               <groupId>org.mybatis</groupId>

                               <artifactId>mybatis-spring</artifactId>

                               <version>3.0.3</version>

                           </dependency>

                           <dependency>

                               <groupId>org.mybatis.spring.boot</groupId>

                               <artifactId>mybatis-spring-boot-starter</artifactId>

                               <version>3.0.3</version>

                           </dependency>

                           <dependency>

                               <groupId>javax.servlet</groupId>

                               <artifactId>jstl</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>javax.activation</groupId>

                               <artifactId>activation</artifactId>

                               <version>1.1.1</version>

                           </dependency>

                           <!-- OJDBC-->

                           <dependency>

                               <groupId>com.oracle.database.jdbc</groupId>

                               <artifactId>ojdbc11</artifactId>

                               <version>21.1.0.0</version>

                           </dependency>

                           <dependency>

                               <groupId>com.mchange</groupId>

                               <artifactId>mchange-commons-java</artifactId>

                               <version>0.2.15</version>

                           </dependency>

                           <dependency>

                               <groupId>org.apache.poi</groupId>

                               <artifactId>poi</artifactId>

                               <version>3.9</version>

                           </dependency>

                           <dependency>

                               <groupId>org.apache.poi</groupId>

                               <artifactId>poi-ooxml</artifactId>

                               <version>3.9</version>

                           </dependency>

                           <dependency>

                               <groupId>org.apache.poi</groupId>

                               <artifactId>poi-ooxml-schemas</artifactId>

                               <version>3.9</version>

                           </dependency>

                           <dependency>

                               <groupId>org.quartz-scheduler</groupId>

                               <artifactId>quartz</artifactId>

                               <version>2.3.2</version>

                           </dependency>

                           <dependency>

                               <groupId>org.yaml</groupId>

                               <artifactId>snakeyaml</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.slf4j</groupId>

                               <artifactId>slf4j-api</artifactId>

                           </dependency><!--

                           <dependency>

                               <groupId>org.springframework.boot</groupId>

                               <artifactId>spring-boot</artifactId>

                               <version>${spring.boot.version}</version>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework.boot</groupId>

                               <artifactId>spring-boot-autoconfigure</artifactId>

                               <version>${spring.boot.version}</version>

                           </dependency>-->

                 <dependency> 

                     <groupId>org.springframework.boot</groupId> 

                     <artifactId>spring-boot-starter-tomcat</artifactId>

                     <scope>provided</scope> 

                 </dependency>

                 <dependency>  

                                        <groupId>org.springframework.boot</groupId>  

                                        <artifactId>spring-boot-starter-web</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework</groupId>

                               <artifactId>spring-web</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework</groupId>

                               <artifactId>spring-jdbc</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework</groupId>

                               <artifactId>spring-context-support</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework</groupId>

                               <artifactId>spring-expression</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework</groupId>

                               <artifactId>spring-webmvc</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework.security</groupId>

                               <artifactId>spring-security-web</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.springframework.security</groupId>

                               <artifactId>spring-security-config</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>org.apache.tomcat.embed</groupId>

                               <artifactId>tomcat-embed-jasper</artifactId>

                           </dependency>

                           <dependency>

                               <groupId>com.lowagie</groupId>

                               <artifactId>itext</artifactId>

                         <version>2.1.7</version>

                         <scope>system</scope>

                               <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/itext-2.1.7.jar</systemPath>

                           </dependency>

                           <dependency>

                               <groupId>net.sf.jasperreports</groupId>

                               <artifactId>jasperreports</artifactId>

                               <version>5.2.0</version>

                               <scope>system</scope>

                               <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/jasperreports-5.2.0.jar</systemPath>

                           </dependency>

                           <dependency>

                               <groupId>commons-email</groupId>

                               <artifactId>commons-email</artifactId>

                               <version>1.4</version>

                               <scope>system</scope>

                               <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-email-1.4.jar</systemPath>

                           </dependency>

             </dependencies>


 

             <build>

                           <plugins>

                                        <plugin>

                                 <groupId>org.springframework.boot</groupId>

                                 <artifactId>spring-boot-maven-plugin</artifactId>

                               </plugin>

                           </plugins>

             </build>

</project>

Bastion Host는 네트워크 안에서 특정 서비스에 대한 접근을 제어하고 모니터링하는 보안 시스템입니다. 이 블로그에서는 Bastion Host의 개념과 역할, 장점, 설정 방법, 그리고 보안적 측면에 대해 알아보겠습니다. 이 강력한 보안 장치를 통해 내부 시스템의 안전성을 높이고 외부 침입으로부터 보호하는 방법을 살펴보도록 하겠습니다.

 

 

1. 주요역할

보호된 접근 경로 제공: Bastion Host는 외부 사용자들이 내부 시스템에 직접 접근하는 것을 막기 위해 사용됩니다. 외부 사용자들은 Bastion Host를 통해 먼저 접속하고, 그 이후에 필요한 인증과 권한 부여를 거쳐서 내부 시스템으로의 접근이 허용됩니다. 이를 통해 내부 시스템에 대한 보안이 강화됩니다.

외부 침입 방지: Bastion Host를 통해 내부 시스템에 직접적으로 연결되지 않으므로, 외부 공격자들의 공격 대상이 줄어듭니다. Bastion Host는 외부에서 내부로의 트래픽을 감시하고 제어함으로써, 외부 침입을 예방하거나 최소화할 수 있습니다.

모니터링과 로그 기록: Bastion Host는 외부 사용자들의 접속 시도를 모니터링하고, 이에 대한 로그를 기록합니다. 이를 통해 잠재적인 보안 위협이나 악의적인 시도를 식별하고 대응할 수 있습니다.

다단계 인증(Multi-Factor Authentication, MFA) 지원: Bastion Host는 다단계 인증을 통해 추가적인 보안 층을 제공할 수 있습니다. 외부 사용자가 Bastion Host에 접속할 때, 추가적인 인증 요소를 입력하도록 함으로써 보안성을 더욱 강화할 수 있습니다.

보안 정책 적용: Bastion Host를 통해 접근 권한을 관리하고, 정책에 맞지 않는 접근을 차단할 수 있습니다. 필요에 따라 특정 사용자들에게만 접근 권한을 부여하거나 특정 서비스에 대한 접근을 제한할 수 있습니다.

Bastion Host는 주로 SSH(Secure Shell)를 통해 접근할 수 있으며, 보통 시스템 관리자나 보안 담당자들이 접속할 수 있는 권한을 가지고 있습니다. 이를 통해 보안 강화와 관리가 용이해지며, 내부 시스템에 대한 안전한 접근을 보장할 수 있습니다.

 

2. Bastion Host의 위치

Bastion Host는 주로 방화벽 뒤에 위치하며, 외부 네트워크와 내부 네트워크 사이에 위치합니다. 이 위치로 인해 외부 사용자들이 내부 시스템에 직접 접근하는 것을 막고, 보호된 접근 경로를 통해 내부 시스템에 접근할 수 있도록 합니다.

일반적으로 네트워크 구성에서 Bastion Host는 DMZ(데모ilit리즈 영역) 라고 불리는 영역에 배치됩니다. DMZ는 내부 네트워크와 외부 네트워크 사이에 있는 보안 구역으로서, 외부에서 내부로 직접 접근할 수 없도록 막아주는 역할을 합니다. Bastion Host는 이 DMZ 영역에 배치되어 있으며, 외부 사용자들이 Bastion Host를 통해서만 내부 시스템으로 접근할 수 있도록 되어 있습니다.

Bastion Host를 DMZ에 위치시킴으로써 다음과 같은 장점을 얻을 수 있습니다:

외부에서 내부 시스템으로의 직접 접근을 차단하여 내부 시스템에 대한 추가적인 보호를 제공합니다.
외부 침입자들이 바로 내부 시스템에 접근하는 것을 방지하고, Bastion Host를 통해 접근 권한을 관리할 수 있습니다.
DMZ는 외부 네트워크와 내부 네트워크 사이에 있는 중간 영역이므로, 내부 시스템의 보안에 대한 중요한 보호층이 됩니다.
따라서 Bastion Host는 DMZ에 위치함으로써 내부 시스템의 보안을 강화하고, 외부로부터의 침입을 막는 중요한 보안 장치로 사용됩니다.

 

3. 대표적인 사례


Bastion Host는 다양한 환경에서 보안을 강화하고, 외부에서 내부 시스템에 안전한 접근을 제공하는데 사용됩니다. 대표적인 사례로는 다음과 같은 상황들이 있습니다:

기업 내부 시스템 접근 제어: 기업은 보통 내부 네트워크에 중요한 데이터와 시스템을 보유하고 있습니다. 외부 사용자나 직원들이 내부 시스템에 직접 접근하는 것을 막기 위해 Bastion Host를 사용합니다. 외부에서는 Bastion Host에만 접속 가능하고, Bastion Host를 통해 인증과 권한 확인 후에 내부 시스템으로 접근이 가능하도록 설정합니다.

클라우드 환경 보안: 클라우드 서비스를 사용하는 기업들은 인터넷을 통해 클라우드 인프라에 접근해야 합니다. 이때, 클라우드 환경에 Bastion Host를 배치하여 외부에서 직접 클라우드 리소스에 접근하는 것을 방지합니다. 클라우드 리소스에 접근하려는 사용자는 먼저 Bastion Host에 접속한 후, 인증과 권한 부여를 거쳐서 클라우드 리소스에 접근할 수 있습니다.

리모트 워킹 보안: 원격으로 작업하는 직원들은 인터넷을 통해 회사의 리소스에 접근해야 할 수 있습니다. 이때, 직원들에게 직접적인 접근 권한을 주는 것보다 Bastion Host를 통해 접속하도록 하여 보안을 강화할 수 있습니다. 직원들은 먼저 Bastion Host에 접속한 후, 인증 절차를 거쳐 회사의 리소스에 접근할 수 있습니다.

외부 공급자 접근 제어: 외부 공급자나 업무 파트너들이 내부 시스템에 접근해야 할 필요가 있을 수 있습니다. 이때, 외부 공급자들이 직접 내부 시스템에 접근하는 것을 막고, Bastion Host를 통해 안전하게 접속하도록 합니다. 이를 통해 외부 공급자와의 접근을 관리하고 보안을 유지할 수 있습니다.

이 외에도 Bastion Host는 보안 강화와 접근 제어를 필요로 하는 다양한 상황에서 사용됩니다. Bastion Host의 주요 목적은 외부에서 내부로의 접근을 제한하고, 안전한 접근 경로를 제공하여 내부 시스템을 보호하는 것입니다. 따라서 보안이 중요한 시스템이나 네트워크에서 많이 사용되고 있습니다.

 

4.장점 및 단점

장점:

보안 강화: Bastion Host를 통해 외부 사용자들이 직접 내부 시스템에 접근하는 것을 막을 수 있습니다. 외부 사용자들은 먼저 Bastion Host에 접속한 후, 추가적인 인증과 권한 부여를 거쳐서 내부 시스템에 접근할 수 있도록 됩니다. 이를 통해 내부 시스템의 보안을 강화할 수 있습니다.

접근 제어: Bastion Host는 내부 시스템으로의 접근을 엄격히 제어할 수 있습니다. 필요한 사용자들만 Bastion Host에 접속하여 내부 시스템으로의 접근이 허용되기 때문에 무단 접근을 방지할 수 있습니다.

모니터링과 로그 기록: Bastion Host를 통해 외부 사용자들의 접속 시도를 모니터링하고, 이에 대한 로그를 기록할 수 있습니다. 이를 통해 잠재적인 보안 위협이나 악의적인 시도를 식별하고 대응할 수 있습니다.

다단계 인증(Multi-Factor Authentication, MFA) 지원: Bastion Host를 통해 다단계 인증을 사용할 수 있습니다. 추가적인 인증 요소를 요구하여 보안성을 더욱 강화할 수 있습니다.

단점:

단일 장애 지점(Single Point of Failure): Bastion Host 자체가 단일 장애 지점이 될 수 있습니다. 만약 Bastion Host가 다운되면 외부에서 내부 시스템으로의 접근이 불가능해지는 문제가 발생할 수 있습니다. 따라서 Bastion Host의 가용성을 보장하기 위해 고려해야 합니다.

추가적인 설정과 관리 필요: Bastion Host를 구성하고 관리하는 것은 추가적인 작업을 필요로 합니다. Bastion Host에 대한 보안 정책과 접근 권한을 관리하고, 시스템을 업데이트하고 유지보수하는데 비용과 시간이 소요될 수 있습니다.

복잡성 증가: Bastion Host를 도입하면 시스템 구성이 복잡해질 수 있습니다. Bastion Host를 포함하여 모든 구성 요소가 잘 동작하도록 관리해야 하며, 이로 인해 복잡성이 증가할 수 있습니다.

요약하자면, Bastion Host는 보안 강화와 접근 제어에 매우 유용한 도구이지만, 단일 장애 지점과 추가적인 설정과 관리 부담을 고려해야 하는 단점이 있습니다. 따라서 Bastion Host를 도입하기 전에 조직의 요구사항과 환경을 고려하여 적절하게 구성해야 합니다.

 

5.Bastion Host와 VPN(Virtual Private Network)의 차이점

Bastion Host와 VPN(Virtual Private Network)은 둘 다 보안을 강화하고, 외부로부터의 접근을 제어하는데 사용되는 보안 기술이지만, 기능과 용도에서 차이가 있습니다.

Bastion Host의 특징:

접근 제어 및 보호: Bastion Host는 외부 사용자들이 내부 시스템에 직접 접근하는 것을 막고, 보호된 접근 경로를 제공합니다. 외부 사용자들은 먼저 Bastion Host에 접속한 후, 추가적인 인증과 권한 부여를 거쳐서 내부 시스템으로의 접근이 허용됩니다.

단일 포인트로의 접근: Bastion Host는 단일 포인트로서, 외부에서 내부 시스템으로 접근하는 유일한 경로입니다. 따라서 단일 장애 지점(Single Point of Failure)이 될 수 있습니다.

다단계 인증(MFA) 지원: Bastion Host를 통해 다단계 인증을 사용할 수 있습니다. 추가적인 인증 요소를 요구하여 보안성을 더욱 강화할 수 있습니다.

VPN의 특징:

원격 네트워크 연결: VPN은 원격 사용자나 지사(브랜치 오피스)와 같이 다른 위치에 있는 네트워크를 안전하게 연결하는 기술입니다. 이를 통해 원격 사용자나 지사에서도 회사의 내부 네트워크에 접근할 수 있게 됩니다.

암호화된 터널: VPN은 인터넷 상의 공개적인 네트워크를 암호화된 터널로 만들어서 데이터의 안전한 전송을 보장합니다. 이로 인해 데이터의 기밀성과 무결성을 보호합니다.

사용자-사이트 VPN과 사이트-사이트 VPN: 사용자-사이트 VPN은 개별 사용자가 회사의 내부 네트워크에 접근하는 경우에 사용되며, 사이트-사이트 VPN은 두 개의 네트워크를 안전하게 연결하는 경우에 사용됩니다.

요약하면, Bastion Host는 외부 사용자들이 내부 시스템에 접근하는 것을 제어하고 보호하는데 사용되며, 단일 포인트로서의 한계가 있습니다. 반면에 VPN은 원격 네트워크를 안전하게 연결하여 원격 사용자나 지사에서도 내부 네트워크에 접근할 수 있게 하며, 데이터의 안전한 전송을 보장합니다. 두 기술은 각자의 용도와 특징에 따라 적절하게 사용됩니다.

+ Recent posts