외부 모듈을 적용하는 작업을 하던 중 통신값에 한글깨짐이 발생했다 !! 

내 프로젝트는 UTF-8이고 연결하는 모듈의 인코딩은 EUC-KR로 설정되어있었다.. ; 

어노테이션으로 가능한지 보려고 Controller 에서 인코딩을 설정해 실행해봤다.

@PostMapping(value="/test/result", produces="text/plain;charset=euc-kr")

이렇게 해주니 postman을 이용한 테스트에선 한글이 잘 들어오는데

API와 연동하는 부분에선 계속해서 한글이 깨져 들어온다.. ㅠ.ㅠ 

 

결국 ~ 인코딩 필터를 설정하기로 했다!

나의 프로젝트는 UTF-8로 설정되어 있기에 전부 바꾸는건 리스크가 있어 

특정 URL만 EUC-KR로 변경하는 필터를 달았다~ 

 

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyEncodingFilter extends CharacterEncodingFilter {
	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		AntPathMatcher matcher = new AntPathMatcher();
		String reqUri = request.getRequestURI();
		
		if (matcher.match("/test/**", reqUri)) {
			request.setCharacterEncoding("euc-kr");
			
			filterChain.doFilter(request, response);
		} else {
			super.doFilterInternal(request, response, filterChain);
		}
	}
}

 

설정하고 다시 시도~ 

 

DB에 깨져서 들어오던 한글이 이제 잘 들어온다 !! ㅎㅎ 

구글 검색에서 제외하고 싶거나 

혹은 검색에 나오도록 하고 싶은 경우 robots.txt를 사용한다. 

 

네이버를 이용하거나 구글을 이용해서 작성할 수 도 있다. 

네이버 

searchadvisor.naver.com/guide/seo-basic-robots 

 

robots.txt 설정하기

robots.txt는 검색로봇에게 사이트 및 웹페이지를 수집할 수 있도록 허용하거나 제한하는 국제 권고안입니다. robots.txt 파일은 항상 사이트의 루트 디렉터리에 위치해야 하며 로봇 배제 표준을 따

searchadvisor.naver.com

구글 

search.google.com/search-console/welcome

 

Google Search Console

하나의 계정으로 모든 Google 서비스를 로그인하여 Google Search Console로 이동

accounts.google.com

가이드 문서 

developers.google.com/search/docs/advanced/robots/create-robots-txt?hl=ko

 

 

사이트를 내소유로 등록하기 애매한 상황에서 내가 구현한 방법 

Controller

java profile를 이용해서 환경별로 다르게 적용되도록 했다.

    
    
    import org.springframework.beans.factory.annotation.Value;
    
    // -------------------------------------------- 
    @Value("${spring.profiles.active}") private String profile;
    
    
    @ResponseBody
    @GetMapping("/robots.txt")
    public String robots(HttpServletRequest request) {
    	logger.info("ROBOTS.TXT 페이지 호출  ");
    	logger.info("SERVER TYPE ................. [ "+ profile + " ]");
    	if(!profile.equals("production")) {
    		return "User-agent: *\n" +
    		        "Disallow: /\n";
    	}else { 
    		return "User-agent: *\n" +
    		        "Disallow: /svcdrop/request\n";
    	}
  }	

기존에 운영중인 서비스에 적용된 암호화 알고리즘이 취약하다는 결과를 받았다.

 

확인해보니 jasypt을 이용해 암호화가 진행되거 있었고

 

라이브러리 버전이 낮아 지원되는 알고리즘은 안전하지 못했다.. ! 

 

jasypt 버전을 올리려고보니.. SpringBoot 나 기타 다른 서비스의 버전도 올려줘야하는 부분이 있어 

 

곤란해졌다.  ( 운영중인 서비스로 리스크가 있어 여러가지 버전을 한번에 올리기가 애매한 상황.. )

 

다른 버전은 건들지 않고 

 

bouncycastle을 추가 적용해보니 더 많은 안전한 알고리즘 사용이 가능했다!

 

 

 

 

그럼 조치 시작~

 

1. lib 폴더에 bcprov-jdk15on-1.60.jar 추가 ( 첨부파일 확인 ) 

 

2.  pom.xml  Bouncycastle 추가 

<dependency>

    <groupId>org.bouncycastle</groupId>

    <artifactId>bcprov-jdk16</artifactId>

    <version>1.46</version>

    <scope>system</scope>

    <systemPath>${basedir}/lib/bcprov-jdk15on-1.60.jar</systemPath>

</dependency>

 

3. jasyptConfig.java 

* 사용가능한 알고리즘 목록 조회 

List<Object> supported = new ArrayList<>();
List<Object> unsupported = new ArrayList<>();
for (Object algorithm : AlgorithmRegistry.getAllPBEAlgorithms()) {
  try {
    StandardPBEStringEncryptor encryptor1 = new StandardPBEStringEncryptor();
    encryptor1.setPassword("somePassword");
    encryptor1.setAlgorithm(String.valueOf(algorithm));
    String str = "test";
    String encStr = encryptor1.encrypt(str);
    String decStr = encryptor1.decrypt(encStr);
    supported.add(algorithm);
  } catch (EncryptionOperationNotPossibleException e) {
  	unsupported.add(algorithm);
  }
}

for (Object s : supported) {
	System.out.println(s);
}

- 1) 암호화 

private static final String ENCRYPT_KEY = "asdasdasdasdasdasdassdwwwdd11wq";

@Test

    public void test () { 

        Security.addProvider(new BouncyCastleProvider());

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

 

        config.setPassword(ENCRYPT_KEY);

        config.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");

        encryptor.setConfig(config);

 

        String url = encryptor.encrypt("jdbc:oracle:thin:@192.168.11.123:1521/ORCL");

        String username= encryptor.encrypt("testid");

        String pass = encryptor.encrypt("dbpassword");

       

        System.out.println(url);

        System.out.println(username);

        System.out.println(pass);

 

        // decrypt 테스트 

       System.out.println(encryptor.decrypt(url));

   } 

===    run as > JUnit Test 실행 

콘솔에서 암호화된 값을 확인할 수 있다.

 

 

 - 2) 적용 

@Bean("JasyptStringEncryptor")

    public StandardPBEStringEncryptor stringEncryptor() {

        Security.addProvider(new BouncyCastleProvider());

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

 

        config.setPassword(ENCRYPT_KEY);

        config.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");

        encryptor.setConfig(config);

 

        return encryptor;

    }

 

application.properties  암호화된 값 입력 

spring.datasource.url=ENC(asdasdasdwwe2123123qewqwe+o46dbmkQpVu20=)

spring.datasource.username=ENC(sfsdfsr342343456efgfgdfdd==)

spring.datasource.password=ENC(gggffrrww+WbWPoAMddlLrkXFcE)

 

boot 실행 후  DB 연결이 잘 되는지 확인하기 

 

끝! 

 

관련내용) 

genie-dev.tistory.com/50?category=915648

 

jasypt를 이용한 DB 접속 정보 암호화 방법

DB 접속 정보를 암호화 하는 이유 프로젝트 내 DB 연결 값을 암호화 하지 않고 그대로 올릴 경우 서버에 직접 접근하지 않는 이상 확인하기 어렵겠지만 접속이 가능하다면 누구나 DB 정보를 확인��

genie-dev.tistory.com

새 폴더 (1).zip
3.43MB

SpringBoot jar 파일을 배포할때 서비스 등록하는 방법! 

 

SpringBoot  jar파일을 배포했는데 콘솔창에서 나오면 서비스가 종료되어버린다. 

 

이런 불편한 상황을 대처하기 위한 방법으로 nohup 명령어를 사용하곤하는데 

 

매번 process를 kill하고 재실행해야하는 불편함이 있었다. 

 

서비스로 등록하면 아파치를 껐다 켜듯이 systemctl 명령어를 이용해서 사용할 수 있는데 방법을 정리해본다. 

 

( 사용한 환경은 Centos7 환경임) 

 

 

 

1. systemctl 명령어가 가진 서비스가 있는 경로로 이동한다. 

cd /usr/lib/systemd/system 


2. 파일을 하나 만들어준다. (파일명은 내가 실행할 명령어 이름이랑 같이해주면 좋다.) 

vi mytest.service 

 

3. 아래 내용을 작성해준다. 

[Unit]
Description=mytest
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/java -jar -Dspring.profiles.active=dev /home/genie/mytest.jar

User=genie
Group=genie

[Install]
WantedBy=multi-user.target

 

이게 설정 끝이다. 

 

간단하게 설명하자면 

mytest는 내가 지정한 이름이고 


ExecStart 는 내가 실행하려는 서비스를 작성하면된다. 

중간에 있는 -Dspring.profiles.active=dev 건 필요없으면 지워도 된다. 

 

 

이제 jar 파일을 실행하고 끌때 아래처럼 사용하면된다. 

systemctl start mytest -- 시작
systemctl stop mytest -- 중지 

 

훨씬 편해졌다.. !!! 

 

 

끝! 

 

DB 접속 정보를 암호화 하는 이유 

프로젝트 내 DB 연결 값을 암호화 하지 않고 그대로 올릴 경우 서버에 직접 접근하지 않는 이상 확인하기 어렵겠지만 

 

접속이 가능하다면 누구나 DB 정보를 확인할 수 있다는 보안 취약점이 있다. 

 

그래서 가능한 민감 정보는 암호화해서 사용하는 것을 권장한다.  (필수는 아니다)

 

 

 

암호화를 위해  jasypt 사용 

나의 경우 jasypt 를 사용한 암호화 작업을 진행했다. 

 

 

pom.xml

<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot-starter</artifactId>
	<version>1.18</version>
</dependency>

 

jasyptConfig.java

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JasyptConfig {
	private static final String ENCRYPT_KEY = "skdmldufthlrkqtdlqslek"; // 임의로 지정한 키값 

    @Bean("JasyptStringEncryptor")
    public StandardPBEStringEncryptor stringEncryptor() {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

        config.setPassword(ENCRYPT_KEY);
        config.setAlgorithm("PBEWithSHA1AndRC4_128");
        encryptor.setConfig(config);

        
        return encryptor;
    }
    
    
    
    
    // DB에 연결할 url, password 등의 입력값을 암호화 해서 넣어주려고 할 때 
    // 다운받아서 쓰는 방법도 있지만 나는 main 메서드 하나 파서 암호화 작업함. 
    // 실제 프로젝트를 업로드할때에는 main 메서드는 지워주기! 
	public static void main(String[] args) {
		StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

        config.setPassword(ENCRYPT_KEY);
        config.setAlgorithm("PBEWithSHA1AndRC4_128"); // 알고리즘을 잘 골라야한다. 취약하지 않은 알고리즘으로
        encryptor.setConfig(config);
        
        // DB 하나만 연결할 때
        String url = encryptor.encrypt("jdbc:oracle:thin:@192.168.01.01:1521/orcl");
        
        // DB 다중화 되어있어 여러개 연결할 경우.
        // String url = encryptor.encrypt("@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.01.01)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.01.02)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl)))");

        String username= encryptor.encrypt("mytest");
        String pass = encryptor.encrypt("test1234");
        
        System.out.println(url);
        System.out.println(username);
        System.out.println(pass);      
      
      // 프로젝트 우클릭 run As -> java Application 실행하면 콘솔창에서 암호화된 값을 
      // 확인할 수 있다. ( 단축키 : alt +shift+x  누른다음 j 눌러주기.
      
        
	}
}

 

실행하면 아래와 같이 암호화 키를 얻을 수  있다! 

 

 

application.properties ( 꼭 이 파일이 아니더라도 내가 설정해둔 properties에 상황에 맞게 넣어주면된다. ) 

spring.datasource.url=ENC(dzUolknJnznQLlBweSj2AOhP1V6cOlZcGqhC/0uM7YBIQGKk+VAQYbNqXUCDoI4fgw==)
spring.datasource.username=ENC(jEOr0qnaLLVoIZ6bzSo=)
spring.datasource.password=ENC(zzkHO3LV9EauEoLpzvRrxw==)

 

+ Recent posts