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

 

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은 원격 네트워크를 안전하게 연결하여 원격 사용자나 지사에서도 내부 네트워크에 접근할 수 있게 하며, 데이터의 안전한 전송을 보장합니다. 두 기술은 각자의 용도와 특징에 따라 적절하게 사용됩니다.

사회책임투자 (Social Responsible Investing)

 

사회책임투자란 투자 시 재무적 요소외에도 다양하고 복잡한 비재무적 요소인 환경(Environment), 사회(Social), 지배구조 (Governance)를 모두 고려하고 철저한 분석을 실시하여 투자함으로써 공공선과 경제적인 수익을 함께 이루고자 하는 투자 과정입니다. 기존의 투자이론은 기대위험과 기대수익을 중심으로 투자의사결정을 수행하였지만, SRI에서는 투자의 경제적, 사회적, 환경적인 이득을 함께 고려한다는 점에서 차이가 있습니다.

 

주요 사회적 책임투자 방법은 아래와 같습니다.

  1. 스크리닝(Social Screening): 사회적 또는 환경적인 기준에 따라 해당되는 회사의 주식 또는 채권 등을 투자 포트폴리오에 넣거나 제외시키는 투자전략
  2. 주주권리보호(Shareholder Advocacy): 특정 기업의 주식을 보유하고 이를 이용하여 그 기업의 업무관행을 보다 사회적으로 책임 있는 방향으로 개선하도록 유도하는 투자전략
  3. 지역공동체 투자: 경제적으로 불이익을 받는 계층 또는 지역공동체가 필요로 한 기회나 자원을 제공하는 투자 방법

일반적으로 스크리닝 방법이 가장 널리 쓰이고 있습니다.

 

사회책임투자는 일반적으로 대형 투자기관(연금기금, 뮤츄얼 펀드 포함), 보험회사, 노조, 재단, 종교단체, 지역공동체개발 금융기관을 중심으로 이루어 지고 있습니다. 투자자는 ESG 측면에서의 평가를 수행하여 투자 의사결정에 사용하고 있으며, 평가에 필요한 자료는 직접 수집하기도 하나 자문사를 통해 ESG 평가를 수행하는 경우가 일반적입니다.

 

국내의 경우 사학연금은 2023년 현재 4000억 규모의 펀드를 운용사를 선정해 운용하고 있으며 ‘위탁운용사 ESG 추진 활동의 적정성’ 평가를 수행하여 사회적책임투자를 실천하고 있습니다.

'기타(분류없음)' 카테고리의 다른 글

[COP27 Review] - 샤름엘셰이크 이행계획이란?  (0) 2022.11.23

JavaScript는 현재 가장 인기 있는 웹 프로그래밍 언어 중 하나입니다. JavaScript는 프론트엔드, 백엔드 및 모바일 개발에서 널리 사용됩니다. 따라서 JavaScript를 배우는 것은 웹 개발자로서 중요한 기술입니다.


JavaScript를 배우기 위해서는 TypeScript를 배우는 것이 좋습니다. TypeScript는 JavaScript의 상위 집합 언어로, JavaScript에 강력한 정적 타입 검사 기능을 추가합니다. TypeScript는 프로그래밍 언어를 배우는 초보자에게도 친숙하며, 코드를 작성하는 것을 더 쉽고 안전하게 만들어 줍니다.


따라서 TypeScript를 배우는 것은 JavaScript를 배우는 데 큰 도움이 됩니다. TypeScript를 배우기 위해서는 다음과 같은 자료들을 참고할 수 있습니다.

 

 

TypeScript 핸드북

TypeScript 공식 문서에서 제공하는 핸드북입니다. TypeScript를 처음 배우는 초보자부터 전문가까지 모두에게 유용한 정보를 제공합니다.

링크: https://www.typescriptlang.org/docs/handbook/intro.html

 

TypeScript Deep Dive

TypeScript를 깊이 이해하고 싶은 사람을 위한 서적입니다. 책은 TypeScript의 개념, 기능 및 사용 사례에 대해 자세히 설명합니다.
링크: https://basarat.gitbook.io/typescript/

 

Udemy - Typescript: The Complete Developer's Guide

Udemy에서 제공하는 TypeScript 온라인 강의입니다. 실제 프로젝트를 통해 TypeScript의 모든 기능과 사용 사례를 배울 수 있습니다.
링크: https://www.udemy.com/course/typescript-the-complete-developers-guide/

 

Coursera - Programming Languages, Part A

프린스턴 대학교에서 제공하는 컴퓨터 과학 강의 중 하나입니다. 이 강의는 TypeScript를 비롯한 다양한 프로그래밍 언어를 다루며, 함수형 프로그래밍 및 객체 지향 프로그래밍 등의 개념을 배울 수 있습니다.
링크: https://www.coursera.org/learn/programming-languages

 

 

 

이러한 자료들을 참고하여 TypeScript를 배우면 JavaScript 프로그래밍에 대한 깊은 이해를 얻을 수 있습니다. TypeScript를 배우는 것은 웹 개발자로서 취업에도 큰 도움이 될 것입니다.

 

 

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

toString()의 사용법과 활용 예시  (0) 2023.02.14
조건문 좀더 편하게 사용하기  (0) 2023.01.13

+ Recent posts