요즘 많은 사이트들이 https 프로토콜을 사용을 합니다. 개발을 할때도 http 가 아닌 https 로 통신해야하는 경우가 있는데, SSL 인증서를 구입하기에는 비용이 비싼것으로 알고 있습니다. 간단하게 개발을 위한 사설 인증서를 발급받아서 https로 Tomcat을 구동하는 방법을 알아 보기로 합니다. 준비 사항이 있는데, 개발 PC에 JDK 와 Tomcat이 설치가 되어 있어야 합니다. 설치에 대한 내용은 간단한 것이므로 생략하도록 합니다.
* 명령어 중 빨간 글씨는 자신이 원하는 것으로 바꾸어도 됩니다.
JDK를 이용한 KeyStore 생성
JDK에서 제공하고 있는 keytool을 이용해 keystore를 생성합니다. Windows의 명령프롬프트를 관리자로 실행하여 아래와 같이 keytool을 실행합니다.
keytool은 다른 목적으로 storepass와 keypass를 사용합니다. storepass는 키 저장소에 액세스하는 데 사용됩니다. keypass는 특정 키 쌍의 개인 키에 액세스하는 데 사용됩니다. keyalg 는 key algorithm name 을 이야기하며 RSA라는 것으로 지정합니다. 그리고 저장장소는 "F:\Project\ssl\.keystore" 로 지정합니다.
C:\WINDOWS\system32>keytool -genkey -alias tomcat -keypass changeit -storepass changeit -keyalg RSA -keystore F:\Project\ssl\.keystore
이름과 성을 입력하십시오.
[Unknown]: localhost
조직 단위 이름을 입력하십시오.
[Unknown]:
조직 이름을 입력하십시오.
[Unknown]:
구/군/시 이름을 입력하십시오?
[Unknown]:
시/도 이름을 입력하십시오.
[Unknown]:
이 조직의 두 자리 국가 코드를 입력하십시오.
[Unknown]:
CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown이(가) 맞습니까?
[아니오]: 예
Warning:
JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore F:\Project\ssl\.keystore -destkeystore F:\Project\ssl\.keystore -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.
C:\WINDOWS\system32>
C:\에 .keystore가 생성되었습니다. 그런데 키 생성시 경고가 발생했습니다. 생성된 keystoretype 이 JKS 키로 생성되었는데, 이는 "Java KyeStore"의 준말로 Java 환경에서만 사용이가능하니, 산업 표준 형식인 PKCS12(Public Key Cryptogrephic Standards)로 변환을 하라는 것 입니다. PKCS12 는 여러 플랫폼에서 사용이 가능합니다. 변환은 아래 명령어로 변환합니다.
명령어를 실행하면 tomcat.cer 파일이 F:\Project\ssl 폴더에 생성됩니다.
Tomcat 설정
저는 이클립스를 사용할 것이기 때문에 아래와 같이 간단하게 Tomcat 서버 설정 후 Test 라는 프로젝트를 만들어 테스트를 진행하였습니다. 우선 http 통신과 Test 프로젝트가 동작되는 환경을 구성합니다.
1. 이클립스 [Window → Show View → Servers] 를 클릭합니다.
2. 아래와 같은 Servers 탭이 나타나는데 파란색 글씨를 클릭합니다.
3. Tomcat 을 추가하기 위하여 리스트의 apache 폴더 안의 Tomcat 을 자신의 PC에 맞는 버전으로 선택하여 줍니다. 저는 Tomcat 8.5가 설치되어 있기 때문에 "Tomcat v8.5 Server"를 선택하였습니다. 그리고 Tomcat 이 설치된 경로를 잡아주고 완료합니다.
4. 간단한 Test 프로젝트를 생성하고 "index.html" 파일을 만들어 줍니다. 그리고 Severs 탭에서 Tomcat v8.5에 마우스 오른쪽 버튼으로 나오는 메뉴 [Add and Remove] 선택합니다. Test 프로젝트를 Add 버튼으로 오른쪽으로 옮겨 줍니다.
5. 서버를 기동하여 "http://localhost:8080/Test/" URL로 접근하면 아래와 같이 화면이 나타납니다.
그렇다면 이제 Tomcat 설정 파일 server.xml 파일을 열어 SSL 통신을 위한 Connector 에 등록합니다. server.xml 파일은 아래와 같은 위치에 있으니 참고하십시오.
설정이 완료되었다면 Tomcat을 구동하여 "https://localhost:8443/Test/" 로 접속합니다. 그런데 아래 그림과 같이 안전하지 않은 사이트라고 판단을 하여 위험 화면이 나타납니다. 이는 신뢰하는 보안 인증서가 아니기 때문에 아래와 같이 위험 화면이 나타나는 것으로 화면 하단의 "고급" 버튼을 클릭하여 "localhost(안전하지않음)으로 이동" 을 클릭하면 정상적으로 페이지가 출력됩니다.
이러한 위험 페이지가 계속 나타난다면 개발하기 귀찮아 집니다. 그래서 아래와 같이 인증서를 브라우저에 등록하여 위험 페이지가 나오지 않다록 설정할 수 있습니다. 저는 크롬을 기반으로 설명을 하도록 하겠습니다.
1. 크롬에서 "chrome://settings/security" 를 입력하여 아래 "인증서 관리"를 클릭합니다.
2. 인증서 팝업창에서 "가져오기"를 선택하여 줍니다.
3. 인증서 가져오기 마법사가 실행되며 다음을 눌러 진행합니다. 이때 파일을 선택하는 화면에서 위에서 만들어준 "tomcat.cer" 파일을 찾아보기하여 선택합니다.
4. 인증서를 저장하는 부분은 "모든 인증서를 다음 장소에 저장" 선택 후, 인증서 저장장소는 찾아보기로 "신최할 수 있는 루트 인증 기관"을 선택하여 다음으로 진행하고 마법사를 완료합니다. "마침" 버튼을 클릭하면 보안 경고가 나오는데, "예"를 눌러 설치를 마무리 합니다.
이제 크롬을 재기동 후 "https://localhost:8443/Test/" 로 접속하면 위험페이지 없이 원하는 index.html 페이지가 표시되는 것을 확인 할 수 있습니다.
알고리즘 문제를 풀다보면 정렬을 해야하는 경우가 많이 발생합니다. 기본적으로 제공되는 Arrays.sort() 함수가 있지만 이것만으로 문제를 풀기에는 한계가 있습니다. 특히 다중차순을 요하는 문제는 직접 구현하는 것이 빠르고 이해가 쉽습니다.
기본적인 정렬 코드
아래는 오름차순, 내림차순, 다중차순의 기본 정렬 구현 코드입니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Comparator;
class Node implements Comparable<Node>{
int a;
int b;
public Node(int a, int b){
this.a = a;
this.b = b;
}
@Override
public int compareTo(Node tar) {
// tar 기준으로 tar vs this 중 tar 우선순위가 더 높으면 1
// tar 기준으로 우선순위가 동등하면 0
// tar 기준으로 tar vs this 중 tar 우선순위가 더 낮으면 -1
if(tar.a > this.a) return 1;
if(tar.a < this.a) return -1;
// 첫 수가 우선쉰위가 도등할때 아래 조건을 따른다.
if (tar.b < this.b) return 1;
if (tar.b > this.b) return -1;
return 0;
}
}
public class Sort_ex01 {
// 정렬
// 1. 오름차순
// 2. 내림차순
// 3. 다중차순
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
Integer[] arr = {5,4,5,4,4,5};
//1. 오름차순
Arrays.sort(arr);
//2. 내림차순
Arrays.sort(arr, Comparator.reverseOrder());
//3. 다중차순
Node[] arrNode = new Node[6];
arrNode[0] = new Node(5,8);
arrNode[1] = new Node(4,2);
arrNode[2] = new Node(5,1);
arrNode[3] = new Node(4,9);
arrNode[4] = new Node(4,7);
arrNode[5] = new Node(5,3);
// 정렬조건
// 1) 첫번째 수가 큰수 우선
// 2) 두번째 수가 작은 수 우선
Arrays.sort(arrNode);
int a=1;
br.close();
bw.close();
}
}
오름차순, 내림차순은 Arrays.sort() 함수를 이용하여 구현이 간단합니다. 하지만 다중차순의 경우 정렬 조건이 1) 첫번째 수가 큰수, 2) 두번째 수가 작은 수 우선이라고 한다면 위 코드와 같이 class 를 만들어 Comparable 을 이용하여 구현하여 줍니다. 정렬 우선순위는 compareTo() 함수를 오버라이드 하여 구현하는데, tar 기준으로 tar vs this 중 tar 우선순위가 더 높으면 1, tar 기준으로 우선순위가 동등하면 0, tar 기준으로 tar vs this 중 tar 우선순위가 더 낮으면 -1이 중요합니다.
이러한 방법을 통하여 "숫자와 문자를 다음과 같은 우선순위 조건으로 맞추어 정렬 후 출력" 하는 문제도 해결이 가능합니다. (ex, 1)짝수 우선 2)숫자 오름차순 3)문자 오름차순)
오랫만에 블로그에 글을 남깁니다.
Flex에서 AMF통신을 이용할때 사용하는 RemoteClass 메타데이타 태그를 만들때, 너무 귀찮아서 프로그램으로 만들어 보았습니다. 왜
RemoteClass 메타데이타 태그를 사용해야만 하나...?? 정확한 답은 지돌스타님 블로그 "[ActionScript 3, Flex]되도록이면 직접적인 Object 클래스 사용을 지양해야하는 이유"를 참고 하면 될것 같습니다. 저는 시간적인 것 보다도...코딩을 하면서 Object로 받아서 사용하는것 보다 더 명료하게 사용할수 있기 때문이라고 말하고 싶습니다. 그래야 코딩하기도 편하고, 코딩 속도도 올라가는 느낌이라..;;
[프로그램 사용법]
기본적인 프로그램은 아래와 같습니다. 보시면 알겠지만 사용법은 간단합니다.
우선 RemoteObject로 넘겨 받을 JAVA 클래스 파일이 있다고 전제를 두고 개발을 하였습니다. '*'는 필수 입력입니다.
- VO java file : RemoteObject로 넘겨 받을 JAVA 클래스 파일 - AS3 VO file Path : 생성될 VO 클래스 의 위치를 지정 - AS3 VO file name : 생성될 VO 클래스 의 파일명 지정 - AS3 VO package : 생성될 VO클래스의 패키지 지정 - File charSet : "VO java file"의 문자셋 설정 (현재, UTF-8 , EUC-JP 지원)
위와 같이 입력후 [VO Generate] 버튼을 클릭하면 아랫부분의 생성될 VO클래스가 나타납니다.
필요한 부분을 수정하시고 [Copy to Clipboard]를 누르면 클립보드에 내용이 복사됩니다. 파일로 만들기를 원하신다면 [Save as File] 을 누르시면 됩니다. 파일은 "AS3 VO file Path"에 지정된 경로에 저장됩니다.
[참고]
1. JAVA파일의 주석은 되도록이면 모두 가져오겠끔 개발했습니다. (함수, 변수의 설명을 가지고 오고 싶었음)
- "//" 로 시작하며 "*/" 문자가 들어있는 라인 --> 설명 주석으로 생각함
- 처음 문자가 "*", "/*" 로 시작되는 라인 --> 함수의 설명이나 변수의 설명으로 생각함
2. JAVA파일에서 제외되는 라인
- serialVersionUID 가 들어있는 라인
- 라인의 문자길이가 0인 라인
- "\r"만 존재하는 라인
3. setter/getter 함수의 설명은 주석부분과 함수부분이 따로따로 되어있습니다. 이부분은 각자 에디터에서 처리 하세요. 지금은 고치기 귀찮네요..;;; ㅡ.ㅡ;;;
아직은 좀 더 수정을 해야되는 부분이 있습니다. 저도 직접 사용하면서 불편한 부분이나 필요한 부분이 있으면 수정해 다시 이곳에 올리겠습니다.
한국에서는 잘 사용하지않는 부분이지만, 일본에서는 거의 모든 프로젝트에 들어가는 LDAP ...
처음에는 뭔지 잘 몰랐지만, 조금씩 알것 같은 느낌...
너무 많은 곳에서 LDAP 관련 인증을 이용하여 로그인을 하기 때문에 LDAP에 관련 Java 프로그램을 만들어 보았다.
그럼 LDAP은 뭘까? 아래는 위키에 설명된 것을 발취한 내용이다.
LDAP(Lightweight Directory Access Protocol, 라이트웨이트 디렉터리 액세스 프로토콜)은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다.
디렉터리는 논리, 계급 방식 속에서 조직화된, 비슷한 특성을 가진 객체들의 모임이다. 가장 일반적인 예로는 전화 번호부(telephone directory)가 있는데 가나다 순의 일련의 이름을 가지고 있고, 이름마다 전화 번호와 주소가 포함되어 있다. 이러한 기본 설계 때문에 LDAP는 인증을 위한 다른 서비스에 의해 자주 사용된다.
LDAP 디렉터리 트리는 선택된 모델에 따라 다양한 정치적, 지질학적, 조직적 경계를 반영하기도 한다. 오늘날 LDAP의 배치는 최상위 수준의 계급을 구조화하기 위해 도메인 이름 서비스의 이름을 사용하는 경향이 있다. 디렉터리 안에 들어가면 들어갈수록 사람들, 조직, 프린터, 문서, 그룹 등을 대표하는 항목들이 나타난다.
LDAP의 현재 버전은 LDAPv3이다.
쉽게 생각하면 디렉토리 서비스...디렉토리 트리를 이용하여 빠른 검색을 이용한다..뭐 이런것 같음...
java로 구현한 LDAP 디렉토리 삭제
(하위 디렉토리 추가는 관리자 계정으로 로그인을 해야한다.)
위 소스를 실행하면 디렉토리가 삭제된다.
지금까지 LDAP에 관련된 검색, 추가, 삭제, 수정에 관한것을 java를 이용하여 구현 해보았다. 실제로 LDAP을 잘 이용하기 위해서는 좀더 공부를 할 필요하가 있다.
한국에서는 잘 사용하지않는 부분이지만, 일본에서는 거의 모든 프로젝트에 들어가는 LDAP ...
처음에는 뭔지 잘 몰랐지만, 조금씩 알것 같은 느낌...
너무 많은 곳에서 LDAP 관련 인증을 이용하여 로그인을 하기 때문에 LDAP에 관련 Java 프로그램을 만들어 보았다.
그럼 LDAP은 뭘까? 아래는 위키에 설명된 것을 발취한 내용이다.
LDAP(Lightweight Directory Access Protocol, 라이트웨이트 디렉터리 액세스 프로토콜)은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다.
디렉터리는 논리, 계급 방식 속에서 조직화된, 비슷한 특성을 가진 객체들의 모임이다. 가장 일반적인 예로는 전화 번호부(telephone directory)가 있는데 가나다 순의 일련의 이름을 가지고 있고, 이름마다 전화 번호와 주소가 포함되어 있다. 이러한 기본 설계 때문에 LDAP는 인증을 위한 다른 서비스에 의해 자주 사용된다.
LDAP 디렉터리 트리는 선택된 모델에 따라 다양한 정치적, 지질학적, 조직적 경계를 반영하기도 한다. 오늘날 LDAP의 배치는 최상위 수준의 계급을 구조화하기 위해 도메인 이름 서비스의 이름을 사용하는 경향이 있다. 디렉터리 안에 들어가면 들어갈수록 사람들, 조직, 프린터, 문서, 그룹 등을 대표하는 항목들이 나타난다.
LDAP의 현재 버전은 LDAPv3이다.
쉽게 생각하면 디렉토리 서비스...디렉토리 트리를 이용하여 빠른 검색을 이용한다..뭐 이런것 같음...
한국에서는 잘 사용하지않는 부분이지만, 일본에서는 거의 모든 프로젝트에 들어가는 LDAP ...
처음에는 뭔지 잘 몰랐지만, 조금씩 알것 같은 느낌...
너무 많은 곳에서 LDAP 관련 인증을 이용하여 로그인을 하기 때문에 LDAP에 관련 Java 프로그램을 만들어 보았다.
그럼 LDAP은 뭘까? 아래는 위키에 설명된 것을 발취한 내용이다.
LDAP(Lightweight Directory Access Protocol, 라이트웨이트 디렉터리 액세스 프로토콜)은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다.
디렉터리는 논리, 계급 방식 속에서 조직화된, 비슷한 특성을 가진 객체들의 모임이다. 가장 일반적인 예로는 전화 번호부(telephone directory)가 있는데 가나다 순의 일련의 이름을 가지고 있고, 이름마다 전화 번호와 주소가 포함되어 있다. 이러한 기본 설계 때문에 LDAP는 인증을 위한 다른 서비스에 의해 자주 사용된다.
LDAP 디렉터리 트리는 선택된 모델에 따라 다양한 정치적, 지질학적, 조직적 경계를 반영하기도 한다. 오늘날 LDAP의 배치는 최상위 수준의 계급을 구조화하기 위해 도메인 이름 서비스의 이름을 사용하는 경향이 있다. 디렉터리 안에 들어가면 들어갈수록 사람들, 조직, 프린터, 문서, 그룹 등을 대표하는 항목들이 나타난다.
LDAP의 현재 버전은 LDAPv3이다.
쉽게 생각하면 디렉토리 서비스...디렉토리 트리를 이용하여 빠른 검색을 이용한다..뭐 이런것 같음...
java로 구현한 LDAP 디렉토리 추가
(하위 디렉토리 추가는 관리자 계정으로 로그인을 해야한다.)
실행결과 LDAPAddSubDir success. 가 출력된다. 앞에서 만든 검색소스를 이용하여 검색을 하면 ...
한국에서는 잘 사용하지않는 부분이지만, 일본에서는 거의 모든 프로젝트에 들어가는 LDAP ...
처음에는 뭔지 잘 몰랐지만, 조금씩 알것 같은 느낌...
너무 많은 곳에서 LDAP 관련 인증을 이용하여 로그인을 하기 때문에 LDAP에 관련 Java 프로그램을 만들어 보았다.
그럼 LDAP은 뭘까? 아래는 위키에 설명된 것을 발취한 내용이다.
LDAP(Lightweight Directory Access Protocol, 라이트웨이트 디렉터리 액세스 프로토콜)은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다.
디렉터리는 논리, 계급 방식 속에서 조직화된, 비슷한 특성을 가진 객체들의 모임이다. 가장 일반적인 예로는 전화 번호부(telephone directory)가 있는데 가나다 순의 일련의 이름을 가지고 있고, 이름마다 전화 번호와 주소가 포함되어 있다. 이러한 기본 설계 때문에 LDAP는 인증을 위한 다른 서비스에 의해 자주 사용된다.
LDAP 디렉터리 트리는 선택된 모델에 따라 다양한 정치적, 지질학적, 조직적 경계를 반영하기도 한다. 오늘날 LDAP의 배치는 최상위 수준의 계급을 구조화하기 위해 도메인 이름 서비스의 이름을 사용하는 경향이 있다. 디렉터리 안에 들어가면 들어갈수록 사람들, 조직, 프린터, 문서, 그룹 등을 대표하는 항목들이 나타난다.
LDAP의 현재 버전은 LDAPv3이다.
쉽게 생각하면 디렉토리 서비스...디렉토리 트리를 이용하여 빠른 검색을 이용한다..뭐 이런것 같음...
아래는 내가 사용한 LDAP 구조이다.
위부분에서 중요한 부분은 바로 dn이다. 바로 이부분...(예를들어서 썼음..)
java를 이용한 검색 소스
실행 결과
마지막 "Errors listing attributes: java.lang.NullPointerException"부분은 아직 지정되지 않은telephonenumber Attribute를 참조하려고 했는데 실제, telephonenumber부분이 아직 없기 때문에 나오는 것이다.