이전 게시글에 이어서 작성하겠습니다...

임의로 properties 파일을 하나 만들겠습니다. 저는 enc.properties 라고 만들고 resources 폴더 아래에 놔두었습니다. 그리고 아래처럼 작성하였습니다.

그럼 이제 저희가 해야할일은 JasyptConfig.java 클래스 파일에서 enc.properties 에 작성된 enc.key의 값인 hanqJava를 읽어와야 합니다.

일반적으로 properties나 yml 파일의 속성에 접근할때는 ${} 형식을 사용합니다.

JasyptConfig.java에 아래와 같이 추가해줍니다.

위처럼 하면 enc.properties 의 enc.key에 접근해서 값을 읽어올수가 있습니다.

정말로 읽어올 수 있는지 sysout를 통해서 찍어보겠습니다. 톰캣을 실행시켜보겠습니다.

오류가 나네요?

enc.key의 값을 갖고 올 수가 없네요.

그럼 이번에는 application.properties에 설정되어있는 db username은 갖고올 수 있는지 한 번 찍어봅시다.

아래처럼 수정해줍니다.

다시 톰캣을 실행시켜주고 콘솔로그를 확인합니다.

이번에는 정상적으로 갖고올수가 있네요.

이러한 원인은 application.properties는 스프링부트 생성시 디폴트로 지정되어있는 properties라서 톰캣 실행시 저희가 별다른 설정을 하지 않아도 안에 있는 프로퍼티들을 읽어들이지만 저희가 임의로 만든 properties 파일들은 그렇지가 않기 때문입니다.

그래서 저희는 enc.properties 안에 있는 프로퍼티속성들을 JasyptConfig 클래스가 실행될때 읽도록 설정을 해주어야 합니다.

JasyptConfig에 아래처럼 추가해줍니다.

프로퍼티 파일을 읽어오도록 설정을 해줍니다.

그리고 다시 톰캣을 실행시켜주고 로그를 확인해줍시다.

정상적으로 key를 갖고오는게 확인됩니다. 그럼 이제 저희가 할일은 아래처럼 변수를 넣어주면 되겠죠.

정상적으로 디비 조회가 되는지 확인해보시면 되구요.

복호화key를 별도의 properties로 분리하는것까지는 해봤습니다.

그런데 생각해보니, 프로젝트내에 프로퍼티 파일을 보관하는게 보안상으로 안전하지 않을 것 같다는 생각이 듭니다. 만약, 이 플젝 소스가 공개된 깃허브로 관리되고 있는 것이라면? 그리고 무심코 enc.properties 파일도 깃허브로 커밋이 되버린다면? 외부로 이 키가 공개가 되면 보안상의 문제가 발생할 것 같네요.

그래서 enc.properties를 프로젝트 외부에 보관하고 그 프로퍼티 파일을 읽어오는걸로 해보겠습니다.

저는 아래 경로에 옮겨놨습니다.

그리고 아래처럼 소스를 수정해줍니다.

다시 톰캣을 재시작해서 정상적으로 실행되는지 확인해줍니다.

보통 로컬은 윈도우 환경이 대부분이겠지만, 만약 개발, 운영 서버라면 리눅스 환경이 많을 것입니다. 그런 경우라면 경로는 리눅스에 맞는 경로.. 예를 들면, /root/data/config/enc.propertis 이런 식으로 적으면 될것 같습니다.(제가 리눅스에서 테스트를 하지는 않았기 때문에 경로는 그냥 무작위로 끄적여본거구요. 리눅스에 플젝 외부에 파일을 두는 경우에는 권한 주는것도 잊으시면 안됩니다.)

로컬에서 테스트 하고, 소스를 다시 서버에 반영해서 테스트 할 때마다 경로를 바꾸어주기 귀찮으면 둘 다 적어주면 됩니다.

아래처럼요.

PropertySources 를 이용해서 PropertySource들을 배열처럼 묶어줄수가 있습니다.

이렇게 하면 윈도우 로컬환경에서 실행할때는 첫 번째 경로의 프로퍼티를 읽을테고, 리눅스 서버에서 실행될때는 두 번째 경로의 프로퍼티를 읽을 것입니다.

이렇게 해서 다시 톰캣을 실행시켜줍니다.

오류가 나네요?

음... 이것은 지금 윈도우 환경인지라 당연히 리눅스 경로를 찾을수는 없는 것은 당연합니다. 하지만 PC 입장에서는 단순히 소스를 읽고 해석을 하니, 지정된 경로가 없으니 오류라고 판단한거구요.

지정된 경로가 없을 경우에는 그냥 무시하도록 설정을 해줍시다. 아래처럼 변경해줍니다.

ignoreResourceNotFound = true 의미가 해당 경로의 리소스를 찾을 수 없으면 그냥 무시하고 넘어가라는 의미입니다.

다시 한 번 톰캣을 실행시켜서 확인해줍니다.

지정된 경로를 찾을 수 없다는 로그는 뜨지만 톰캣 중단없이 계속 진행되는 것을 확인할 수 있으실것입니다.

이렇게 해서 복호화key를 저장한 프로퍼티 파일을 플젝 외부에서 읽어와서 연동하는 방법도 다루어봤는데요.

생각해보니, 이렇게 파일을 플젝 외부에 두었다고 해서 안전을 100% 보장할 수 있는가? 라는 의문이 드네요.

그래서 이번에는 플젝이 구동되는 OS의 환경변수에 key값을 저장해보도록 하겠습니다.

내 컴퓨터에서 오른쪽 버튼 클릭 -> 속성 -> 고급 시스템 설정 -> 환경변수로 진입합니다.

환경변수에서 새로 만들기 누른 후에 변수 이름과 값을 넣어주고 확인을 누르고 나옵니다.

환경변수가 제대로 등록되었는지 확인을 해보려면 cmd 모드로 들어가서 아래의 명령어로 변수명을 입력하면 값이 출력됩니다.

리눅스에서 환경변수를 등록해줄때는 $ export 환경변수명=환경변수값 이런 식으로 등록하겠죠..

그럼 이제 소스를 수정을 해야 하는데, 그 전에 STS를 재시작해줍니다. 재시작하지 않으면 방금 등록한 환경변수를 읽어오지를 못합니다.

재시작후 아래처럼 소스를 변경해줍니다.

@Resource 대신에 @Autowired 를 사용하여도 됩니다. 스텝2 수업을 들으신분들은 습관적으로 Resource를 사용하실거라 생각합니다.

환경변수 encKey의 변수값을 읽어와서 setPassword에 넣어주고 있구요.

그럼 톰캣을 실행해보겠습니다.

오류없이 잘 실행되고, 콘솔에도 환경변수로 읽어온 값이 잘 찍힌다는 것을 확인할 수가 있습니다.

환경변수에 해당 변수가 등록되지 않는 불상사가 생겨서는 안되겠지만... 만약 값이 없을 경우에는 아까 읽어들인 프로퍼티 파일에 저장된 값을 key로 사용하도록 하면 될 것 같네요.

환경변수명을 PropertySource에 넣어서 활용도 가능합니다.

아래처럼 환경변수를 추가해주고 STS를 재시작합니다.

그리고 PropertySource에서 dev/config 경로를 아래로 대체합니다.

${encLoc}의 의미가 환경변수명 encLoc의 값을 대입하라는 의미이기때문에 톰캣을 실행해보면 정상적으로 경로를 읽어오는 것을 확인하실 수가 있을 것입니다.

그럼, 만약에 환경변수명이 등록되어 있지 않다면?

그것을 대비하기 위해서 : 기능을 활용할 수 있습니다. 아래처럼 소스를 변경하겠습니다.

encDir는 제가 등록하지 않은 환경변수입니다. 환경변수의 값이 없으면 : 뒤에 부분, 즉 여기서는 dev/config를 사용하라는 의미입니다. 저렇게 실행해도 오류없이 정상 실행이 될 것입니다. c:/dev/config/enc.properties는 유효한 경로이니까요.

- 끝 -

:: 저의 얕은 지식으로 정보 공유차원에서 적어본거라 혹시 틀린 내용이 있다면 덧글로 정정해주시면 감사하겠습니다~

+ Recent posts