SpringBoot Session Timeout 설정을 해보겠습니다~ 

 

1. bean을 정의해둔 config 파일에 SessionListener 등록! 

@Bean
public HttpSessionListener httpSessionListener(){
	return new SessionListener();
}

 

2. SessionListener 파일 생성! 

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


public class SessionListener  implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent session) {
		// 초단위로 설정된다. 테스트로 300(5분)으로 설정
        session.getSession().setMaxInactiveInterval(60*5);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
	}

}

 

3. 시간이 잘 설정되었는지 확인하기! Controller에 세션을 확장할 메소드를 하나 생성한다. 

 

@PostMapping("/extendSession")
ResponseBody
public boolean  extendSession() {
	logger.info("로그인 세션 연장");
	logger.info(request.getSession().getMaxInactiveInterval()); 
	logger.info("==============================");
      
    // 리턴값으론 로그인 여부를 리턴해주고있다. 본인코드에 맞춰 수정하기 
	return 로그인여부(true or false) ; 
}

 

이 메소드를 호출하면 아래 이미지처럼 설정된 시간이 초단위로 출력된다. 

* 설정한 값으로 변경이 안된다면 브라우저 캐시 지우고 다시 실행하자!! 

 

 

Session 만료를 사용자에게 알리기 위해 script 작업을 추가했다. 

main_layout.html 에 스크립트 추가~ ( 전역에서 사용되는 공간에 추가하면 됩니다. )

 

//<![CDATA[
        $(function () {
        	
            // 세션을 5분으로 설정해둬서 5로 설정함! 자기 시간에 맞춰 설정하기
            // 숫자 5는 상수값으로 처리해서 사용하면 좋겠다! 
         	var sessionTimeChecker = 5;
            
            // 1분에 한번씩 인터발을 이용해 남은 시간을 계산한다. 
            var sessionInterval = setInterval(checkSession, 60000);
            
            // 비동기 요청을 캐치해 시간을 리셋해준다. 
            $(document).ajaxStart(function () {
            	if(loginck) { // 로그인 여부 확인 후 세션 리셋 
	            	sessionTimeChecker = 5;
            	} else { 
                	// 로그인이 안된 상태라면 인터발 종료 
            		clearInterval(sessionInterval);	
            	}
             });
            
            
            
            // 1분에 한번씩 호출되는 함수로 1분이 남았을때 alert를 출력해준다. 
            function checkSession() { 
		sessionTimeChecker -= 1; // 1분씩 마이너스해서 남은 시간을 계산한다. 
		console.log("인터발 동작 " + sessionTimeChecker +"  " +  new Date() );
            	
                // 1분이 남은 경우 알림창 띄운다. 
                // 확인버튼을 눌렀으나 이미 로그아웃된 경우는 만료알림 문구를 출력하고 페이지를 새로고침한다.
            	if(sessionTimeChecker == 1) { 
            		if(confirm("장시간 사용되지 않아 1분뒤 자동으로 로그아웃됩니다. \n로그인 시간을 연장하시려면 확인 버튼을 클릭해주세요.")) { 
            			$.post("/extendSession").done(function(data) {
            				if(!data) {
            					alert("유효시간 만료로 로그아웃 되었습니다.");
            					location.reload(); // 리로드되면 로그인화면으로 자동 변경됨 
            				}
            			});
            		}
            	}	
            }
            
            
        });
        
        //]]>

 

* 여러번 반복되는 숫자들은 상수로 처리해서 하나만 수정하면 전부 수정되도록 코딩하는게 좋다.

아래 코드는 샘플로 값을 바로 확인하기 위해 그대로 입력해둠!  

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

혹은 검색에 나오도록 하고 싶은 경우 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 -- 중지 

 

훨씬 편해졌다.. !!! 

 

 

끝! 

+ Recent posts