'분류 전체보기'에 해당되는 글 178건

  1. 2015.09.30 HTTP 프로토콜
  2. 2015.09.30 한글 인코딩 종류
  3. 2015.09.22 htaccess 설정방법
  4. 2015.09.07 MySQL 외부 접속 설정
  5. 2015.08.31 리눅스 백업 관련
  6. 2015.08.27 DNS zone 파일
  7. 2015.08.26 URI / URL / URN
  8. 2015.08.24 PHP 날짜함수 정리
  9. 2015.08.24 MySQL join
  10. 2015.08.19 Timestamp 이용하기

HTTP 프로토콜

2015. 9. 30. 13:18

1.1 Tim Berners-Lee

HTTP를 개발한 영국의 컴퓨터 엔지니어로 하이퍼텍스트를 개발했으며, URL, HTTP, HTML을 설계했다. HTTP와 HTML, 하이퍼텍스트의 영향이 워낙에 강력하고 광범위해서 인터넷의 아버지라고 부른다.

1.2 HTTP에 대하여

HTTP(Hypertext Transfer Protocol)는 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜 이다. 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다.

가장 성공적인 인터넷 프로토콜이다. HTTP가 없었다면 인터넷은 지금과는 전혀 다른 모습이였을거다.

HTTP는 어떤 종류의 데이터든지 전송할 수 있도록 설계돼 있다. 인터넷상에서 흔히 볼수 있는 HTML로 작성된 문서는 HTTP로 보낼 수 있는 데이터의 한 종류일 뿐이다. 이미지, 동영상, 오디오, 텍스트 문서들 아무튼 종류를 가리지 않는다.

Transfer라는 해석 그대로 데이터를 전송하겠다라는 의미로 앞에 Hypertext[1]가 붙은 이유는 하이퍼텍스트 기반으로 데이터를 전송하겠다는. 간단히 말해서 링크기반으로 데이터에 접속하겠다는 의미가 되겠다.

1.3 작동 방식

HTTP는 서버/클라이언트 모델을 따른다. 클라이언트에서 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)한다.

  1. 클라이언트 : 서버에 요청하는 클라이언트 소프트웨어가 설치된 컴퓨터. chrom, firefox, ie등의 클라이언트 소프트웨어를 이용한다. 클라이언트는 URI를 이용해서 서버에 접속하고, 데이터를 요청할 수 있다.
  2. 서버 : 클라이언트의 요청을 받아서, 요청을 해석하고 응답을 하는 소프트웨어가 설치된 컴퓨터. Apache, nginx, IIS, lighttpd 등이 서버 소프트웨어다.

웹서버는 보통 표준포트인 80번 포트로 서비스한다.

1.4 Connectless & Stateless

HTTP는 Connectless 방식으로 작동한다[2]. 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버린다. 기본적으로는 자원 하나에 대해서 하나의 연결을 만든다. 이런 작동방식은 각각 아래의 장점과 단점을 가진다.
  • 장점 : 불특정 다수를 대상으로 하는 서비스에 적합한 방식이다. 수십만명이 웹 서비스를 사용하더라도 접속유지는 최소한으로 할 수 있기 때문에, 더 많은 유저의 요청을 처리할 수 있다.
  • 단점 : 연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수가 없다. 이러한 HTTP의 특징을 stateless라고 하는데, Connectless로 부터 파생되는 특징이라고 할 수 있다. 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 당장에 문제가 생긴다. 예컨데, 클라이언트가 과거에 로그인을 성공하더라도 로그 정보를 유지할 수가 없다. HTTP는 cookie를 이용해서 이 문제를 해결하고 있다.

Cookie는 클라이언트와 서버의 상태 정보를 담고 있는 정보조각이다. 로그인을 예로 들자면, 클라이언트가 로그인에 성공하면, 서버는 로그인 정보를 자신의 데이터베이스에 저장하고 동일한 값을 cookie형태로 클라이언트에 보낸다. 클라이언트는 다음 번 요청때 cookie를 서버에 보내는데, 서버는 cookie 값으로 자신의 데이터베이스를 조회해서 로그인 여부를 확인할 수 있다. 자세한 내용은 아래 세션 관리에서 다룬다.

1.5 URI

클라이언트 프로그램(이하 웹 브라우저)은 URI를 이용하여 자원의 위치를 찾는다. URI는 HTTP와는 독립된 다른 체계다. HTTP는 전송 프로토콜이고, URI는 자원의 위치를 알려주기 위한 프로토콜이다. Uniform Resource Identifiers 의 줄임로, World Wide Web 상에서 접근하고자 하는 자원의 위치를 나타내기 위해서 사용한다. 자원은 "문서", "이미지", "동영상", "프로그램", "이메일"등 모든 것이 될 수 있다. 메일을 받을 상대방의 위치를 나타내기 위해서 사용하는 email://yundream@joinc.co.kr, 웹페이지의 위치를 나타내기 위해서 사용하는 http://www.joinc.co.kr/index.php 등이 URI의 예다.

http://www.joinc.co.kr/index.php 를 분석해보자.
  1. http : 자원에 접근하기 위해서 http 프로토콜을 사용한다.
  2. www.joinc.co.kr : 자원의 인터넷 상에서의 위치는 www.joinc.co.kr이다. 도메인은 ip 주소로 변환되므로, ip 주소로 서버의 위치를 찾을 수 있다.
  3. index.php : 요청할 자원의 이름이다.

이렇게 "프로토콜", "위치", "자원명"으로 (인터넷 상에서) 어디에 있던지 자원에 접근할 수 있다.

1.6 Method(메서드)

메서드는 요청의 종류를 서버에게 알려주기 위해서 사용한다. 다음은 요청에 사용할 수 있는 메서드들이다.
  • GET : 정보를 요청하기 위해서 사용한다. (SELECT)
  • POST : 정보를 밀어넣기 위해서 사용한다. (INSERT)
  • PUT : 정보를 업데이트하기 위해서 사용한다. (UPDATE)
  • DELETE : 정보를 삭제하기 위해서 사용한다. (DELETE)
  • HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
  • OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청한다.
  • TRACE : 클라이언트의 요청을 그대로 반환한다. 예컨데 echo 서비스로 서버 상태를 확인하기 위한 목적으로 주로 사용한다.
보통 웹 서비스들은 GETPOST만을 이용해서 개발한다. DELETE나 PUT등이 필요한 요청에도 GET과 POST를 사용하는데, 예를들어 게시판에서 특정 레코드를 삭제 할때도 GET 으로 표현한다. 각 용도에 맞는 메서드가 준비돼 있음에도 이렇게 사용하는 이유는
  1. GET과 POST만으로도 모든 종류의 요청을 표현할 수 있어서
  2. 편하게 개발하고 싶어서
  3. 웹 브라우저로 DELETE, HEAD등을 보내는 form이 없어서 이다.
이렇게 명시적으로 메서드를 사용하지 않아도 웹 서비스 개발에 큰 문제는 없지만, 가능하면 CRUD[3]를 명시하는게 좋지 않을까 ?

그렇다. Restful API 서버의 경우에는 GET, POST, DELETE, PUT을 명시적으로 구분한다. 자원의 위치 뿐만 아니라 자원에 할 일 까지 명확히 명시할 수 있기 때문에, Open API 서버를 만들기 위해서 널리 사용한다. 아래는 사용 예다.
  • GET api.joinc.co.kr/user/list : 유저 목록을 가져온다.
  • POST api.joinc.co.kr/user/create : 유저를 생성한다. 생성에 필요한 유저 정보는 POST 데이터 형식으로 전달할 수 있다.
  • PUT api.joinc.co.kr/usr/123 : 유저 ID가 123인 유저의 정보를 업데이트 한다.
  • DELETE api.joinc.co.kr/user/123 : 유저 ID가 123인 유저를 삭제한다.
한 눈에 쏙 들어온다.

1.7 요청 데이터 포멧

웹 브라우저는 웹 서버에 데이터를 "요청"하는 "클라이언트 프로그램" 이다. 요청은 서버가 인식할 수 있는 약속된 형식(HTTP 형식)을 따라야 한다.

요청 데이터는 "HEADER"와 "BODY"로 구성된다.


헤더에는 요청과 요청 데이터에 대한 메타정보들이 들어있다. 다음은 헤더의 일반적인 모습이다.
1 GET /cgi-bin/http_trace.pl HTTP/1.1\r\n
2 ACCEPT_ENCODING: gzip,deflate,sdch\r\n
3 CONNECTION: keep-alive\r\n
4 ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
5 ACCEPT_CHARSET: windows-949,utf-8;q=0.7,*;q=0.3\r\n
6 USER_AGENT: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24\r\n 
7 ACCEPT_LANGUAGE: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4\rn
8 HOST: www.joinc.co.kr\r\n
9 \r\n
HTTP 헤더는 라인피드와 캐리지 리턴(/r/n)을 함께 사용한다. HTTP 헤더를 파싱할 때 주의해야 한다.
  1. 필수 요소로 요청의 제일 처음에 와야 한다 3개의 필드로 이뤄져 있다.
    1. 요청 메서드 : GET, PUT, POST, PUSH, OPTIONS 등의 요청 방식이 온다.
    2. 요청 URI : 요청하는 자원의 위치를 명시한다.
    3. HTTP 프로토콜 버전 : 웹 브라우저가 사용하는 프로토콜 버전이다. (2013년 6월)현재

1.8 응답 헤더 포멧

응답 헤더포멧이다. 응답 헤더는 서버의 여러 상태 정보를 포함하기 때문에, 꽤 복잡해질 수 있다. wget을 이용하면 헤더 정보를 가져올 수 있다.
# wget -S http://www.test.co.krsdf
HTTP/1.1 200 OK\r\n
Date: Fri, 08 Jul 2011 00:59:41 GMT\r\n
Server: Apache/2.2.4 (Unix) PHP/5.2.0\r\n
X-Powered-By: PHP/5.2.0\r\n
Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n
Last-Modified: Fri, 08 Jul 2011 00:59:41 GMT\r\n
Cache-Control: no-store, no-cache, must-revalidate\r\n
Content-Length: 102\r\n
Keep-Alive: timeout=15, max=100\r\n
Connection: Keep-Alive\r\n
Content-Type: text/html\r\n
\r\n
  1. wget으로 헤더 정보를 출력했다.
  2. 프로토콜과 응답코드 : 반드시 첫줄에 와야 한다. 3개의 필드로 구성돼 있다.
    1. HTTP/1.1 : 응답 프로토콜과 버전
    2. 200 : 응답 코드
    3. OK : 응답 메시지. Not Found, Internal Server Error 등의 메시지다.
  3. 날짜
  4. 서버 프로그램및 스크립트 정보.
  5. 응답헤더에는 다양한 정보를 추가할 수가 있다. 어떤 정보를 추가할지는 사실 개발자 마음이다. HTTP 기반의 서버/클라이언트 제품을 만든다면, 헤더에 애플리케이션 정보를 추가해서 사용하면 된다.
  6. 컨텐츠의 마지막 수정일
  7. 캐쉬 제어 방식.
  8. 컨텐츠 길이.
  9. Keep Alive기능 설정이다. keep alive는 클라이언트측에 연결을 유지하라는 신호를 보내기 위해서 사용한다. 그러면 클라이언트는 최대 timeout에 지정된 시간동안 연결을 유지한다 . 이 시간동안 클라이언트는 이미 맺어진 연결로 요청을 계속 보낼 수 있다 . Keep Alive는 따로 자세히 설명한다.
  10. Content-Type. 응답에 실어 보내는 컨텐츠가 HTML 문서인지, 이미지인지, CSS, JavaScript인지 혹은 다른 애플리케이션 형태인지를 알려준다. 웹 애플리케이션들은 Content-Type에 따라서 Body의 데이터를 어떻게 읽을지를 결정한다. 따라서 전송 데이터에 맞는 content-type를 명시해야 한다.

1.9 응답코드

서버는 응답코드로 서버의 상태를 알려준다. 3자리의 숫자로 이루어져 있다. 주요 응답코드를 정리했다. 응답코드는 응답헤더의 첫번째 줄에 위치하다.
  • HTTP/1.1 200 OK\r\n
  • HTTP/1.1 404 Not Found\r\n
  • HTTP/1.1 500 Internal error\r\n

1.9.1 1xx 조건부 응답

이건 사용해 본적이 없다. 없을 뿐만 아니라 문서를 읽어도 도대체 무슨내용인지 알 수 없어서 공백으로 뒀다. 아시는 분은 코멘트 부탁.

HTTP 요청은 수신 됐고, 다음 처리를 계속해야함을 의미합니다.

1.9.2 2xx 성공

서버가 요청을 성공적으로 처리했음을 의미한다.
코드번호 설명 비고
200 성공 서버가 요청을 제대로 처리했다.
201 생성됨 요청이 성공했으며, 새로운 리소스를 만들었다.
202 허용됨 요청을 받았으나, 아직 처리하지는 못했다.
204 컨텐츠 없음 요청을 처리했지만, 컨텐츠를 제공하지 않는다.
205 컨텐츠 재 설정 요청을 처리했지만, 컨텐츠를 표시하지 않는다. 그리고 문서를 재 설정할 것을 요구한다.
206 일부 성공 요청의 일부만 성공적으로 처리
207 다중상태


1.9.3 3xx 리다이렉션

때때로 요청을 완료하기 위해서, 다른 페이지로 보내야 할 때가 있다. 예컨데, 로그인을 성공하고 나서 대문 페이지로 보낸다거나, 다운로드 페이지로 보내는 등의 용도로 사용할 수 있다.
코드번호 설명 비고
300 여러 선택 항목
301 영구이동 요청한 페이지가 다른 위치로 영구이동 했다.
302 임시이동 요청한 페이지가 다른 위치로 임시이동 했다. 요청자는 여전히 현재 페이지를 요청해야 한다.
303 기타위치 보기 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우
304 수정되지 않음 마지막 요청 이후 요청한 페이지가 수정되지 않았다. if-Modified-Sine 헤더에 지정된 날짜/시간 이래로 지정된 문서가 변경된 사실이 없는 경우 이 code로 응답한다.
305 프록시 사용 요청자는 프록시를 사용하여 요청한 페이지만 접근할 수 있다.


1.9.4 4xx 요청 오류

클라이언트 요청에 오류가 있음을 의미한다.
코드번호 설명 비고
400 잘못된 요청 주로 헤더 포멧이 HTTP 규약에 맞지 않을 경우
401 권한 없음 인증을 필요로 하는 요청이다. Basic access authentication에 사용한다.
403 금지 서버가 요청을 거부하고 있다.
404 찾을 수 없음 요청한 자원이 서버에 존재하지 않는다.
405 허용하지 않는 방법 요청에 지정한 방법을 사용할 수 없다.
406 허용되지 않음 요청한 페이지를 콘텐츠 특성 때문에 응답할 수 없다.
408 요청시간 초과 서버의 요청대기가 시간을 초과
410 사라짐 요청한 자원이 삭제되었음. 404와 비슷하지만, 410은 과거에 있었으나 지금 없는 자원이다. 예컨데, 게시판에서 삭제한 포스트에 접근하는 경우
411 길이필요 유효한 컨텐츠 길이를 명시해야 한다.


1.10 Keep Alive

HTTP 1.1 부터는 keep-alive 기능을 지원한다.

HTTP는 하나의 연결에 하나의 요청을 하는 것을 기준으로 설계가 됐다. 요즘 웹 서비스의 경우 간단한 페이지라고 해도 수십개의 데이터 - 이미지, 문서, css, javascript - 등이 있기 마련인데, HTTP의 원래 규격대로라면 웹페이지를 하나 표시하기 위해서 연결을 맺고 끝는 과정을 수십번을 반복해야 한다. 당연히 비효율적일 수 밖에 없다. 연결을 맺고 끝는 것은 TCP 통신 과정에서 가장 많은 비용이 소비되는 작업이기 때문이다.

예를들어 HTML로 표현된 문서를 다운로드 받는다고 가정해 보자. 이 문서에는 20여개 정도의 이미지, css, javascript 파일이 있다. Keep alive를 지원하지 않을 경우 다음과 같은 과정을 거친다.
  • 웹 서버에 연결한다.
  • HTML 문서를 다운로드 한다.
  • 웹 서버 연결을 끊는다.
  • HTML 문서의 image, css, javascript 링크들을 읽어서 다운로드해야할 경로를 저장한다.
  • 웹 서버에 연결한다.
  • 첫번째 이미지를 다운로드
  • 연결을 끊는다.
  • 웹 서버에 연결한다.
  • 두번째 이미지를 다운로드
  • 연결을 끊는다.
  • 모든 링크를 다운로드 할 때까지 반복한다.

Keep-alive 설정을 하면, 지정된 시간동안 연결을 끊지 않고 요청을 계속해서 보낼 수 있다.
  • 웹 서버에 연결한다.
  • HTML 문서를 다운로드 한다.
  • Image, css, javascript 들을 다운로드 한다.
  • 모든 문서를 다운로드 받았다면 연결을 끊는다.

1.10.1 Keep alive 설정

Keep-alive는 HTTP/1.1 부터 사용할 수 있다. (2013년 6월 현재)모든 웹서버와 브라우저는 HTTP/1.1을 지원한다고 가정해도 무방하다. 아래와 같은 과정을 거쳐서 keep alive를 설정을 한다.
  1. 웹 브라우저는 요청 헤더에 keep-alive 방식의 연결을 할 것을 명시한다. chrom웹 브라우저로 www.joinc.co.kr로의 연결 요청을 캡춰했다.
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Charset:windows-949,utf-8;q=0.7,*;q=0.3
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
    Connection:keep-alive
    Host:www.joinc.co.kr
    Referer:http://www.joinc.co.kr/
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    
  2. 웹 서버의 설정이 kepp-alive 방식을 지원하도록 설정돼 있다면, 응답 헤더에 keep-alive 정보를 실어 보낸다. www.joinc.co.kr 서버의 응답 헤더의 일부분이다.
    Connection:Keep-Alive
    Keep-Alive:timeout=5, max=100
    Content-Encoding:gzip
    Content-Length:5933
    Content-Type:text/html
    Vary:Accept-Encoding
    
    • connection:Keep-Alive : 연결을 keep-alive 상태로 유지한다.
    • Keep-Alive:timeout=5, max=100 : 하나의 연결당 5초동안 유지한다. Keep-alive 연결은 최대 100개까지 허용한다. keep-alive는 하나의 연결로 여러 요청을 처리하기 때문에 효율적이긴 하지만, 연결이 그만큼 길어지기 때문에 동시간대 연결이 늘어난다. 운영체제에 있어서 연결은 "유한한 자원"이다. 연결을 다 써버리면, 서버는 더 이상 연결을 받을 수 없게 된다. Max 값을 이용해서 keep-alive 연결을 제한하는 이유다.

{{{}}}

1.11 세션 관리

HTTP를 기반으로 하는 웹 서비스는 connectless방식으로 이전의 상태정보를 유지할 수 없다. 결국 클라이언트의 상태정보를 정보조각 형태로 서버와 클라이언트(웹 브라우저)에 남기는 방식으로 문제를 해결한다. 이 정보조각을 cookie(이하 쿠키)라고 한다. 서버는 cookie를 이용해서 세션정보를 관리한다.

세션과 cookie 관계를 정리하자면
  • 서버는 클라이언트와 cookie를 주고 받는 것으로 상태를 확인할 수 있다.
    • ex) 클라이언트가 로그인을 한 상태인지
  • 서버는 cookie를 키로하는 값을 데이터베이스에 저장하는 방식으로 "세션"을 유지한다.
    • ex) 로그인한 클라이언트가 "물건 - A"를 구매했다면, 클라이언트의 cookie id를 key로 데이터베이스에 구매정보를 update 한다.

1.11.1 쿠키

쿠키 관련 내용은 cookie문서를 참고한다.

2 디버깅 및 성능 측정

HTTP를 기반으로 하는 웹 서버를 디버깅하는 방법에 대해서 알아본다. 모든 디버깅이 그렇듯이, 핵심은 헤더의 확인 특히 응답코드를 확인하는데 있다.

2.1 디버깅은 리눅스로

설명할 대부분의 툴들은 공개소프트웨어로 리눅스에서 테스트했다. 아마도 윈도우에서도 비슷한 툴들을 사용할 수 있을 테지만, (거의 대부분의 툴이 기본설치되는)리눅스 환경 만큼 편하지는 않을 것이다.

2.2 telnet 으로 디버깅

Telnet는 HTTP을 포함한 모든 네트워크 프로그램 테스트에 사용할 수 있는 도구다. Telnet는 원시도구인 만큼 복잡한 디버깅은 힘들지만, 초기에 빠르게 디버깅 정보를 획득할 때 유용하게 사용할 수 있다. Telnet으로 디버깅 할 수 있는 정보는 다음과 같다.

웹 서버가 올라왔는지 확인한다. 웹 서버포트(보통 80번 포트)에 대해서 테스트해보자.
# telnet www.joinc.co.kr 80
Trying xxx.xxx.xxx
telnet: Unable to connect to remote host: Connection refused
Connection refuse가 떨어지면, 서비스 포트가 열려있지 않다는 것을 의미한다.

입력 프롬프트가 떨어지면, 연결이 됐다는 것을 의미한다.
# telnet www.joinc.co.kr 80
Trying 1.226.82.91...
Connected to www.joinc.co.kr.
Escape character is '^]'.
이 상태에서 HTTP 명세대로 요청을 보내면 응답을 받을 수 있다. www.joinc.co.kr에 index.html을 요청한 예다.
$ telnet www.joinc.co.kr 80
Trying 1.226.82.91...
Connected to www.joinc.co.kr.
Escape character is '^]'.
GET /index.html HTTP/1.1
HOST: www.joinc.co.kr

HTTP/1.1 200 OK
Date: Sun, 16 Jun 2013 02:28:28 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Fri, 22 Jun 2012 06:58:22 GMT
ETag: "c43e-76-4c30a286a7f80"
Accept-Ranges: bytes
Content-Length: 118
Vary: Accept-Encoding
Content-Type: text/html

<head>
<meta http-equiv="refresh" content="0;URL=http://www.joinc.co.kr/modules/moniwiki/wiki.php/FrontPage">
</head>
Connection closed by foreign host.

telnet으로 연결 했는데, timeout이 떨어질 때가 있다. 문제의 원인은 보통 둘 중 하나다.
  1. 방화벽으로 막혀있거나
  2. 서버에 문제가 생겼다.

2.3 chrome 으로 디버깅

telnet를 이용해서 웹 서버 상태를 빠르게 파악한뒤에 더 자세한 정보가 필요하다면 chrome의 개발자도구를 이용하면 된다. chrome에서 F12를 누르면, 창 하단에 디버깅 창이 뜬다. Chrom의 개발자 도구[4]는 웹 프로그램 개발자라면 반드시 익혀야 할 툴 중 하나다.

https://lh3.googleusercontent.com/-ig5HBasUdPo/Ub8f84GICCI/AAAAAAAADGE/ZAl_uRJvieI/s640/chrom_01.png

2.3.1 Elements

https://lh6.googleusercontent.com/-uVTbiqmVeAg/Ub8jm8dHQLI/AAAAAAAADGU/yxPBrOUf1SE/s640/chrom_02.png

HTML 문서의 DOM element를 보여준다. 보여줄 뿐만 아니라 element의 값을 수정하고, 그 결과를 브라우저 상에서 직접 확인할 수 있다. 예컨데, 웹 페이지의 디자인을 바꾸기 위해서 코드를 변경하고 브라우저로 확인하는 노가다를 할 필요가 없다. Element 창에서 실시간으로 수정하고 변화된 모습을 확인할 수 있다.

2.3.2 Resources

Cookie, Local Storage 등의 정보를 확인할 수 있다. 개인적으로 Cookie 창을 주로 사용한다.

https://lh5.googleusercontent.com/-bVopg-0FBLY/UcF2AWLWDXI/AAAAAAAADHk/AtJRu7S44ow/s640/chrom01.png

2.3.3 Network

요청과 응답에 걸린 시간을 측정할 수 있다. 이 정보를 토대로 대략적인 웹페이지 전송시간과 병목구간을 찾아낼 수 있다.

https://lh4.googleusercontent.com/--jTnTqdrTfc/Ub8limE-4ZI/AAAAAAAADGs/7BBZLciwb-0/s640/chrom_04.png

HTTP 프로토콜 수준에서 디버깅할 때 유용한 기능이다. HTTP 요청 헤더와 응답 헤더, Body 정보를 확인할 수 있다.

https://lh5.googleusercontent.com/-_ifDGkPyCVU/Ub8lDyOi8sI/AAAAAAAADGk/UqJpv4JX1HI/s640/chrom_03.png

2.3.4 Profiles

메모리 사용정보를 실시간으로 확인할 수 있다. 하단의 Record버튼을 누르면 메모리 정보를 수집하기 시작한다.

2.3.5 Audits

https://lh5.googleusercontent.com/-NGYNMJxDm3w/UcF58zEIZ2I/AAAAAAAADH0/K4HK5EtMWtE/s640/chrom03.png

페이지에 대한 감사를 수행한다. 페이지 최적화를 위한 정보를 얻기 위해서 사용한다. 위 스샷은 joinc.co.kr에 대한 감사 결과다. 음.. 최적화를 수행해야 할 것 같다.

2.3.6 Console

자바스크립트 개발자에게 반드시 있어야 하는 툴이지 싶다. 강력한 만큼 기능이 많다. 자세한 내용은 http://ohgyun.com/334 를 참고하자.

2.3.7 curl 로 디버깅

curl은 서버로 데이터를 전송하기 위해서 사용하는 툴로 DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET, TFTP등 주요 인터넷 서비스 프로토콜들을 지원한다.

curl의 장점은 상호작용없이 CLI를 통해서 작업을 할 수 있다는데 있다. 직접 웹 서버를 테스트하거나 웹 서버를 관리하는 스크립트를 작성하기 위해서 널리 사용한다.

curl 사용방법은 curl 사용 tip문서를 참고하자.

2.3.8 wget 으로 디버깅

또 하나의 강력한 툴이다. wget은 웹에 있는 문서나 파일을 다운로드 하기 위한 목적으로 주로 사용하는데, curl과 마찬가지로 CLI 기반이라서, 자동화 툴을 개발하기 위한 목적으로 널리 사용한다.

wget과 관련된 자세한 내용은 wget man page문서를 참고한다. wget으로 할 수 있는 일들은 다음과 같다.
  • -S 옵션을 이용해서 응답 헤더 정보를 읽을 수 있다.
    # wget -S http://www.joinc.co.kr
    --2013-06-19 15:05:03--  http://www.joinc.co.kr/
    Resolving www.joinc.co.kr (www.joinc.co.kr)... 1.226.82.91
    Connecting to www.joinc.co.kr (www.joinc.co.kr)|1.226.82.91|:80... connected.
    HTTP request sent, awaiting response... 
      HTTP/1.1 200 OK
      Date: Wed, 19 Jun 2013 15:01:21 GMT
      Server: Apache/2.2.14 (Ubuntu)
      Last-Modified: Fri, 22 Jun 2012 06:58:22 GMT
      ETag: "c43e-76-4c30a286a7f80"
      Accept-Ranges: bytes
      Content-Length: 118
      Vary: Accept-Encoding
      Keep-Alive: timeout=5, max=100
      Connection: Keep-Alive
      Content-Type: text/html
    
  • -d 옵션을 이용하면, 서버와 클라이언트 간에 일어나는 요청/응답 과정과 주고 받는 데이터를 확인할 수 있다.

  • 2.3.9 scapy를 이용한 디버깅



    3 HTTP 응용 소프트웨어

    3.1 웹 서버들

    프로그램 이름 벤더 웹 사이트 호스트 수 점유율
    Apache Apache 359,441,468 53.42 %
    IIS Microsoft 112,303,412 16.69 %
    nginx NGINX. Inc 104,411,087 15.52 %
    GWS Google 23,029,260 3.42 %

    자세한 정보는 http://news.netcraft.com/archives/2013/03/01/march-2013-web-server-survey.html 를 참고하자. Apache가 짱이고, nginx가 떠오르는 형국이다.

    3.2 웹 브라우저들

    웹 브라우저의 대략 적인 발표시기.
    • 1990년 : Tim Berners-Lee가 첫번째 브라우저를 개발하다.
    • 1993년 : Mosaic 웹브라우저 개발. 대중적으로 사용된 첫번째 웹브라우저다. Mosic은 나중에 Netscape가 된다.
    • 1996년 : 인터넷 익스플로어 개발. 시작은 미약했으나 MS 운영체제의 파워에 힘입어 1996년 82%의 시장점유율을 기록하기도 했다. 그후 계속 점유율이 떨어져 지금은 20%정도에 머무르고 있다.
    • 1996년 : Opera.
    • 2002년 : Firefox
    • 2004년 : Safari
    • 2009년 : Chrome의 성장은 눈부시다고 할 수 있다. 약 4년이지난 2013년 현재, 32%의 점유율로 가장 많이 사용하는 브라우저가 됐다.

    https://lh5.googleusercontent.com/-WHkYAI8UyfU/UchenxSF7WI/AAAAAAAADIY/2S1nG9g9A1w/s640/StatCounter-browser-ww-monthly-200807-201305.jpg

    4 HTTP 응용

    4.1 REST

    HTTP의 메서드를 다시 한번 살펴보자.
    • GET : 정보를 요청하기 위해서 사용한다. (SELECT)
    • POST : 정보를 밀어넣기 위해서 사용한다. (INSERT)
    • PUT : 정보를 업데이트하기 위해서 사용한다. (UPDATE)
    • DELETE : 정보를 삭제하기 위해서 사용한다. (DELETE)
    데이터를 처리하기 위한 CRUD 요소를 모두 가지고 있는 것을 알 수 있다.

    이렇게 HTTP가 CRUD 요소를 모두 가지고 있다는 것에 착안, 웹 상에서 데이터를 처기하기 위한 아키텍처를 제안한게 바로 REST다. REST는 추가적인 레이어나 세션 관리등을 추가하지 않고도 HTTP 프로토콜만을 이용해서 데이터를 전송할 수 있다는 장점이 있다. 게다가 이미 전세계적으로 깔려있는 HTTP 기반의 소프트웨어 인프라를 그대로 활용할 수 있다는 장점도 가지고 있다.

    이렇게 REST 아키텍처를 개발하는 서비스를 RESTful 서비스라고 한다.

    REST의 특징은 다음과 같다. (HTTP 기반이라서 HTTP의 특징과 장점을 그대로 가진다.)
    1. HTTP만으로 데이터를 전송하고 처리할 수 있다.
    2. Stateless
    3. URI를 이용해서 자원에 접근한다. URI의 가장 중요한 요소는 자원(Resource)다. 이러한 접근 방식의 특징으로 ROA(리소스 기반 아키텍처)라고 한다. ROA와 대비되는 개념으로 SOA(소프트웨어 기반 아키텍처)가 있다.
    4. 단순하며 사용하기 쉽다. REST는 HTTP외에 다른 프로토콜을 필요로 하지 않는다. HTTP를 이해하고 있다면, 몇 분만의 설명으로 아키텍처를 이해할 수 있다. 데이터를 주고 받는 모든 과정과 데이터 포멧 역시 사람이 해석할 수 있을 정도로 직관적이다.

    REST의 이런 단순명로함 대문에 구글, 트위터, 야후등이 자신들의 서비스를 REST 방식으로 제공하고 있다. 개발자를 끌어들이기 위한 OpenAPI역시 REST을 기반으로 하면서, REST의 사용을 활성화 시켰다. REST 기반의 API를 일반적으로 RESTFul API라고 부른다.

    REST와 관련해서는 비슷한 목적의 SOAP도 살펴볼 필요가 있겠다. REST는 REST에 대해서에서 따로 정리하고 있다.

    5 HTTPS

    SSL은 전자상거래에서의 데이터 보안을 위해서 개발한 통신 레이어다. SSL은 전송계층 프로토콜이기 때문에, 응용 계층의 어떠한 프로토콜이라도 암호화해서 보낼 수 있다.

    HTTP는 기본적으로 평문 데이터 전송을 원칙으로 하기 때문에 개인의 프라이버시가 오가는 서비스들(전자상거래, 전자메일, 사내문서)에 사용하기 힘들다. HTTPS는 SSL 레이어위에 HTTP를 통과 시키는 방식이다. 즉 평문의 HTTP 문서는 SSL 레이어를 통과하면서 암호화 돼서 목적지에 도착하고, 목적지에서는 SSL 레이어를 통과하면서 복호화 돼서 웹 브라우저에 전달된다.


    간혹 HTTPS를 하나의 프로토콜로 인식하기도 하는데, HTTP와 SSL은 전혀 다른 계층의 프로토콜콜의 조합이다. HTTPS over SSL로 보는게 좀더 정확한 시각이다. 거의 모든 웹 서버와 웹 브라우저와 HTTP 기반의 툴들 - wget, curl, ab 기타등등 - 이 SSL을 지원한다.

    5.1 HTTP와 다른 점

    • HTTPS URL은 "https://"로 시작한다. 기본 포트번호는 443이다. HTTP URL은 "http://"로 시작한다. 기본 포트번호는 80이다.
    • HTTP는 평문 데이터를 기반으로 하기 때문에, 유저정보와 같은 민감한 정보가 인터넷 상에 그대로 노출된다. 이 정보는 수집되거나 변조될 수 있다. HTTPS는 이러한 공격을 견딜 수 있도록 설계돼 있다.
    • HTTPS는 인증서를 이용해서, 접속 사이트를 신뢰할 수 있는지 평가할 수 있다.
    • 일반적으로 HTTPS는 HTTP에 비해서 (매우 많이)느리다. 많은 양의 데이터를 처리할 경우 성능의 차이를 체감할 수 있다. 많은 웹 사이트들이 민감한 정보를 다루는 페이지(로그인 혹은 유저정보) 페이지를 HTTPS로 전송하고, 기타 페이지는 HTTP로 전송하는 방법을 사용한다. 하드웨어 SSL 가속기를 이용해서 암/복호화 성능을 높이는 방법을 사용하기도 한다.

    6 HTTP 응답 헤더 예제

    HTTP 응답 헤더들을 정리한다. 테스트를 위해서 Sinatra로 웹 서버 환경을 만들었다. curl을 이용해서 클라이언트 테스트를 진행했다. curl의 -D 옵션을 이용하면 헤더 정보를 파일로 저장할 수 있다.

    테스트 예
    # curl -D dump.txt http://www.example.com
    

    6.1 200 OK

    요청을 성공적으로 처리했을 때, 웹 서버는 200 코드를 반환한다.
    HTTP/1.1 200 OK
    Content-Type: text/html;charset=utf-8
    Content-Length: 0
    X-Xss-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN
    Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
    Date: Tue, 17 Sep 2013 12:46:12 GMT
    Connection: Keep-Alive
    

    6.2 URL Redirect

    URL Redirect를 위해서 서버는 301 코드를 반환한다. Location에 리다이렉트할 URL을 명시한다. 301 코드를 받은 클라이언트는 Location 주소로 접속을 시도한다.
    HTTP/1.1 301 Moved Permanently
    Content-Type: text/html;charset=utf-8
    Location: http://192.168.56.101/ok
    Content-Length: 0
    X-Xss-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN 
    Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
    Date: Tue, 17 Sep 2013 12:36:01 GMT
    Connection: Keep-Alive
    

    7 보안

    7.1 인증

    7.1.1 Basic access authentication

    HTTP 영역에서 이루어지는 인증이다. HTTP 영역이기 때문에 인증은 웹 서버 차원에서 이루어진다. 매 요청마다 HTTP 헤더에 아이디와 패스워드를 실어 보내면, 서버에서 아이디와 패스워드를 확인한다.

    인증 프로세스는 다음과 같다.

    1. HTTP 요청을 보낸다.
    2. 웹 서버는 401 Authorization Required를 응답한다. 인증이 필요하니, 인증 정보를 보내란 이야기가 되겠다.
    3. 브라우저는 아이디 패스워드를 입력할 수 있는 인증 창을 띄운다.
    4. 입력한 아이디/패스워드는 HTTP 헤더에 담아서 웹 서버로 보낸다.
    5. 웹 서버는 아이디와 패스워드를 확인한다. 일치하는 아이디/패스워드가 있으면 요청을 처리한다.

    HTTP Basic authentication(이하 BA)는 웹 자원에 접근을 통제하기 위한 최소한의 수단만을 제공한다. cookie, session identifier 이나 로그인 페이지등의 준비 없이 간단하게 사용할 수 있다. 순수하게 HTTP 만을 이용해서 인증을 할 수 있다.

    간단한 만큼, 높은 보안성을 기대하지 않는게 좋다. BA는 아이디와 패스워드를 base64 인코딩해서 전송한다. 암호화 혹은 해쉬등의 기술을 사용하지 않는다. 따라서 아이디/패스워드를 보호해야 한다면 HTTPS를 이용해야만 한다.

    매 요청마다 아이디와 패스워드를 보내는 방식이기 때문에, 클라이언트 프로그램은 처음 입력한 아이디와 패스워드를 저장하기 캐쉬를 가지고 있어야 한다. 브라우저마다 캐쉬를 유지하는 시간에 차이가 있다. MS IE는 15분으로 설정돼 있다. 로그아웃기능이 없기 때문에 개인 PC가 아니라면 자리를 뜨기전에 브라우저 캐쉬를 비워줘야 한다.

    다음은 서버 사이드 프로토콜 형식이다.
    HTTP/1.1 401 Authorization Required
    Date: Wed, 02 Apr 2014 08:23:28 GMT
    Server: Apache/2.2.14 (Ubuntu)
    WWW-Authenticate: Basic realm="sample"
    Vary: Accept-Encoding
    Content-Length: 484
    Content-Type: text/html; charset=iso-8859-1
    

    아래는 클라이언트측 프로토콜이다.
    GET / HTTP/1.1
    HOST: sample.joinc.co.kr
    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 
    

    아이디와 패스워드는 "아이디:패스워드"로 base64 인코딩 된다. 아이디가 yundream, 패스워드가 1111 일 경우 아래와 같이 인코딩하면 된다.
    # echo -n "yundream:1111" | openssl base64
    eXVuZHJlYW06MTExMQ==
    # echo -n "yundream:1111" | python -m base64 -e
    eXVuZHJlYW06MTExMQ==
    

    7.1.2 Digest access authentication

    나중에 정리..

    ----
    • [1] 하이퍼텍스트는 텍스트의 종류다. 일반텍스트와 다른 점이 있다면, "하이퍼"라는 특성에 있다. 이 특성으로 다른 데이터로 접근할 수 있다.
    • [2] 꼭 Connectless이여야 하는건 아니지만, 일반적으로 이렇게 작동한다. Push 서비스등을 위해서 connect를 유지하는 경우도 있다.
    • [3] Create Read Update Delete의 줄임말이다.
    • [4] FireFox의 firebug와 비슷하다

    '' 카테고리의 다른 글

    HTML 특수문자코드표  (0) 2016.04.25
    CGI와 PHP 관계  (0) 2015.10.16
    MySQL join  (0) 2015.08.24
    [HTML] favicon 생성  (0) 2015.07.29
    [CSS] address 태그  (0) 2015.07.28
    Posted by 캐논볼
    ,

    http://studyforus.tistory.com/167


    한글 인코딩 종류


    윈도우를 기본 운영체제로 사용하였을 때는 전혀 느끼지 못했던 인코딩 방식이 웹서버를 운영하면서 인코딩 표준을 따라가다 보니 여러 문제점이 생겼습니다.




    한글 인코딩 방식은 크게 두가지로 나뉩니다. UTF-8  EUC-KR 방식입니다. 현재는 윈도우에서 사용하는 방식은 CP949를 사용하고 있고, 윈도우를 개발한 마이크로 소프트에서 EUC-KR 방식에서 확장하였기 때문에 MS949라고도 부릅니다.


    이름만 듣기에는 굉장히 생소한 부류인데, 컴퓨터를 옛 모델부터 만져오신 분들에게는 이렇게 설명하는 것이 더 편리할 수도 있습니다. 한글 표현(또는 작성 형태)에 따라 조합형 완성형으로 불립니다.


    조합형 방식 

    한글의 편리함을 그대로 가지고 있는 방식입니다. 자음과 모음을 초성, 중성, 종성으로 구분하여 문자를 작성하는 방식을 이야기 합니다. 초성, 중성, 종성을 각기 따로 인식하고 그 것들을 하나의 바이트로 인식하고 조합되어, 총 3바이트의 문자로 인식합니다. (다른 종류도 있긴 하지만 3바이트 방식이 가장 일반적인것 같습니다.) 

    제 개인적인 견해로는 가장 한글과 맞는 방식이라고 생각합니다.


    완성형 방식

    문자를 하나의 완성되어져 있는 글자로 인식하는 방식입니다. 한글이 "가"부터 만들어 질 수 있는문자표를 토대로 문자를 인식합니다. 유니코드보다는 확장성이 떨어지는데 그 이유는 만약 "꽰" 이라는 글자가 완성형 문자표가 있지않다면 "□" 식으로 표기가 됩니다.

    오래된 한글 표현 방식입니다.


    이해하기 쉬운 이미지가 있어서 참고하시는데 도움이 될 듯합니다.


    출처 : http://blog.ohmynews.com/q9447/tag/%EC%99%84%EC%84%B1%ED%98%95%20%EC%BD%94%EB%93%9C



    누가봐도 조합형인 조합형 방식이 한글을 표현하는데에 가장 좋은 방법입니다. 왜냐하면 확장성이 좋으니깐요.

    하지만, 일반적으로 대한민국의 컴퓨터 사용환경에서 조합형방식을 사용하기에는 아주 치명적인 결함이 있습니다. 그 이유는 바로..


    윈도우의 운영체제 점유율 때문입니다.


    윈도우의 인코딩 방식은 기본적으로 완성형입니다. 엄밀하게 이야기 하자면, CP949 (코드페이지 949) 방식을 사용하여 완성형으로 사용하지요. 완성형이지만 EUC-KR에서 진화한 CP949 방식은 더 많은 한글 테이블을 제공합니다. 거의 조합형로 쓸 수 있는 모든 한글을 포함하고 있다고 보시면 됩니다.


    즉, 한글 작성에 있어서는 조합형와 별반 다르지 않았습니다. 그런데, 왜 이게 웹 서버스를 시작하면서 문제가 되느냐, 웹서버나 데이터베이스 또는 php의 경우에 UTF-8과 EUC-KR 중에서 인코딩을 서로 똑같이 맞춰줘야 정상적으로 문자표현이 가능하기 때문입니다.


    그럼 좀더 UTF-8과 EUC-KR 방식에 대해 더 자세히 알아보도록 합시다.




    UTF-8


    현재 왠만한 개발자들이 원하는 방식입니다. 이유는 아주 간단합니다. 왠만한 서버 운영체제와 웹 서버 그리고 코딩자체가 UTF-8로 제작하면 별다른 인코딩을 따로 할 필요가 없기 때문입니다. UTF-8 방식은 대표적인 조합형의 유니코드 인코딩 방식입니다. 


    UTF-8의 경우에는 조합형 방식의 문자집합(Charater Set)이면서, 유니코드 인코딩 방식중 하나입니다. 유니코드 인코딩 방식에서 가장 대표적인 문자집합인데, 그 이유는 ASCII 문자들을 표현할 수 있기 떄문입니다. 따라서 유니코드 인코딩 하면 UTF-8 방식을 많이 이야기 합니다. 

    위에 설명했다 시피, 초성, 중성, 종성을 각각 1바이트로 인식해서 일반적으로 한글을 3바이트로 인식하지만 공백이나 영문은 1바이트로 인식을 합니다. 또한 장점이 유니코드의 경우에는 다른 국가에서 한글 언어팩이 설치되지 않았다고 하더라도 한글 표현이 가능합니다. 같은 방식으로 우리 나라에서도 다른 나라의 언어를 볼 수 있습니다. 따라서 다양한 언어로 작성되는 환경이나, 웹과 같은 다양한 국가의 사람들이 보는 경우에는 더 좋은 방식입니다.


    UTF-8 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 켄 톰프슨과 롭 파이크가 만들었다. 본래는 FSS-UTF(File System Safe UCS/Unicode Transformation Format)라는 이름으로 제안되었다. UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다. UTF-16과 UTF-8 중 어느 인코딩이 더 적은 바이트를 사용하는지는 문자열에서 사용된 코드 포인트에 따라 달라지며, 실제로 DEFLATE와 같은 일반적인 압축 알고리즘을 사용할 경우 이 차이는 무시할 수 있을 정도이다. 이러한 압축 알고리즘을 사용하기 힘들고 크기가 중요할 경우 유니코드 표준 압축 방식을 대신 사용할 수 있다.

    - 출처 : 위키


    일반적으로 운영되는 서버들의 운영체제는 리눅스 계열입니다. (무료가 많기 때문) CentOS 아니면 Ubuntu 또는 레드햇 계열인데 이런 리눅스 계열은 대부분 유니코드를 지원합니다. 혹시라도 유니코드를 지원하지 않더라도 워낙에 확장성이 좋기 때문에 유니코드로 인코딩을 설정할 수 있지요.


    또한 많이 사용하는 웹서버가 Apache, IIS, NginX 정도인데 기본적으로 서버인코딩은 UTF-8을 이용합니다.

    뿐만 아니라, PHP와 MySQL 역시 UTF-8 방식을 기본 인코딩으로 이용하여 웹 서비스를 제공합니다. 이렇게 많이 사용하는 환경에서 수요가 많기 때문에 왠만한 소스들은 UTF-8 방식으로 인코딩을 하고 있으며, 그래서 거의 문제가 되는 일이 없습니다.


    실제로 저도 몇몇 포스팅에서 인코딩 방식 때문에 윈도우 서버 환경에서는 정상적으로 실행이 되지 않았지만, 리눅스 환경에서는 완벽하게 사용가능하던 소스들이 몇개 있습니다.



    이 세가지는 윈도우 + IIS 환경과 리눅스 + Apache 환경에서 모두 테스트를 해봤는데, 윈도우 + IIS 환경에서는 인코딩 방식이 서로 달라 한글 표현 문제가 발생하였습니다.


    예를 들어 "새폴더"라는 이름으로 폴더를 만들고 난 뒤 서버에 저장되어 있는 실제경로로 찾아가 만들어진 폴더 명을 보면 제대로 표현이 안되어 있는 것을 확인할 수 있습니다.

    또한 "한글폴더"로 되어있는 한글명 폴더는 이름을 확인할 수도, 클릭을 할 수도 없었습니다.


    웹서버인 IIS는 UTF-8을 지원하는데, 실제경로에 한글폴더를 만드는 과정에서 윈도우가 완성형 한글을 사용하기 때문에 오류가 발생했나 봅니다.


    하지만, 리눅스 + Apache 환경은 별 탈 없이 사용가능 하였습니다. 한글 표현에도 전혀 불편한 부분이 없이 구현이 되더군요.





    EUC-KR, CP949 (MS949)


    완성형 한글인 EUC-KR CP949에 대해서 알아보자면 글자하나가 완성된 형태여야 하는 방식입니다. 즉, 완성형 문자로 EUC-KR의 경우에는 웹에서 CP949(엄밀하게는 다르지만 거의 비슷하므로 MS949와 동일하게 취급)의 경우에는 윈도우에서 가장 많이 사용을 합니다.


    EUC-KR 방식은 완성형 인코딩방식이고, 한글을 2바이트로 사용하는 문자집합 (Character Set)입니다. 주로 2바이트권 문자에서 사용하는데, 문제는 EUC-KR을 사용하는 국가. 즉, 한글을 사용하는 곳에서만 제대로 문자가 보이는 단점이 있습니다. 한글과 영어만 사용하는 페이지에서 적합합니다.


    EUC-KR은 KS X 1001와 KS X 1003을 사용하는 8비트 문자 인코딩으로, EUC의 일종이며대표적인 한글 완성형 인코딩이기 때문에 보통 완성형이라고 불린다.

    - 출처 : 위키


    코드 페이지 949(CP949)는 마이크로소프트사가 도입한 코드 페이지이다. 본래는 KS C 5601의 완성형 한글을 표현한 코드 페이지였으나, 윈도 95부터는 확장 완성형 혹은 통합형 한글 코드(Unified Hangul Code)이라는 명칭으로 확장되어 현대의 모든 한글을 수용하게 되었다. 마이크로소프트에서는 이 인코딩을 기반 문자 집합 이름인 "ks_c_5601-1987"로 사용하고 있다. 다만 이 코드 페이지는 IANA에 등록되어 있지 않으므로 인터넷 상에서 정보를 주고받는 데 대한 표준은 아니다.

    - 출처 : 위키


    저는 게임중에 삼국지에 한참 빠져 살았던 적이 있었는데 그 게임에서는 장수의 이름을 입력할 때 "가"부터 "하"까지의 글자표에서 직접 이름을 찾아 선택을 했던 기억이 납니다. (아마 삼국지 4정도 이지 않을까 합니다.) 지금 생각해보면 그런 한글방식이 바로 완성형 방식인 것이지요.


    EUC방식은 영어같은 단일바이트 문자가 아닌 한글, 일본어, 중국어 등과 같은 한 글자를 쓸 때마다 2바이트가 들어가는 더블바이트 문자권에서는 많이 사용되는 방식입니다.

    즉, 한글, 일본어, 중국어 등등은 인코딩 변환에서 자유로울 수 없다는 것이지요.


    하지만, 마이크로 소프트가 한글을 정식으로 사용하기 위해서 개발한 CP949의 경우는 현재 사용하는 한글 중 일정한 규칙에 의해 만들어 낼 수 있는 모든 문자를 완성형으로 만들어 놨기때문에 더 이상 한글표현이 문자표에 없어서 표현이 안되는 일은 없어졌습니다.


    현재는 웹에서 UTF-8를 기본으로 사용하고 있어서 왠만한 한글 사이트를 만드는 경우에는 인코딩을 EUC-KR로 설정해야 한다고 합니다. 이유는 아주 간단한데, 윈도우를 사용하는 사람들이 많기 때문에 정상적으로 사용하기 위해서는 UTF-8보다는 EUC-KR로 인코딩하는 것이 더 적합했지요. 한 때 "사진파일이 보이지 않으면 UTF-8로 보냄 체크를 해제하세요."라는 글을 본적이 있을 텐데 한글 사진 파일을 표현하기 위해서 브라우저에서 제공하는 인코딩 방식을 바꾸라는 아주 유명한 말이지요. 

    윈도우에서 사진 파일이름을 한글로 하는 경우 자동적으로 완성형으로 인코딩 되는데 서버에서 제공하는 인코딩 방식이 UTF-8인 경우에는 정상적으로 파일이름을 로드할 수가 없기 때문에 나타나는 현상이었습니다.


    이렇듯, 한글과 웹 서비스와는 좀 더 신경써야 하는 부분이 많은데 인코딩을 다양하게 지원해주는 웹 소스가 있으면 아주 반갑습니다.

    웹 스토리지 오픈 소스 중에서 Pydio는 기본적으로 한글을 인코딩에 맞춰 자동으로 선택해주는 것 같아 보였습니다. 그리고 Pydio6로 판 올림함에 따라서 아예 인코딩 방식을 직접 선택할 수 있도록 하였습니다.



    <Pydio의 경우에는 CP949 인코딩을 지원합니다. 물론 기본 인코딩이 UTF-8인 경우 인코딩 방식이 UTF-8로 기본설정됩니다.>


    즉, 웹소스에서 한글을 제대로 사용하려면 소스 자체에서 완성형으로 코딩하든지, 아니면 다양한 인코딩 방식을 지원하든지 하는 방식으로 설정할 수 있습니다.




    인코딩 간의 문제점


    위의 내용들을 종합해보면 


    인코딩방식에 따라 표기할 수 있는 관계는 이렇습니다.




    완성형 중에서 EUC-KR의 경우에는 종종 빠져있는 문자가 있지만, 확장 완성형인 CP949의 경우에는 유니코드(UTF-8)에서 표현할 수 있는 모든 문자를 표현 가능합니다. 따라서 웹을 사용하지 않는 윈도우 환경이라면 크게 불편함이 없을 수 있습니다.


    하지만, 웹에서의 관계는 위에처럼 표현가능한 것이 아니라, UTF-8이면 UTF-8, EUC-KR이면 EUC-KR끼리 밖에 제대로 표현을 못합니다. 이런 상황을 생각해보면 각종 웹 소스들을 사용할 때 인코딩 부분만 해결하면 될 것 같습니다.


    인코딩을 변환하도록 하는 함수도 있고, 서버 자체의 인코딩을 바꾸는 방법도 있습니다.


    각 소스별로 안고 있는 문제들이 제각각이기 때문에 혹시라고 한글 문제로 고생하고 계신 분들은 인코딩을 확인해보세요.


    확인해야 할 항목은 다음과 같습니다.

    • 서버 OS 인코딩 상태
    • 웹 서버 인코딩 상태
    • PHP 인코딩 상태
    • 웹 소스 인코딩 상태
    • (데이터베이스를 사용하는 경우) 데이터베이스 인코딩 상태
    이 인코딩 방식등이 다 동일한 방식으로 되어있는지 확인하시기 바랍니다.


     

    '프로그래밍' 카테고리의 다른 글

    알파 버전 / 베타 버전 / RC  (0) 2016.04.04
    MySQL Check 제약  (0) 2016.03.29
    PHP 날짜함수 정리  (0) 2015.08.24
    MySQL Type 종류  (0) 2015.08.19
    BASH shell script - connect to MySQL  (0) 2015.08.19
    Posted by 캐논볼
    ,

    htaccess 설정방법

    리눅스 2015. 9. 22. 13:04

    https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=216


    이 문서를 다른 웹이나 출판물에 게시할 때는 반드시 출처를 밝혀 주시기 바랍니다.

    최종 수정일 : 2001년 8월 23일
    글쓴이  :  윤 일 (yunil@dreamwiz.com)

    HOW-TO Using apache authorization

    아파치 인증 방식은 소규모 사이트나 스터디 그룹에서 유용하게 사용할 수 있는 아파치 자체 인증 방식이다. 규모가 큰 웹 
    사이트나 보안에 신경을 써야될 사이트에서는 아파치 인증을 사용하는 것을 신중히 생각해 봐야 된다. 아파치 인증 방식은 
    믿을 만한 보안 체계는 이루어 지지 않아 보안상 헛점이 들어 날수도 있다는 것을 명심해야 된다.

    아파치 인증을 위해 필요한 httpd.conf 설정을 위해서는 아파치의 httpd.conf에 다음과 같이 설정되어 있어야 된다.
    아파치 인증을 할 디렉토리의 상위 디렉토리 설정의 AllowOverride  지시자 설정에 All 또는 AuthConfig등이 설정되어 
    있어야 된다. 
    지금 부터의 설명은 아파치 웹 문서의 홈 디렉토리인 /usr/local/apache/htdocs 디렉토리에 AllowOverride 설정을 하고 /usr/local/apache/htdocs/yunil 이라는 디렉토리에 아파치 인증을 통해 접근 허가 하도록 설정할 것이다. 

    1.  httpd.conf 수정하기
    가장 먼저 httpd.conf 의 다음 부분을 수정하자 

    <Directory "/usr/local/apache/htdocs">
       Options Indexes FollowSymLinks MultiViews
       
    AllowOverride  None  --> 이 부분의 None 을 All로 수정한다. 
       Order allow,deny
         Allow from all
    </Directory>
     

    위의 부분을 수정했으면 httpd.conf를 저장하고 아파치를  restart 시킨다.
    [root@yunil /root]# /usr/local/apache/bin/apachectl   restart

    2 . 아파치 인증을 적용할 디렉토리에 .htaccess 파일 만들기
    이제 아파치 인증을 적용할 디렉토리로 이동하자. 
    여기에서는 /usr/local/apache/htdocs/yunil 디렉토리에 아파치 인증을 적용할 것이다.
    [root@yunil /root]# cd /usr/local/apache/htdocs/yunil

    /usr/local/apache/htdocs/yunil  디렉토리에   아래와 같은 내용으로 .htaccess 파일을 만들자.
    [ .htaccess 파일 내용 ]
    AuthType  Basic
    AuthName  "루트맨 관리자 로그인"          --->  이 부분은 알아서 마음대로 써주면 된다.
    AuthUserFile  /usr/local/apache/.htrootman
    Require  valid-user 

     
    [ 참고 ]
    사실 파일 이름은 꼭   .htaccess 로 만들지 않아도 되는데 이 파일 이름을 변경하고 싶으면 아파치의 httpd.conf 파일을
    수정해야 된다. 수정할 부분은 다음과 같다.

    AccessFileName    .htaccess 

    --> 이 부분의  .htaccess를 수정하면 되는데 파일 이름의 시작을  .ht 로 하는 것이 좋다.
    --> 그 이유는 httpd.conf 에서 .ht 로  시작하는 파일은 보안상 접근할 수 없게 설정되어 있기 때문이다.
    --> 물론 이 설정도 변경할 수 있지만 여기서는 설명하지 않겠다. 
    --> 정말 궁금해서 잠이 오지 않는 분은 게시판에 글 올려 주세요. 

    다음 단계로 넘어 가기 전에 위의 설정이 뭘 의미 하는지 이해하고 넘어 가도록 하자.

    AuthType  
    인증 유형을 설정하는 지시자다. Basic과 Digest를 설정할 수 있다. 
    Digest의 경우 MD5 방식을 사용하는데 MD5를 지원하는 브라우저가 제한 되어 있기 때문에 이 강좌에서는 언급하지 않겠다. 

    AuthName   
    인증창의 제목이라고 생각하면 된다. 간단한 스트링을 입력해서 설정하는것이 바람직하다.

    AuthUserFile   
    사용자 User_ID 정보와 Password 정보가 들어 있는 파일을 지정해 주는 것이다. 
    보안상 꼭 웹 문서 디렉토리 밖에  위치 시키는 것이 좋다.  이 파일은 나중에 만들것이기 때문에 이 파일이 없다고 투덜 
    거리지 마시길..

    Require    
    인증할 대상을 지정한다.  
    Revalid-user     --> AuthUserFile에 등록된 모든 사용자를 인증을 통해 받아 들인다는 설정
    Require  user  사용자1  사용자2   --> 사용자1과  사용자2만 인증을 통해 받아 들인다는 설정
    Require  group  그룹1  그룹2      --> 그룹1 과 그룹2 에 속하는 사용자만을 인증을 통해 받아 들인다는 설정
    Require 지시자는 하나의 .htaccess 파일에 2개 이상 설정을 할 수도 있다.

    3 . 사용자 추가 하기
    아파치 인증에 사용할 사용자 추가는 아파치의 bin 디렉토리 안에 있는 htpasswd 라는 명령어로 추가한다.
    사용방법은 아주 간단하지만 주의를 기울려야 될 부분이 있다.  일반적인 사용법은 다음과 같다.

    htpasswd    [ -c ]   AuthUserFile    사용자명

    괄호 안에 있는  -c 옵션은 처음 사용자를 등록할 때 필요한 옵션이다.
    AuthUserFile 경로 앞에 -c 옵션을 추가 하게 되면 AuthUserFile 파일에서 지정한 파일을 만들어 준다.
    절대 2번째 사용자 등록부터는 -c 옵션을 쓰면 안된다. 
    만약 실수로 -c 옵션을 쓸 경우 전에 있던 파일은 날라가고 새로운 파일이 만들어 지기 때문에 각별히 주의 해야 된다.

    첫번째 사용자 등록을 할 경우


    기존의 AuthFile에 사용자를 추가할 경우


    3. 특정 사용자를 그룹에 추가 하기
    아파치 인증은 사용자 뿐만아니라 그룹에 대해서도 인증을 할 수 있다.
    특정 그룹을 아파치 인증을 통해 접근을 허가하기  위해서는 해당 디렉토리 안에 있는 .htaccess 파일에 AuthGroupFile 지시자를 이용해 그룹 정보가 담겨있는 파일의 경로를 지정하고 그룹 파일을 만들어 주면 된다.

    [ .htaccess 파일에 추가할 부분 ]
    AuthGroupFile   /usr/local/apache/.htgroup

    .htaccess 파일의 AuthGroupFile 지시자로 설정했던 파일을 다음과 같이 만들면 된다.
    파일의 텍스트 형식은 다음과 같다.

    그룹명:  사용자명1  사용자명2  사용자명3  ....
    --> 그룹에 포함할 각 사용자명은 공백(Space Bar)로 구분한다.


    아피치 인증을 거쳐야 되는 디렉토리에 접근 할 경우 다음과 같은 창이 나타난다. 


     


    '리눅스' 카테고리의 다른 글

    리눅스 네임서빙 우선순위 결정 : /etc/host.conf  (0) 2016.03.03
    tcpwrapper iptable 차이  (0) 2015.10.05
    MySQL 외부 접속 설정  (0) 2015.09.07
    리눅스 백업 관련  (0) 2015.08.31
    DNS zone 파일  (0) 2015.08.27
    Posted by 캐논볼
    ,
    http://zetawiki.com/wiki/MySQL%EC%97%90_%EC%9B%90%EA%B2%A9_%EC%A0%91%EC%86%8D_%ED%97%88%EC%9A%A9
     
    MySQL 외부 접속 허용 설정
    MySQL에 원격 접속 허용하기
    MySQL에 root 원격 접속 허용하기

     

     

     

    개요

    • MySQL을 설치하면 기본적으로 로컬(localhost)에서만 접속이 가능하고 외부에서는 접속이 불가능하게 되어 있다.
    외부에서 접속해보면 다음과 같은 오류 메시지가 나온다.[1]
    Host '135.79.246.80' is not allowed to connect to this MySQL server
    
    • Toad for MySQL과 같은 DB 관리 도구를 사용하여 DB에 원격으로 접속하려면 허용해주는 로컬 작업이 필요하다.
    • 여기서는 root를 원격에서 접속할 수 있도록 설정한다. 이것을 응용하면 다른 계정에도 적용할 수 있다.

    확인

    • 아래 쿼리를 날려보면 localhost가 나온다.
    • 즉 root 계정으로는 로컬에서만 접속가능하다.
    • (같은 방법으로 root 대신 다른 사용자명도 조회할 수 있다.)
    SELECT Host FROM mysql.user WHERE USER='root';
    

    변경

    모든 IP 허용[2]
    INSERT INTO mysql.user (host,USER,password) VALUES ('%','root',password('패스워드'));
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
    FLUSH PRIVILEGES;
    
    IP 대역 허용
    • 다음과 같이 설정하면 111.222로 시작하는 모든 IP가 허용된다.
    INSERT INTO mysql.user (host,USER,password) VALUES ('111.222.%','root',password('패스워드'));
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'111.222.%';
    FLUSH PRIVILEGES;
    
    특정 IP 1개 허용
    INSERT INTO mysql.user (host,USER,password) VALUES ('111.222.33.44','root',password('패스워드'));
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'111.222.33.44';
    FLUSH PRIVILEGES;
    

    원복

    • 모든 IP를 허용한 경우 다음과 같이 원래 상태로 복구할 수 있다.
    DELETE FROM mysql.user WHERE Host='%' AND USER='root';
    FLUSH PRIVILEGES;
    

    같이 보기

    주석

    1. 이동 물론 방화벽이 뚫린 경우겠지?
    2. 이동 참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.

    '리눅스' 카테고리의 다른 글

    tcpwrapper iptable 차이  (0) 2015.10.05
    htaccess 설정방법  (0) 2015.09.22
    리눅스 백업 관련  (0) 2015.08.31
    DNS zone 파일  (0) 2015.08.27
    Timestamp 이용하기  (0) 2015.08.19
    Posted by 캐논볼
    ,

    리눅스 백업 관련

    리눅스 2015. 8. 31. 14:50

    1. 백업에 대하여
    백업은 자료를 보호하는 하나의 방법으로 시스템관리자가 최우선적으로 해야할 작업이다. 여러 개의
    자료 복사본을 만들어 놓고 자료를 잃어버릴 경우를 대비하는 것이다. 백업을 실행하는 가장 안전한
    방법은 테이프, 제거가능한 드라이브, 기록가능한 씨디 등 시스템과 떨어진 위치에 저장하는 것이다.


    2. 자료가 손실되는 경우
    (1) 하드웨어의 결함
    (2) 소프트웨어의 버그
    (3) 사람의 실수나 오동작
    (4) 천재지변등의 자연재해

    3. 백업전에 고려할 사항
    (1) 백업 데이터 선택 여부 : 어떠한 데이터를 백업할 지를 결정해야 한다. 예를 들면 /home 디렉토
                                리만을 백업할 것인지, /var 디렉토리를 할 것인지 아니면 전체 백업을
                                할 것인지를 결정해야 한다.
    (2) 백업 주기 : 얼마나 자주 백업할 것인지를 결정해야 한다. 또한 증분백업(Incremental Backup)
                    을 할 것인지, 전체백업(Full Backup)를 할 것인지도 결정해야 한다. 증분백업이란
                    말 그대로 백업할 대상중에서 추가된 부분만을 백업하는 것을 말하고 전체백업이란
                    전체를 그대로 백업하는 것을 말한다. 실제로는 이 두가지 백업형태를 적절히 이용
                    하는 것이 중요하다. 예를 들면 월요일부터 토요일까지는 추가된 부분만을 증분백
                    업하고, 일요일날에는 전체백업을 실시한다. 또한 매월 1일에는 전체백업을 실시하
                    여 한달의 데이터, 1주의 데이터 등의 단위로 백업이 가능하다.
    (3) 매체(Media) 선택 여부: 어떠한 백업 매체를 사용할 것인지를 결정해야 한다. 이 매체 선택은
                               경제적인 면과 효율적인 면, 편리성 등을 고려하여 선택한다.
    (4) 백업 방법: 어떠한 프로그램을 선택하냐는 것이다. 리눅스에서 사용가능한 백업방법으로는 tar,
                   dd, dump, dpio 등이 있고, 이외에도 많은 백업 유틸리티들이 있다. 편리성과 안전성
                   , 효율성 등을 고려하려 선택하도록 한다.

    4. 백업의 미디어
    (1) 개요: 백업할 경우 가장 중요하게 고려하는 것이 예비 매체의 선택이다. 비용, 신뢰성, 처리속
              도, 가용도를 생각해야 한다.
    (2) 백업매체
       1) 플로피디스크: 매우 싸며 어느 정도 신뢰할 만하다. 하지만 별로 빠르지 못하고 매우 유동적
                       이다. 또한 대용량의 데이터 저장시에는 적당치 않다.
       2) 테이프: 다소 비싸고 충분히 신뢰할 만하다. 속도도 충분히 빠르다. 테이프의 크기에 따라
                 편리하게 이용할 수 있다.
       3) MOD(Magnetic Optical Drive: 광자기 드라이브) : 대용량의 데이터를 랜덤하게 접근하고 한
                                                        부분만 빨리 복원할 수 있다. Giga급의 용량
                                                        을 가진다.
       4) DAT(Digital Audio Tape) : 카세트 테이브보다 더 작은 크기의 미디어로 Giga급 용량을 갖
                                   는다.

    5. 리눅스에서 지원가능한 백업장치
    (1) /dev/cdrom: CD-ROM드라이브
    (2) /dev/fd0: 플로피디스크
    (3) /dev/ht0, /dev/nht0 : IDE 테이프 장치 (예를 들면 Iomega drives)
    (4) /dev/nst0, /dev/st0 : DAT(Digital Audio Tape) 나 DDS(Digital Data Storage) 계열의 SCSI
                              테이프 장치
    (5) /dev/nrft0, /dev/nftape, /dev/rft0, /dev/ftape : 플로피 테이프 장치 (예를 들면 QIC-80)

    6. 백업툴의 선택

    (1) 개요: 전통적인 유닉스툴들에는 tar, dd, cpio, dump등이 있다. tar와 cpio는 유사하고 둘 다
              테이프상에서 복원할 수 있고, 거의 모든 미디어를 사용할 수 있다.
    (2) 백업툴
       1) tar: Unix와 리눅스시스템 모두에서 사용되는 유틸리티로 파일이나 디렉토리들을 하나의 파일
              로 묶어주는 역할을 한다. 사용이 쉽고 소수의 파일백업에 좋고, 원본파일을 남겨두므로
              안전하다. 전통적인 유닉스의 tar는 압축기능을 하는 옵션이 없지만, 리눅스의 GNU tar는
              압축도 지원한다.
       2) cpio: tar와 비슷한 유틸리티로 많은 양의 데이터에 대해서는 tar보다 빠르다. 장치파일이나
               네트워크 파일등의 특수 파일도 백업이 가능하고 백업본의 크기도 작고, 백업본에 손상된
               부분이 있더라도 손상된 부분을 제외하고 나머지 부분을 복구한다. 그러나, 증분백업기능
               을 지원하지 않는다.
       3) dump: ext2 나 ext3 파일시스템만 지원하고, 파일들을 백업하지않고 파일시스템 자체를 직접
               읽어내는 방법을 사용한다. 전체백업과 증분백업이 가능하다.
       4) dd : data dump의 약자로 파티션 전체의 백업등이 가능하다. 실제적으로는 백업보다는 다른 경
              우에 더욱 더 많이 쓰인다.
       5) 기타: amanda, Arkeia, Bru, Veritas(client), UniBACK, ArcServe 등

    7. tar를 이용하여 백업하기
    (1) 전체백업
       1) tar cvfp home.tar /home
           => /home 디렉토리를 퍼미션을 그대로 유지하면서 home.tar라는 파일로 묶는다.
       2) tar cf /dev/st0 /home
           => /home디렉토리를 SCSI 테이프장치인 /dev/st0에 백업한다.
       3) tar zcf /dev/st0 /home
           => /home디렉토리를 SCSI 테이프장치인 /dev/st0에 압축해서 백업한다.
       4) tar zxf /dev/st0
           => SCSI 테이프장치인 /dev/st0 에서 압축을 풀어 현재 디렉토리에 푼다.
       5) tar -g list -cvpf home.tar /home
           => -g는 증분백업(Increment backup)에 사용하는 옵션으로 /home 디렉토리를 퍼미션을 그대로
             유지하면서 home.tar로 묶는 것은 1번 예제와 같지만 list라는 백업시에 저장되는 파일이나
             디렉토리들을 목록화하는 파일을 생성한다. 처음시도할 경우에는 첫번째 예제와 같은 파일
             로 생성된다. 그러나 그 다음 시도시에는 list파일과 비교하여 추가된 것만 백업하므로 백
             업하여 생성되는 파일명을 같게 해서는 안된다.
    (2) 증분백업
       1) tar -g list -cvpf home1.tar /home
           => 기존의 list파일을 내용을 보고 그 이후에 변경되거나 추가된 파일들을 home1.tar로 백업
             한다. list파일을 편집기로 열어보면 파일의 용량을 숫자로 관리한다. 이 값을 비교하여
             변화시에 증분백업을 시도한다. 따라서, 이 파일을 삭제되면 전체백업을 한다.

    8. cpio를 이용하여 백업하기
    (1) 설명: cpio는 Copy Input ot Output의 약자로 입력받은 것을 출력에 복사한다는 뜻이다. 보통
              find명령의 출력을 입력으로 받아 백업디바이스에 저장하는 역할을 한다.
    (2) 사용법
       [find 명령 | ] cpio options ' > 또는 < ' 디바이스명
    (3) options
       -o : 표준출력으로 보내어 사용한다. (--extract)
       -i : 표준입력으로 받을 때 사용한다. 즉, 백업한 자료를 불러올 때 사용한다.
       -v : 과정을 자세히 보여준다.
       -c : 데이터 형식을 ASCII형태로 한다.
       -d : 필요하면 디렉토리를 생성한다. (--make-directories)
       -B : 입출력 블록사이즈를 5120bytes로 한다. 기본 블록사이즈는 512bytes이다.
    (4) 사용예
       1) find /home | cpio -ocv > /dev/nst0
          => /home 디렉토리의 내용을 SCSI 테이프장치인 /dev/nst0 장치에 백업한다.
       2) cpio -icdv < /dev/nst0
         => /dev/nst0에 백업된 데이터를 현재디렉토리에 복원한다. 필요하면 디렉토리도 생성한다.

    9. dump를 이용하여 백업하기
    (1) 설명: dump는 파일들이 아닌 파일시스템 전체를 백업한다. 보통 파티션단위로 백업할 때 사용
              하면 편리하다. dump는 0-9단계의 레벨을 가지고 증분 백업을 지원한다. 레벨 0이 전체
              백업이고 나머지 레벨들은 부분백업을 하게 된다. 백업시에 /etc/fstab파일을 참조하며
              백업된 데이터 복원은 restore명령을 사용한다.
    (2) 사용법
       dump options 백업미디어 백업하고자하는 대상
    (3) options
       -0~9 : 덤프의 레벨을 지정한다. 0은 전체백업이고, 나머지는 부분백업을 한다. 기본레벨은 9이
             다.
       -f 파일명 또는 디바이스명 : 백업할 미디어를 지정하거나 파일명을 적는다.
       -u : dump 를 통해 백업한 후에 /etc/dumpdates라는 파일에 작업에 대한 정보를 기록한다.
    (4) 사용예
       1) dump -0f /dev/nst0 /home
           => /home 디렉토리 전체를 /dev/nst0 장치에 전체 백업한다.
       2) dump -0u -f /dev/nst0 /dev/hda7
           => /dev/hda7 파일시스템 전체를 /dev/nst0 장치에 전체 백업하며 그 작업 정보를 /etc/dumpd
             ates라는 파일에 기록한다.
       3) dump -0u -f home /home
           => /home 디렉토리 전체를 home이라는 이름으로 전체백업한다. 또한 그 작업정보를 /etc/dump
             dates 라는 파일에 기록한다.
       4) dump -4u -f /dev/nst0 /dev/hda7
           => level4 수준 또는 그 이하의 백업을 한 뒤에 바뀐 내용을 증분백업한다. 또한 그 작업정보
             를 /etc/dumpupdates에 기록한다.
    (5) 복원: dump명령으로 백업한 경우에는 restore 명령을 이용하여 복원해야 한다.
       1) 사용법
         restore options 디바이스명 또는 백업파일명
       2) options
        -i : 대화식(interactive)으로 복구할 파일을 선택한 후에 복원이 가능하다.
        -f 디바이스명 또는 백업파일명 : 백업되어진 파일이나 장치를 지정한다.
        -r : 전체백업시에 사용한다. 이 옵션사용시에 파일시스템이 미리 생성되어 있어야 하고, 마운트
            도 되어 있어야 하며 해당 디렉토리안에서 작업해야 한다.
       3) 사용예
        ㄱ. restore -if /dev/st0
             => /dev/st0에 백업된 데이터를 하나씩 확인하면서 복원한다.
        ㄴ. restore -rf /dev/nst0
             => /dev/nst0에 백업된 데이터를 전체복원한다. 단 복원하고자 하는 파일시스템이 생성되어
               있어야 하며 마운트되어 있어야 하고 해당 디렉토리안에서 작업해야 한다.
                예) mke2fs /dev/sda1
                    mount /dev/sda1 /mnt
                    cd /mnt
        ㄷ. restore -if home
             => home이라는 이름으로 백업된 파일을 복구한다. 실행시키면 다음과 같이 프롬프트가 나타
               난다. 지원가능한 명령을 확인해야 한다.
               restore >                    // ? 나 help라고 입력하면 사용가능한 명령을 보여준다.
               restore > help
               Available commands are:
                       ls [arg] - list directory
                       cd arg - change directory
                       pwd - print current directory
                       add [arg] - add `arg' to list of files to be extracted
                       delete [arg] - delete `arg' from list of files to be extracted
                       extract - extract requested files
                       setmodes - set modes of requested directories
                       quit - immediately exit program
                       what - list dump header information
                       verbose - toggle verbose flag (useful with ``ls'')
                        prompt - toggle the prompt display
                        help or `?' - print this list
                If no `arg' is supplied, the current directory is used
               restore > ls                 // 백업된 내용을 보여준다.
               .:
                bluemountain/ minory/       nanajjang/    quota.user    zzang/
                lost+found/   mkk737/       posein/       xitem/
               restore > add quota.user     // 특정한 파일을 선택한다. add뒤에 파일명을 기입하지
                                              않으면 전부선택된다.
               restore > ls
               .:
                bluemountain/  minory/        nanajjang/    *quota.user     zzang/
                lost+found/    mkk737/        posein/        xitem/
               restore > extract
               You have not read any volumes yet.
               Unless you know which volume your file(s) are on you should start
               with the last volume and work towards the first.
               Specify next volume # (none if no more volumes): 1       // 볼륨넘버를 입력한다.
               set owner/mode for '.'? [yn] y                           // y라고 입력한다.

    10. dd를 이용하여 백업하기

    (1) 설명: 전체파티션 단위로 백업할 때 용이하다.
    (2) 사용법: 특정파티션을 다른 하드디스크의 파티션으로 백업한다고 가정해보자. 만약 /dev/hda1
                을 /dev/hdb1으로 백업한다고 할 때, /dev/hdb1을 /dev/hda1과 같은 사이즈의 파티션으
                로 생성한다.
    (3) 사용예
       1) dd if=/dev/hda1 of=/dev/hdb1 bs=1k
           => /dev/hda1을 /dev/hdb1으로 백업한다.
       2) dd if=/dev/hda of=/dev/hdb
           => /dev/hda를 /dev/hdb로 백업한다.

    11. 백업의 종류와 복원
    (1) 개요: 모든 것을 한번에 백업하는 풀백업(Full Backup)이 있고 부분 부분을 백업하는 부분 백업
              (Incremental Backup)이 있다.
    (2) 풀백업
       1) 설명: tar를 이용하여 쉽게 할 수있다.
       2) 사용예
         ㄱ. tar cvf /dev/ftape /usr/src
            => /usr/src디렉토리를 /dev/ftape라는 테이프에 백업한다.
         ㄴ. tar -cMf /dev/fd0H1440 /usr/src
            => /usr/src디렉토리를 -M(Multi Volume)옵션으로 플로피에 연속 백업한다. 백업하기 전에
              플로피는 포맷을 해야 한다.
    (3) 부분백업
       1) 설명: 특정한 날짜 이후로 바뀐 파일 부분만 백업한다.
       2) 사용예
         ㄱ. tar -c -v -N '15 June 2002' -f /dev/st0 /usr/src
            => /usr/src 에서 2002년 6월 15일 이후로 변경된 파일만을 DAT에 부분백업한다.
    (4) 복원
       1) 설명: tar의 x옵션을 이용하여 복원한다.
       2) 사용예
         tar xvf /dev/fd0H1440

    12. 백업의 대상
    (1) 개요: 가능한 많은 백업을 하는 것이 좋다. 그러나 쉽게 재설치가 가능한 프로그램은 백업을 원
             하지 않을 수도 있다. 또한 시스템상의 이유로 백업을 원치않는 데이터도 있을 것이다. 예
             를 들면 커널이 항상 자동으로 생성하는 데이터들은 백업할 필요가 없다. 백업을 해야할지
             하지 말아야 할지 잘 구분이 안되는 것이 /var디렉토리 이하의 파일들이다. 무엇이 중요한
             가를 고려하여 백업해야 한다.
    (2) 백업해야할 대상 : 보통 /home과 /etc(이 디렉토리는 설정파일들이 들어있는 디렉토리이다. 경
                          우에 따라서는 시스템의 다른 위치에도 설정파일이 있을 수도 있으니 잘 찾아
                          백업을 해야함)는 꼭 해야한다. 아울어 어떤 프로그램의 소스를 /usr/local
                          밑에 설치하였다면 이 디렉토리도 백업대상으로 고려해야 한다.

    13. 압축백업
    (1) 개요: 백업은 많은 공간을 요구하게 되는데 그것은 많은 경제적인 비용을 초래할 수 있다. 이러
              한 비용적 부담의 대처방법으로 압축을 들 수 있다. 압축백업은 문제점을 발생시킬 수도
              있다. 자연적으로 어떤 환경때문에 만약 하나의 비트가 잘못 되었다면 모든 나머지 데이터
              가 사용 못하게 될 수 있다. 어떤 백업프로그램은 에러를 교정해주지만 많은 수의 에러는
              어찌할 수 없는 경우가 많다. 백업은 안전해야 되므로 그리 좋은 생각만은 아니다.
    (2) 사용예
       tar zcvf etc_backup.tar.gz /etc
        => /etc디렉토리를 압축하여 etc_backup.tar.gz파일을 만든다.

    14. 테이프 관련 유틸리티- mt
    (1) 설명: mt는 테이프(Magnetic Tape)의 작동을 제어하는 유틸리티이다.
    (2) 사용법
       mt [option] command
    (3) option
       -h : 사용가능한 command를 보여준다.
       -v : mt의 버전을 보여준다. (--version)
       -f 디바이스명: 제어하고자하는 디바이스명을 지정한다.
    (4) 주요 commnad
        status : 테이프의 상태를 보여준다.
        fsf 파일수: 테이프를 지정한 파일 수 만큼 앞으로 이동시킨다.
        rewind : 테이프를 처음으로 되감는다.
        bsf 파일수 : 테이프를 지정한 파일 수 만큼 되감는다.
        erase : 테이프의 내용을 지운다.
        offline : 테이프를 꺼낸다.
        rewoff : 테이프를 처음으로 되감은 뒤에 꺼낸다.
    (5) 사용예
       1) mt -f /dev/st0 status
           => 테이프의 상태를 보여준다.
       2) mt -f /dev/st0 rewind
           => 테이프를 처음으로 되감는다.
       3) mt -f /dev/st0 fsf 50
           => 파일 수 50만큼 테이프를 앞으로 이동시킨다.
       4) mt -f /dev/st0 erase
           => 테이프의 내용을 지운다.
       5) mt -f /dev/st0 offline
           => 테이프를 꺼낸다.
       6) mt -f /dev/st0 rewoff
           => 테이프를 처음으로 되감은 뒤 꺼낸다.

    '리눅스' 카테고리의 다른 글

    htaccess 설정방법  (0) 2015.09.22
    MySQL 외부 접속 설정  (0) 2015.09.07
    DNS zone 파일  (0) 2015.08.27
    Timestamp 이용하기  (0) 2015.08.19
    "su" 와 "su - root" 차이  (0) 2015.08.10
    Posted by 캐논볼
    ,

    DNS zone 파일

    리눅스 2015. 8. 27. 16:25

    http://hack.pe.kr/115

     

    사용자가 웹 브라우저에 www.rankey.com 도메인을 입력한 후 enter를 눌렀을 때 어떻게 Data가 이동될 것인가? 통상 다음과 같은 과정이 이루어진다.
     
    1)     최초 자체 PC의 hosts 파일에 질의 후 없을 시
    2)     사용자 PC에 세팅된 DNS로 1차 질의
    3)     최상위 ROOT 네임서버 에서 하부 .com 네임서버로 이동하며 다시 www.rankey.com의 네임서버를 찾게 됨.
    4)     Ns1.mediachannel.co.kr 에서 www.rankey.com에 대한 정보를 검색한 후 사용자에게 정보 전달.
     
    DNS란 각 도메인에 대한 IP 주소를 매칭시켜주는 시스템으로 쉽게 사용자에게 인식되기 위해 사용되는 것이다. DNS와 관련된 파일은 주로 name.conf, resolv.conf, zone 파일을 들 수 있는데 이번 컬럼에서는 Zone 파일에 대한 규칙을 살펴보자.


     

    Zone 파일 내에서 주석을 사용시는 “;” 표시를 사용하며 어디서 사용하든 그 뒷부분을 주석으로 이식된다. 그 설명은 다음과 같다.
     
    1)     TTL(Time To Live)
    가장 중요한 값 중 하나로 해당 도메인 즉 rankey.com에 대한 도메인 정보를 네임서버에 가져간 후 다시 재 질의를 던지기까지의 시간을 말한다.
    서버 이전이나 빠른 적용을 원할 경우 이 값을 미리 줄여두는 것은 필수 요건이다.
    2)     @
    “@”는 origin domain을 말하며 rankey.com을 말한다.
    또한 zone파일 내에서 전체 도메인을 쓸 경우 반드시 도메인 마지막 부분에 “.”를 붙여야 한다.
    3)     Serial
    Secondary name server 와의 통신에 필요한 것으로 2차 네임서버에서의 Serial 값과 비교해 1이상 클 경우 기존 zone 파일 대신 새로운 zone 파일을 가져가게 된다.
    대신 해당 값은 12자리 이내로 사용해야만 하며 그 이상일 경우 오류가 발생한다.
    4)     Refresh
    2차 네임서버에서 1차 네임서버로 주기적 체크를 하게 되는데 필요한 주기 값
    5)     Retry
    2차 네임서버에서 1차 네임서버로 접속에 문제 발생 시 재 접속할 간격을 말함.
    6)     Expire
    2차 네임서버에서 1차 네임서버로 접속에 문제 발생 시 Expire에 지정된 시간까지만 접속을 시도하며 그 이후 삭제된 도메인으로 자체 판단.
    7)     Minimum
    이는 최 상단의 ttl과 같은 값으로 동일하게 세팅한다.
    8)     NS record
    해당 도메인 rankey.com 에 대한 네임서버를 지정하는 record로 여러 개를 등록할 수 있다.
    9)     MX(Mail exchange) recored
    해당 도메인의 메일 서버 설정이며 여러 개의 메일서버 설정이 가능하다.
    MX 뒤의 숫자는 상대적 값으로 낮은 숫자가 우선시 된다.
    10) A recored
    2차 도메인 www.rankey.com과 같은 실제 도메인에 IP주소를 연결하는 record.
    11) V=spf1 ip4:~~~ ~all
    해당 도메인의 메일에 대한 spam 정보를 파악하는 기술로서
    v=spf1 :버전
    ip4 : IPv4 주소 /24와 같이 Mask를 사용하여 네트워크단위의 표현이 가능
    a : DNS의 A 레코드로 설정한 IP주소
    mx : DNS의 MX 레코드로 지정한 IP주소
    ptr : PTR 레코드로 지정된 IP주소
    include : TXT 레코드에서 설정을 찾는다.
    ~ all : 이것과 같지 않은 것은 알아서 하라
    .
    - all : 이것과 같지 않은 것은 차단하라
    (Drop).
    지금까지 설명한 위의 옵션을 사용하며 256byte 까지만 인식되고 그 이상의 되면 도메인 정보에 오류가 발생한다.

    '리눅스' 카테고리의 다른 글

    MySQL 외부 접속 설정  (0) 2015.09.07
    리눅스 백업 관련  (0) 2015.08.31
    Timestamp 이용하기  (0) 2015.08.19
    "su" 와 "su - root" 차이  (0) 2015.08.10
    vim ctrl+z 후 복귀 = fg  (0) 2015.07.20
    Posted by 캐논볼
    ,

    URI / URL / URN

    IT 생활 2015. 8. 26. 21:56

    http://www.hakawati.co.kr/361


    1. 개요


    URI 는 Uniform Resource Identifier 의 약자로 인터넷상 표현할 수 있는 모든 리소스를 이야기 하며, URL은 Uniform Resource Locator 의 약자로 URI에서 네트워크상 경로를 이야기 한다. 마지막으로 URN은 Uniform Resource Name은 접속 방법을 제외한 리소스를 의미한다. 이렇게 설명하면 어려워 보일 수 있다. 그림을 보자.


    공식으로 표현하면 URI = URL & URN 이 성립된다. URL과 URN은 교집합이 존재하지만 이 둘 모두 URI에 종속적이다. 이들을 예제를 통해 살펴보면 다음과 같다. 


    다만 이 예제는 SEO를 위한 형태(SEO-friendly)는 아니다. SEO-friendly는 경로, 페이지까지 나타내며, 확장자 이후의 내용은 없다. 즉, URL 까지만 표현되고 나머지 요소들은 내부적으로 운영된다.


    'IT 생활' 카테고리의 다른 글

    P-ATA(IDE) / S-ATA  (0) 2016.03.03
    Active Directory  (0) 2015.10.21
    익스플로러 우클릭 해제  (0) 2015.08.19
    윈도우 레지스트리  (0) 2015.08.06
    구글 파워 서칭  (0) 2015.07.21
    Posted by 캐논볼
    ,

    날짜/시간 함수 모음

     

    time()

     

    date("Y-m-d H:i:s");

    //현재 날짜/시간을 포맷(fotmat)에 맞게 date형식으로 출력합니다.

    (24시간제로 시간을 출력)

     

    date("Ymd")

    //현재 날짜/시간이 출력됨

    //예제 : 20070801

     

    date("Y-m-d h:i:s");

    //현재 날짜/시간을 포맷(fotmat)에 맞게 date형식으로 출력합니다.

    (12시간제로 시간을 출력)

     

    date("h:i:s");

    -- 현재 시간이 출력됨

     

    date("Y-m-d H:i:s",time());

    //현재 두번째 매개변수을 timestamp형식으로 읽어 날짜/시간을 포맷(fotmat)에 맞게

    //date형식으로 출력합니다.

     

    date("Y-m-d",strtotime ("-1 months"));

    //현재의 날짜인 time형식에서 strtotime에 의해 한달을 뺀 time을 date형식으로 변환

     

    date("Y-m-d",strtotime ("+1 days"));

    //현재의 날짜인 time형식에서 strtotime에 의해 하루를 더한 time을 date형식으로 변환

     

    date("Y-m-d",strtotime ("+1 years"));

    //현재의 날짜인 time형식에서 strtotime에 의해 1년을 더한 time을 date형식으로 변환

     

    date("Y-m-d",strtotime ("+24 hours"));

    //현재의 날짜인 time형식에서 strtotime에 의해 24시간을 더한 time을 date형식으로 변환

     

    date("Y-m-d",strtotime ("+1500 minutes"));

    //현재의 날짜인 time형식에서 strtotime에 의해 1500분을 더한 time을 date형식으로 변환

     

    date("Y-m-d",strtotime ("+1 week"));

    //현재의 날짜인 time형식에서 strtotime에 의해 1주일을 더한 time을 date형식으로 변환

     

    date("Ymd",strtotime ("-1 days", strtotime('20070819')));

    date("Ymd",strtotime ("-1 days", strtotime('2007-08-19')));

    // 20070819의 날짜를 timestamp형식으로 변환후 1일을 빼고 다시 timestamp형식으로 변환후

    Ymd 형식의 문자열로 출력

     

    ※ 날짜 형식은 -을 넣거나 빼야 한다. 다른 특수문자는 안됨(2007:08:12)

     

    date("Ymd",strtotime ("+1 days",  strtotime('20070819')));

    date("Ymd",strtotime ("+1 days",  strtotime('2007-08-19')));

    // 20070819의 날짜를 timestamp형식으로 변환후 1일을 더한후 다시 timestamp형식으로 변환후

    Ymd 형식의 문자열로 출력

     

    ※ date 함수의 2번째 인자는 timestamp 형입니다.

    ※ strtotime 함수의 2번째 인자는 timestamp 형입니다.

     

    date( "Y-m-d\TH:i:s", strtotime('20070101040404') );

    //정상적으로 처리안됨

    date( "Y-m-d\TH:i:s", strtotime('2007-01-01 04:04:04') );

    //정상적으로 처리됨( rss에서 사용)

     

    $timestamp=strtotime('+1 years +1 months +1 days');

    //현재 날짜/시간에 years months days hours minutes seconds 단위로 더하여

    //timestamp형식으로 리턴합니다.(매개변수 없이 사용불가)

     

    문자형 날짜와 문자형 날짜 사이의 일수 구하기

     

    <?

    echo (strtotime('20070803') - strtotime('20070801'))/60/60/24;

    ?>

    # 2 출력됨

    # 문자형 날짜를 초로 계산하여 뺀다음에 일자로 변환해줌(그나마 가장 정확함)

     

    응용 함수 모음

     

    //오늘 날짜부터 지정한 일수(day)후의 날짜로 timestamp형식으로 출력하기

    function plus_day($day)

    {

     return mktime(0,0,0,date("m"),date("d")+$day,date("Y"));

    }

     

    //한줄로 오늘 날짜 시간 뽑아오기

    <?

     list($y,$m,$d,$h,$i,$s) = explode(" ",date("Y m d h i s"))

    ?>

    '프로그래밍' 카테고리의 다른 글

    MySQL Check 제약  (0) 2016.03.29
    한글 인코딩 종류  (0) 2015.09.30
    MySQL Type 종류  (0) 2015.08.19
    BASH shell script - connect to MySQL  (0) 2015.08.19
    MySQL 권한 설정  (0) 2015.08.19
    Posted by 캐논볼
    ,

    MySQL join

    2015. 8. 24. 16:46

    http://warmz.tistory.com/276

     

    JOIN (조인) 연산자
     - 두개 이상의 테이블을 연결하여 데이터를 검색할때 사용한다.
     - 데이터베이스 시스템과 그 환경의 성능을 확인하는데도 사용할 수 있다. (느린 쿼리를 사용하여 비교)
     - 조인에는 여러가지 종류가 있다.

     

     조인 종류  설명 
     내부조인(INNER JOIN)  조건을 사용해서 두 테이블의 레코드를 결합한다.
     외부조인(OUTER JOIN)  내부조인과 비슷한데 일치하지 않는 열까지 반환하며 그 열은 NULL로 반환한다.
     동등 조인(EQUI JOIN)  내부조인이다. 두 테이블 사이의 같은 행들을 반환한다.
     비동등 조인(NON-EQUI JOIN)  내부조인이다. 두 테이블 사이의 같지 않은 행들을 반환한다.
     자연 조인(NATURAL JOIN)  'ON' 절이 없는 내부조인. 같은 열 이름을 가진 두 테이블을 조인할때만 작동
     크로스 조인(CROSS JOIN)  한 테이블의 모든 행과 다른 테이블의 모든 행이 연결되는 모든 경우를 반환.
     카티젼 조인(CARTESIAN JOIN)  크로스 조인의 한 종류. 조건이 없다. (크로스 프로덕트)
     콤마 조인(COMMA JOIN)  콤마가 CROSS JOIN 키워드 대신 사용된다는 점을 제외하면 크로스 조인과 같다.
     셀프 조인(SELF JOIN)  자기 자신을 조인한다.

     



    1. 내부 조인(INNER JOIN)
     - 조건을 사용하여 두 테이블의 레코드를 결합한다.
     - 동등 조인, 비동등 조인, 자연 조인 등이 있다.

     

    1
    2
    3
    4
    Select somecolumns From table1          -- 반환되는 열
                    Inner Join                    
                    table2
                    ON somecondition;   -- ON 또는 WHERE 조건절

     

     


     
     1) 동등 조인(EQUI JOIN)
          - 두 테이블 사이의 같은 행들을 반환한다.

     예) 각 boy가 어떤 toy를 가지고 있는지 조사한다. (매핑 확인)

     

    1
    2
    3
    Select boys.boy, toys.toy
    From boys INNER JOIN toys
    ON boys.toy_id = toys.toy_id;

     

     

     


      
     2) 비동등 조인(NON-EQUI JOIN)
         -두 테이블 사이의 같지 않은 모든 행들을 반환한다.
     
     예)

     

    1
    2
    3
    4
    Select boys.boy, toys.toy
    From boys INNER JOIN toys
    ON boys.toy_id <> toys.toy_id -- <> :  같지 않음
    ORDER BY boys.boy;          -- 정렬

     

     



     3) 자연 조인(NATURAL JOIN)
         - 두 테이블에 같은 이름의 열이 있을때만 동작한다.
         - ON이 필요없다.

      예) 

     

    1
    2
    Select boys.boy, toys.toy
    From boys NATURAL JOIN toys;

     

     

     

     


    2. 외부 조인(OUTER JOIN)
      - 내부 조인과 유사하며 일치하는 것이 없을 경우 NULL로 표시한다.
      - 왼쪽 테이블은 FROM 바로 다음에 나오는 테이블이고, JOIN 뒤에 나오는 테이블이 오른쪽 테이블이다.
      - 왼쪽 외부 조인(LEFT OUTER JOIN)과 오른쪽 외부 조인(RIGHT OUTER JOIN)이 있다.
      - 왼쪽 외부 조인을 사용할 경우 왼쪽 테이블을 오른쪽 테이블에 비교한다. 오른쪽 외부 조인도 그 반대로 동작한다. 일대다 관계에 유용하다.

     유용한 예) girls가 어느 toys를 가지고 있는지 알아보도록 쿼리를 작성한다.

      i) 왼쪽 테이블을 오른쪽 테이블에 비교하는 방법 

     

    1
    2
    3
    Select g.girl, t.toy From girls g
    Left Outer Join toys t
    ON g.toy_id = t.toy_id;

     

     

     


      ii) 반대로 했을때

     

    1
    2
    3
    Select g.girl, t.toy From toys t
    Left Outer Join girls g
    ON g.toy_id = t.toy_id;

     

     

     


      
     
    3. 크로스 조인(CROSS JOIN)
      - 한 테이블의 모든 행과 다른 테이블의 모든 행을 짝지워 반환한다.
      - 카티전 조인, 카티전 프로덕트 등이 있다.

     예)

     

    1
    2
    Select t.toy, b.boy
    From toys AS t CROSS JOIN boys AS b;

     

     




    4. 셀프 조인(SELF JOIN)
      - 자기 자신을 조인한다.
      - 자기 자신을 하나씩 비교하기 위해 사용한다.
      - 하나의 테이블로 같은 정보를 가진 테이블이 두 개 있는 것처럼 쿼리를 보낼 수 있다.

      예) 각 사람의 이름(name)과 그 사람을 담당하는 보스(boss)의 이름을 가져온다. 

     


     

     

    1
    2
    3
    4
    Select c1.name, c2.name AS boss
    From clown_info c1
    Inner Join clown_info c2
    ON c1.boss_id = c2.id;

     

     

     

    '' 카테고리의 다른 글

    CGI와 PHP 관계  (0) 2015.10.16
    HTTP 프로토콜  (0) 2015.09.30
    [HTML] favicon 생성  (0) 2015.07.29
    [CSS] address 태그  (0) 2015.07.28
    [CSS] label 태그의 for 속성  (0) 2015.07.28
    Posted by 캐논볼
    ,

    Timestamp 이용하기

    리눅스 2015. 8. 19. 15:18

    http://allenjeon.tistory.com/235

     

    타임스탬프(Timestamp) 프로그래밍 기초
    v1.0 2008/12/06 Copyleft by 전경헌@사이냅소프트

    이 문서는 타임스탬프의 개념과 C,Python,Php에서 사용하는 방법에 대한 간략한 자료임.


    유닉스/리눅스의 타임스탬프


    유닉스/리눅스계열에서 사용되는 타임스탬프는 1970년1월1일 0시0분0초부터 몇초가 지났는 지를 나타내는 정수이다. 유닉스가 1970년대 초에 개발되었기 때문에 최대한 많은 숫자를 타임스탬프로 사용하기 위하여 기준일자(epoch)를 70년1월1일로 정한 것 같다. 이 타임스탬프는 지구자전축의 움직임을 고려하는 윤초(Leap Second)까지 반영하여 아주 엄격하게 정의한 숫자가 아니라 단순히 하루를 86400초로 계산하여 순차적으로 증가시킨 것이다. 윤년(Leap Year)은 들어봤겠지만 윤초(Leap Second)라고 들어본 적이 있는가? 윤초가 궁금하면 위키피디아의 윤초설명을 참조하기 바란다.
     
    타임스탬프에 대한 감각을 익히기 위하여 몇가지 숫자를 살펴보자. 초단위로 수를 세고 있기 때문에 숫자가 매우 크다.

             0 -> Thu 1970-01-01 09:00:00 KST
     100000000 -> Sat 1973-03-03 18:46:40 KST
    1000000000 -> Sun 2001-09-09 10:46:40 KST
    1111111111 -> Fri 2005-03-18 10:58:31 KST
    1234567890 -> Sat 2009-02-14 08:31:30 KST

    정의상 타임스탬프값이 0일때는 1970-01-01 00:00:00 이어야 할텐데 위의 시간을 보면 9시이다.  이는 잘못된 결과가 아니고, 뒤에 KST라는 문자열에서 한국시간임을 지정하고 있기 때문이다. 대한민국은 표준시보다 9시간이 빠르기 때문에 표준시로는 1970년1월1일 자정이다.
     
    1111111111 같은 특이한 타임스탬프는 이미 지나갔고, 근래에 다다르게 될 재미있는 타임스탬프는 1234567890가 있는데, 우리시간으로 2009년2월14일에 오전 8시31분30초이고, 국제 표준시로는 2009년2월13일 밤 11시31분30초이다.


    C언어에서 사용되는 타임스탬프

    타임스탬프는 C 프로그래밍시에 time.h 안에 time_t 형태로 표현되나 내부적으로는 운영체제의 종류에 따라 보통 4바이트(32비트)나 8바이트(64비트) 정수형태로 표현되고 32비트로 표현하는 경우 2038년1월19일 03:14:07에 32비트 부호있는 정수형의 최대값에 도달하게 되어 그 시간이후로는 날자와 시간이 잘못 계산되어 문제를 발생시킬 수 있다. 이를 지난 2000년에 있었던 Y2K문제에 빗대어 Y2K38문제라고 부른다.

    C-프로그래밍에서 타임스탬프는 time() 함수를 이용하여 얻어낼 수 있다.

    #include <stdio.h>
    #include <time.h>
    int main(void)
    {
      time_t now;
     now = time(NULL);
     printf("%ld\n", now);
     return 0;
    }

    유닉스/리눅스 타임스탬프를 문자열로 바꾸기 위해서는 ctime()을 이용하거나
    gmtime(), localtime()를 써서 tm 구조체로 바꾼 뒤에 strftime() 함수를 이용할 수 있다.

    #include <time.h>
    char *ctime(const time_t *timep);
    struct tm *gmtime(const time_t *timep);
    struct tm *localtime(const time_t *timep);

    아래 예제에서 gmtime()은 국제표준시로, localtime()은 지역표준시로 변환한다.

    #include <stdio.h>
    #include <time.h>
    int main(void)
    {
      time_t now;
     now = 1234567890;
      ts = localtime(&now); // 지역표준시로 변환한다 (대한민국은 KST)
      //ts = gmtime(&now);  // 국제표준시 GMT로 변환한다

      strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", ts);
      printf("%ld -> %s\n", now, buf);
     
     return 0;
    }

    tm 구조체를 타임스탬프로 변경하기 위해서는 mktime() 함수를 이용한다.

    #include <time.h>
    time_t mktime(struct tm *tm);

    타임스탬프와 크게 관련된 주제는 아니지만, 유닉스/리눅스 서버의 시간이 잘못되어있으면
    데이타베이스나 웹서버등이 잘못 작동할 수 있으므로 가능한 시간을 맞춰놓을 필요가 있다.
    아래는 유닉스/리눅스의 rdate 명령어를 이용하여 시간을 맞추는 예제이다.

    인터넷에 연결된 time.bora.net 서버의 시간을 얻어와 출력한다.
    # rdate -p time.bora.net

    현재 컴퓨터의 시간을 출력한다.
    # date

    time.bora.net의 시간으로 현재 컴퓨터의 시간을 일치시킨다.
    # rdate -s time.bora.net


    내 경우는 cron에 rdate를 등록하여 일주일에 한번씩 자동으로 시간을 맞추고 있다.

     

    MySQL에서 사용되는 타임스탬프

    웹개발에서 가장 많이 사용되는 데이타베이스 중의 하나인  MySQL은 유닉스 형태의 타임스탬프를 지원하는 함수들을 가지고 있다. MySQL에 TIMESTAMP()라는 함수가 있는 데 이는 문자열을 datetime 값으로 변경하는 함수이고, 유닉스 타임스탬프를 문자열로 변경하기 위해서 from_unixtime() 함수를 이용하고, 문자열이나 날자형을 유닉스 타임스탬프로 변경하기위해서는 unix_timestamp() 함수를 이용한다. 함수명이 좀 길고, 언더바(_)의 위치가 조금 애매하지만 의미는 명확하다.

    TIMESTAMP() 함수는 이름만 타임스탬프이지 반환값은 타임스탬프가 아니라 datetime 값이다.

    mysql> SELECT TIMESTAMP('2008-12-31');
            -> '2008-12-31 00:00:00'

    아래는 unix_timestamp() 함수를 이용하여 타임스탬프값을 가져오는 예이다. 인수가 없으면 현재일시의 타임스탬프를 가져온다. 

    mysql> SELECT UNIX_TIMESTAMP();
            -> 1228552236
    mysql> SELECT UNIX_TIMESTAMP('2008-12-06 00:00:00');
            -> 1228489200

    타임스탬프값을 문자열로 변환하기 위해서는 from_unixtime() 함수를 이용한다. 파라미터로 unix_timestamp()값을 사용하면 되고, 반환되는 형식은 문맥에 따라 문자열(YYYY-MM-DD HH:MM:SS)이나 정수값(YYYYMMDDHHMMSS)으로 자동변환되어 결정된다.

    mysql> select from_unixtime(1234567890);
            -> '2009-02-14 08:31:30'
    mysql> select from_unixtime(1234567890) + 0;
            -> 20090214083130.000000

    MySQL의 Now() 함수는 from_unixtime( unix_timestamp() )와 같은 내용이다.

    mysql> SELECT NOW();
            -> '2008-12-06 17:40:55'
    mysql> SELECT NOW() + 0;
            -> 20081206174055

    개인적으로 데이타베이스에서 날자와시간을 사용할때 타임스탬프나 datetime을 쓰기보다는 문자열 CHAR(14) 'YYYYMMDDHHMMSS' 이나 CHAR(19) 'YYYY-MM-DD HH:MM:SS'를 사용하는 것을 선호한다.
     

    Python에서 사용되는 타임스탬프

    파이썬은 유닉스/리눅스의 time.h 함수에 대응하는 동일한 형태의 모듈을 가지고 있다. 모듈의 이름은 time이며 사용법은 C 언어 함수와 대동소이하다. 차이가 있다고 하면 파이썬에서는 C언어와 달리 time() 함수의 리턴값이 정수가 아닌 실수로 반환된다는 것이다. 소수점이하의 타임스탬프값은 시스템에 따라서 안 나올 수 있다고 한다.

    >>> import time
    >>> time.time()
    1228546179.4690001
    >>> time.gmtime(0)
    (1970, 1, 1, 0, 0, 0, 3, 1, 0)
    >>> time.localtime(0)
    (1970, 1, 1, 9, 0, 0, 3, 1, 0)
    >>> time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(1234567890))
    'Fri, 13 Feb 2009 23:31:30 +0000'
    >>> time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(1234567890))
    'Sat, 14 Feb 2009 08:31:30 +0000'

    위에서 기준일자는 역시 1970년1월1일임을 알 수 있고, localtime이 9시간 빠른 우리나라에서 수행한 것임도 알 수 있다.

    파이썬에서 사용할 수 있는 또하나의 타임스탬프가 있다. 바로 그레고리안 달력의 1년1월1일을 1로 하는 정수인데, 하루가 지날때마다 1씩 증가하고 이를 ordinal이라 한다. ordinal을 사용하기 위해서는 datetime 모듈의 fromordinal, toordinal 함수를 사용한다.

    >>> from datetime import date
    >>> date.today().toordinal()
    733382
    >>> date.fromordinal(1)
    datetime.date(1, 1, 1)
    >>> date.fromordinal(100000)
    datetime.date(274, 10, 16)
    >>> date.fromordinal(666666)
    datetime.date(1826, 4, 9)
    >>> date.fromordinal(777777)
    datetime.date(2130, 6, 25)

    유닉스/리눅스 타임스탬프가 1970년1월1일부터 초를 세는 것이고 하루는 86400초이므로,
    datetime의 ordinal 과 타임스탬프사이에는 아래의 관계가 성립한다.

    (Gregorian_ordinal - 719163) * 86400 == Unix_TimeStamp

    위에서, 719163은 1970년1월1일의 ordinal 이다.

    >>> from datetime import date
    >>> date(1970,1,1).toordinal()
    719163

    >>> import time
    >>> time.gmtime( (date(1970,1,3).toordinal() - 719163) * 86400 )
    (1970, 1, 3, 0, 0, 0, 5, 3, 0)



    Php에서 사용되는 타임스탬프

    Php에서 현재의 타임스탬프를 얻어오기 위해서 time()함수를 사용할 수 있다.
    그러나 보통 Php에서 날자는 date()라는 막강한 함수를 이용한다.
    time() 함수는 date("U")와 같다.

    date() 함수는 포맷인자를 이용하여 날자와 관련된 거의 모든 표현을 할 수 있다.
    자세한 설명은 PHP date() 함수 매뉴얼을 참조하기 바란다.

    <?php
    $tmstmp = time();
    print $tmstmp." -> ".date("Y-m-d H:i:s", $tmstmp)."<br>";
    print date("U")."<br>";
    print date("Y-m-d H:i:s",1234567890)."<br>";
    ?>


    Php프로그램의 수행결과는 아래와 같다.

    1228548141 -> 2008-12-06 16:22:21
    1228548141
    2009-02-14 08:31:30


    '리눅스' 카테고리의 다른 글

    리눅스 백업 관련  (0) 2015.08.31
    DNS zone 파일  (0) 2015.08.27
    "su" 와 "su - root" 차이  (0) 2015.08.10
    vim ctrl+z 후 복귀 = fg  (0) 2015.07.20
    Redhat Package Manager - RPM  (0) 2015.07.20
    Posted by 캐논볼
    ,