준준의 기록일지

[JAVA7] Try-with-Resources 자원 자동할당 (보안취약점 보완) 본문

개발 전체

[JAVA7] Try-with-Resources 자원 자동할당 (보안취약점 보완)

junjunwon 2021. 8. 30. 11:10

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




아래와 같이 try에서 객체 초기화를 통해 자동해제를 해줄 경우, 아래와 같은 문제가 발생할 수 있다.

socket class의 객체를 초기화해주고 해당 socket을 다른 객체에 할당해준다.

try()에서는 객체 초기화만 가능하므로, socket.setSoTimeout(1000 * 30);을 중간에 껴넣을 수가 없다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
try//Try-with-resources를 이용한 자원 자동해제.
            Socket socket = new Socket(psCommunicator.getAddress(), psCommunicator.getPort());
    
            BufferedWriter bw = new BufferedWriter(osw);
            PrintWriter out = new PrintWriter(bw, false);
            InputStream gzippedResponse = socket.getInputStream();
            InputStream ungzippedResponse = new GZIPInputStream(gzippedResponse);
            BufferedReader reader = new BufferedReader(new InputStreamReader(ungzippedResponse, StandardCharsets.UTF_8));
        ) {
            
            socket.setSoTimeout(1000 * 30);
 
            out.flush();
            
            
        } catch (ConnectException e) {
            throw new MessageException("Server " + e.getMessage());
        } catch (IOException e) {
            logger.errorLog(new Object(){}, e);
        }
cs

이때 socket.setSoTimeout(1000 * 3)을 bufferedWriter 객체 초기화전에 넣어주는 방법은, 

socket 클래스를 상속하는 커스텀클래스를 만들고 생성자 안에서 super로 기존 생성자를 호출한다

-> setTimeout 로직 부분을 생성자 안에 넣어서 코드를 작성하면 된다.

 

SocketCustom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.timegate.support.xd.ddc;
 
import java.net.*;
 
public class SocketCustom extends Socket{
    
    public SocketCustom() {
        super();
        try {
            setSoTimeout(1000 * 30);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
 
    public SocketCustom(String address, int port) {
        super();
        try {
            setSoTimeout(1000 * 30);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
 
}
 
cs

 

A.class

1
2
3
4
5
6
7
try//Try-with-resources를 이용한 자원 자동해제. jh.won. 
            SocketCustom socket = new SocketCustom(psCommunicator.getAddress(), psCommunicator.getPort()); //커스텀 Socket class를 만들어 setSoTimeout(1000 * 30)을 생성자에 넣어줌. 
           PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")), false);
            InputStream gzippedResponse = socket.getInputStream();
            InputStream ungzippedResponse = new GZIPInputStream(gzippedResponse);
            InputStreamReader streamReader = new InputStreamReader(ungzippedResponse, StandardCharsets.UTF_8);
        )
cs

 

기존의 자원할당해제하는법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//객체 초기화
InputStreamReader streamReader = null;
 
try{
    //비즈니스 로직.
}
catch(){
}
finally {
    try {    
        if(streamReader != null) streamReader.close();
    } catch (Exception e) {
        logger.errorLog(new Object(){}, e);
    }
}
cs

 

 

출처  : 

https://logical-code.tistory.com/162

 

Try with Resources - 손쉬운 자원 해제

Java 개발을 하다보면 close 메서드를 호출해 자원을 해제해줘야하는 자원을 마주하게된다. 만약 프로그램에서 사용한 자원을 해제하지 않아 독점하게되면 운영체제의 자원이 고갈되어 다른 프로

logical-code.tistory.com