'분류 전체보기'에 해당되는 글 223건
- 2013.04.23 Mysql ssl 설정 & JDBC 로 SSL 통신 5
- 2013.04.17 Spring profile 기능으로 운영/개발 환경 구성하기
- 2013.04.16 Spring @ResponseBody 로 리턴시 한글이 깨질때
- 2013.04.12 <util:properties/> 와 Spring EL 로 값 가져오기
- 2013.03.26 Windows Command 창에서 프로그램 종료 시 2
Mysql ssl 설정 & JDBC 로 SSL 통신
그냥 쌩으로 쿼리 날리고 데이터 받으면 되지 왜 귀찮게시리 SSL 로 통신을 해야 되느냐..?
바로 요 이유 때문이다.
TCP 패킷 캡쳐프로그램으로 보면 select * from user where user='root' 라는 쿼리문장이 고대로 노출이 된다.
요렇게 되면 로그인할때 비밀번호가 들어간 쿼리도 노출이 된다는 뜻이다.
자~~ 요것을 해결해 보자!
먼저 mysql 서버쪽에서 ssl 접속을 허용하도록 설정을 해주야 된다.
그러기 위해선 인증서를 맹글어야 된다. 인증서에 대해선 자세히 나도 잘 모르기 때문에 대충~~ 개인키랑 공개키를 맨들어야 한다쯤으로 이해하고 넘어갔다.
아무튼 인증서를 맹글기 위해서는 openssl 이라는 프로그램을 설치해야 한다.
다 설치가 됬으면 커맨드 창을 열어 명령어를 입력해 인증서를 맹글면 된다.
개인키 맹글기
openssl genrsa -out key.pem 2048
공개키 맹글기
openssl req -new -x509 -key key.pem -out cert.pem -days 0
요렇게 하면 개인키 파일(key.pem)이랑 공개키 파일(cert.pem) 두개가 생성된다.
요 파일을 리눅스 서버일 경우 my.cnf 파일을, 윈도우서버에 깔린 mysql 일 경우 my.ini 파일을 편집해 설정을 추가해 주면 된다.
※ 우분투일 경우 일반적인 경로는 /etc/mysql/my.cnf
※ 윈도우일 경우 일반적인 경로는 C:\Program Files\MySQL\MySQL Server\my.ini
설정파일을 보면 [mysqld] 요런 섹션이 있을껀데 요 섹션 안에다 위에서 만든 인증서 파일을에 대해 아래와 같이 설정을 추가해 준다.
※ 위에서 생성한 key.pem 파일과 cert.pem 파일은 C 드라이브 cert 폴더에 있다고 가정.
ssl-ca=C:\\cert\\cert.pem ssl-cert=C:\\cert\\cert.pem ssl-key=C:\\cert\\key.pem
요런 설정을 해주고 mysql 서버를 리스탓트 하면 mysql을 SSL 로 접속할 수 있게 된다.
확실하게 적용이 쪽바로 됐나 확인 할려면 아무툴이나 mysql 로 접속해서 요런 쿼리를 날려보면 간단하게 확인할 수 있다.
show variables like '%ssl%';
죠 두항목이 YES 이면 설정이 쪽바로 적용된 것이다.
※ 인증서를 가지고 SSL 로 접속할려면 요런 옵션으로 접속하면 된다.
mysql -u root -p --ssl --ssl-ca=c:\cert\cert.pem
※ Toad for MySQL 에서 SSL 로 접속하기
커넥션 타입중에 보면 SSL 이라고 있는데 고걸 선택하고 계정정보를 입력하면된다, 인증서 파일을 선택하라고 하는데 굳이 선택하지 않아도 접속이 잘된다.
자~~~ 이제 마지막으로 JDBC로 SSL 접속을 하는 방법을 알아보자.
검색을 해 보니 이것저것 나오던데 방법이 쓸데없이 쫌 복잡해서~~~
간단 of 간단한 방법을 재수좋게 검색을 해서 찾아냈다. 아래와 같은 코드를 쓰면 된다.
키뽀인트는 JDBC URL 에 verifyServerCertificate=false 를 추가해 주는것이다.
저 옵션을 추가해주지 않으면 keytool 로 자바용 keystore 도 맹글어야 하고, 맹글어진 keystore를 시스템 프로퍼티에 추가해 줘야 되는 귀찮은걸 해야 한다.
저 옵션은 말그대로 서버 인증서를 verify 하지 않겠다는 옵션이다.
그리고 당연히 useSSL=true 옵션을 줘야 SSL 로 접속을 한다.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test { public static void main(String[] args) throws SQLException { Connection con = null; try { String url = "jdbc:mysql://127.0.0.1:3306/mysql?useSSL=true&verifyServerCertificate=false"; Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection(url, "user_name", "user_password"); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from user where user='root'"); while (rs.next()) { System.out.println(String.format("%-20s %-20s", rs.getString(1), rs.getString(2))); } } catch (Exception ex) { ex.printStackTrace(); } finally { if (con != null) con.close(); } } }
요걸 실행시키고 TCP 패킷 캡쳐 프로그램으로 보면 요렇게 암호화가 잘되 있다~~
결론 :
MySQL 서버에 SSL 설정만 해주고, 기존 프로젝트 JDBC URL 에 useSSL=true&verifyServerCertificate=false 요것만 추가해 주면 간단하게 SSL 로 암호화 할 수 있다.
MySQL 서버에 접속하던 다른 서비스가 있어도 다른 서비스에는 영향이 없다.
'쓸만한지식' 카테고리의 다른 글
Windows 8 에서 Android SDK Manager 및 AVD Manager 가 실행이 안될때 (5) | 2013.06.20 |
---|---|
apt-get 으로 Ubuntu 12.04에서 Oracle JDK 설치 & Tomcat 설치 (2) | 2013.04.25 |
Windows Command 창에서 프로그램 종료 시 (2) | 2013.03.26 |
베가S5 무선링크 단절 팝업창 안뜨게 하기 (3) | 2013.01.03 |
windows8에서 듀얼모니터 사용시 작업표시줄 유용한 옵션 (0) | 2012.12.27 |
Spring profile 기능으로 운영/개발 환경 구성하기
스프링 3.1 부터 profile 기능이 추가됐다는 걸 어디서 쥬어듣고,
요걸 활용하면 기존에 내가 쓰던 maven의 profile 기능을 이용한 방법을 대체할 수 있을것 같은 생각이 들어 문득 이것저것 테스트해 보았다.
뭐 지금도 딱히 불편한것 없었지만 새로 추가된 기능이라 길래~~
먼저 운영/개발용 profile 을 작성하는 방법은 간단하다.
... ... <beans profile="원하는 profile 이름1"> <bean id="xxxx" class="xxxxxxx"/> </beans> <beans profile="원하는 profile 이름2"> <bean id="xxxx" class="xxxxxxx"/> </bean> </beans> ... ...
요런식으로 beans 태그 안에 각 profile 별로 bean 들을 추가해 주면 된다.
샘플로 맨든 프로젝트에서는 간단한 테스트를 위해 ProfileTestBean 이라는 클래스를 맨들고 요렇게 설정했다.
실제로 datasource 같은걸로 예제를 맨들어 보면 좋겠지만 이것저것 설정할게 많아서, 그러기엔 너무 귀찮다.
테스트로 맨든 빈 대신에 datasource 를 넣으면 아마 잘 돌아가지 않을까 하는 추측을 해본다.
package com.tistory.stove99; public class ProfileTestBean { private String field1; private String field2; public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } public String toString(){ return String.format("{field1 : %s, field2 : %s}", field1, field2); } }
spring 설정 xml
.... .... <beans profile="development"> <bean id="mainBean" class="com.tistory.stove99.ProfileTestBean"> <property name="field1" value="루트 컨텍스트-개발1"/> <property name="field2" value="루트 컨텍스트-개발2"/> </bean> </beans> <beans profile="product"> <bean id="mainBean" class="com.tistory.stove99.ProfileTestBean"> <property name="field1" value="루트 컨텍스트-운영1"/> <property name="field2" value="루트 컨텍스트-운영2"/> </bean> </beans> .... ....
profile 은 원하는 이름으로 원하는 대로 맹글면 된다.
ProfileTestBean 을 @Autowired 하면 현재 active 된 profile 에 따라 등록된 bean 이 Autowired 된다.
@Autowired ProfileTestBean test;
아무튼 죠래 맨든 프로파일들중 원하는 프로파일을 어떻게 적용할 것인가에는 여러가지 방법이 있다.
JVM 변수 spring.profiles.active 요거에 적용할 profile 값을 주는방법
요렇게 spring.profiles.active 에 적용할 프로파일 이름을 적어주면 된다.
다른 방법으로는 웹어플리케이션일 경우 web.xml 파일에서도 요렇게 context-param을 이용해 설정할 수 있다.
그런데 배포할때 마다 web.xml 파일을 수정해야 될것 같아서 약간 거시기 하긴 하다.
<context-param> <param-name>spring.profiles.active</param-name> <param-value>product</param-value> </context-param>
이외에도 DispatcherServlet에 init-param 으로 하는거와, 소스코드로 적용하는 방법등 몇가지 방법이 더 있는데 살짝 귀찮은 감이 없지 않아서 패스.
그렇다면 maven profile 에 비해 spring profile 을 이용하는 방법으로 바꿧을 때 좋아지는 점은 무엇일까 살짝 생각해 보았다.
뭔가가 좋아져야 적용할 필요성을 느낄것이 아닌가?
나의 짧은 생각으로 spring profile 로 바꿀만한 이유중 하나는 런타임시에도 profile 을 바꿀수 있다는 것이다.
개발을 하면서 요것저것 해보다가 음.. 운영환경에서는 쪽바로 나올까 하고 문득 궁금해 질때 로컬 서버를 굳이 껏다가 설정을 바꾸고 다시 안 켜도 바로 운영모드로 전환할 수 있다.
하는김에 만들어 보았다.
화면은 대충 요렇게 맨들었다.
오른쪽 위에 있는 노란부분을 클릭하면 운영/개발 모드로 토글되도록 맨들었다.
profile.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Profile Test</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <style> #currentProfile{ width:250px; height:50px; line-height:50px; position: absolute; top: 1px; right: 1px; border: 1px solid #d4c98a; background-color: #fff8d2; text-align:center; vertical-align: middle; font-size: 18pt; cursor: pointer; } </style> </head> <body> <div id="currentProfile">${ currentProfile } Mode</div> <p>mainBean - ${ mainBean }</p> <p>subBean - ${ subBean }</p> <script> $("#currentProfile").on("click", function(){ window.location.href = "/toggleProfile"; }); </script> </body> </html>
ProfileController.java
package com.tistory.stove99.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.ConfigurableWebApplicationContext; @Controller public class ProfileController { @Autowired ConfigurableWebApplicationContext subContext; /** * 현재 profile 보기 * @param model */ @RequestMapping("/profile") public void profile(Model model){ model.addAttribute("currentProfile", currentProfile()); } /** * 운영/개발 profile 토글 * @return */ @RequestMapping("/toggleProfile") public String changeProfile(){ String toChangeProfile = currentProfile().equals("product") ? "development" : "product"; ConfigurableWebApplicationContext rootContext = (ConfigurableWebApplicationContext)subContext.getParent(); // root, sub 싹다 엑티브 프로파일을 바꾼후 리프레쉬 해야 적용됨 // Refreshing Root WebApplicationContext rootContext.getEnvironment().setActiveProfiles(toChangeProfile); rootContext.refresh(); // Refreshing Spring-servlet WebApplicationContext subContext.getEnvironment().setActiveProfiles(toChangeProfile); subContext.refresh(); return "redirect:/profile"; } /** * 현재 프로파일 가져오기 * @return */ private String currentProfile(){ String[] profiles = subContext.getEnvironment().getActiveProfiles(); if( profiles.length==0 ){ profiles = subContext.getEnvironment().getDefaultProfiles(); } return profiles[0]; } }
전체 소스는 죠 맨위에 있는 첨부파일을 받으면 됨. (메이븐 프로젝트)
그런데 요렇게 해도 될려나 몰라 -.-
'Spring' 카테고리의 다른 글
Spring @ResponseBody 로 리턴시 한글이 깨질때 (0) | 2013.04.16 |
---|---|
<util:properties/> 와 Spring EL 로 값 가져오기 (0) | 2013.04.12 |
Spring 개발시 개발, 운영환경 프로퍼티 파일 관리하기 (1) | 2011.10.11 |
bean property 간단하게 설정하기 : http://www.springframework.org/schema/p 활용 (1) | 2011.08.22 |
ContentNegotiatingViewResolver 활용 : 하나의 RequestMapping 으로 JSP, JSON, JSONP 처리하기 (0) | 2011.08.19 |
Spring @ResponseBody 로 리턴시 한글이 깨질때
컨트롤러 메소드에서
@RequestMapping("/test") @ResponseBody public String test(){ return "mainBean : " + mainBean; }
요런식으로 한글이 섞인 문자열을 @ResponseBody로 리턴할때 브라우져에서 한글이 깨졌다.
요것을 해결할려면~
스프링설정 파일에 StringHttpMessageConverter에 대한 설정을 살포시 추가해주면 된다.
(싹 복사하지 말고 만약 기존에 설정이 되 있었으면 고거에다 쪼매 추가해 주면 된다.)
※ 스프링 3.0이랑 스프링 3.1 이상버전에서는 설정이 쪼매 틀리다.
스프링 3.0
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean>
스프링 3.1에서 위와 같은 설정을 해보니
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 요 클래스가 Deprecated 됐다면서 쪽바로 안됐다.
스프링 3.1이상에서는 요런식으로 mvc:annotation-driven 태그 안에 mvc:message-converters 태그로 설정을 해주면 된다.
스프링 3.1 이상
<mvc:annotation-driven> <mvc:message-converters> <!-- @ResponseBody로 String 처리할때 한글처리 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
죠렇게 설정을 하고 나서 다시 해 보면 쨘~ 해결이 된다.
※ 죠기에 설정하는 text/html 값은 브라우져 관리자 도구를 열어 리턴되는 media type을 확인해 보고 고거에 맞는 값을 설정해 주면 된다.
'Spring' 카테고리의 다른 글
Spring profile 기능으로 운영/개발 환경 구성하기 (0) | 2013.04.17 |
---|---|
<util:properties/> 와 Spring EL 로 값 가져오기 (0) | 2013.04.12 |
Spring 개발시 개발, 운영환경 프로퍼티 파일 관리하기 (1) | 2011.10.11 |
bean property 간단하게 설정하기 : http://www.springframework.org/schema/p 활용 (1) | 2011.08.22 |
ContentNegotiatingViewResolver 활용 : 하나의 RequestMapping 으로 JSP, JSON, JSONP 처리하기 (0) | 2011.08.19 |
<util:properties/> 와 Spring EL 로 값 가져오기
XML 설정
<?xml version=" 1.0"="" encoding="UTF-8" ?=""><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> .... <util:properties id="prop" location="classpath:config/properties/sample.properties"/> .... </beans>
sample.properties
sample.prop1 = test # 우쭈쭈~ sample.prop2 = \uc6b0\ucb48\ucb48~
Spring EL 로 값 가져오기(SampleBean.java)
package com.tistory.stove99; import java.util.Properties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class SampleBean { // Spring EL 로 값 가져오기 // Spring EL 이기 때문에 자유롭게 메소드 호출도 가능함. String 의 concat 메소드 호출 @Value("#{prop['sample.prop1'].concat(' abc')}") private String value1; @Value("#{prop['sample.prop2']}") private String value2; // util:properties 로 생성된 빈은 java.util.Properties 의 인스턴스이기 때문에 // 요렇게 Autowired 해서 쓸 수 있다. @Autowired Properties prop; public String val(String key){ return prop.getProperty(key); } public String toString(){ return String.format("value1 : %s, value2 : %s", value1, value2); } }
Spring EL에 대해서 더 알아보고 싶으면 요 사이트를 참고하면 친절하게 알려줌.
http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html
Test(SampleTest.java)
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tistory.stove99.SampleBean; public class SampleTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config/spring/*-context.xml"); SampleBean sample = context.getBean(SampleBean.class); // test System.out.println(sample.val("sample.prop1")); // value1 : test abc, value2 : 우쭈쭈~ System.out.println(sample); } }
'Spring' 카테고리의 다른 글
Spring profile 기능으로 운영/개발 환경 구성하기 (0) | 2013.04.17 |
---|---|
Spring @ResponseBody 로 리턴시 한글이 깨질때 (0) | 2013.04.16 |
Spring 개발시 개발, 운영환경 프로퍼티 파일 관리하기 (1) | 2011.10.11 |
bean property 간단하게 설정하기 : http://www.springframework.org/schema/p 활용 (1) | 2011.08.22 |
ContentNegotiatingViewResolver 활용 : 하나의 RequestMapping 으로 JSP, JSON, JSONP 처리하기 (0) | 2011.08.19 |
Windows Command 창에서 프로그램 종료 시
Window8 을 쓰고 있는데 실행중인 프로그램을 강제종료 시킬려고 작업관리자를 실행시키면,
가끔가다 작업관리자가 바로 종료되 버리는 경우가 있었다 -.-
재부팅 하기는 귀찮고, 요럴땐 커맨드창을 열어 명령어를 통해서 프로그램을 강제종료 시킬수 있다.
먼저 커맨드 창을 열고 tasklist 명령으로 어떤 프로세스 들이 떠 있나 확인을 하면서 자기가 종료시킬 프로그램을 리스트에서 찾아본다.
tasklist 를 실행시켜 보면 죠렇게 목록이 뽓 튀어나오는데 이미지이름, PID 를 가지고 프로그램을 강제종료 시킬수 있다.
이미지 이름으로 종료시킬려면 요렇게 하면 된다.
taskkill /im [이미지이름] /f
ex) 메모장 강제종료
taskkill /im notepad.exe /f
※ /f 강제종료를 시키는 옵션임
PID(Process ID) 로 종료시킬려면 요렇게~
taskkill /pid 프로세스아이디 /f
ex) taskkill /pid 2404 /f
'쓸만한지식' 카테고리의 다른 글
apt-get 으로 Ubuntu 12.04에서 Oracle JDK 설치 & Tomcat 설치 (2) | 2013.04.25 |
---|---|
Mysql ssl 설정 & JDBC 로 SSL 통신 (5) | 2013.04.23 |
베가S5 무선링크 단절 팝업창 안뜨게 하기 (3) | 2013.01.03 |
windows8에서 듀얼모니터 사용시 작업표시줄 유용한 옵션 (0) | 2012.12.27 |
베가S5 부팅시 미디어스캔 끄기 (2) | 2012.12.10 |