execCommand("CreateLink") 새창 띄우기

execCommand("CreateLink") 새창 띄우기


execCommand("CreateLink") 새창 띄우기 

이걸로 삽질하시는 분들이 많을것 같아 올려봅니다... 

저두 지금 삽질하다가 클리어 했네요.... 

------------------------------------------------------ 


기존 

-> 

function createLink() { 

Editor.focus(); 

Editor.document.execCommand("CreateLink"); 



수정 

-> 

function createLink() { 

var EdRange = Editor.document.body.createTextRange(); 

EdRange.execCommand('CreateLink'); 


if (EdRange.parentElement().tagName=='A') { 

var href = EdRange.parentElement().href; 

var data = EdRange.text; 

EdRange.execCommand('UnLink'); 

EdRange.pasteHTML(''+data+''); 



---------------------------- 

제가 검색을 해봤는데 

var EdRange = Editor.document.selection.createRange(); 

이 내용이 아주 많고 에러가납니다. (IE11기준) 

IE11에선 createRange()가 호환이 이제 안된다고 해서 알아보니 

var EdRange = Editor.document.body.createTextRange(); 

이걸로 고치라고 해서 고쳤더니 되네요. 


도움되길.. 저만 삽질했나.ㅠ

[ ▼ 참고 Source ]

function createLink() {
    var EdRange = Editor.document.body.createTextRange();
    EdRange.execCommand('CreateLink');

    if (EdRange.parentElement().tagName=='A') {
        var href = EdRange.parentElement().href;
        var data = EdRange.text;
        EdRange.execCommand('UnLink');
        EdRange.pasteHTML('<a href="'+href+'" target="_blank">'+data+'</a>');
    }
}


bash 취약점 (shellshock) 업데이트 버전 확인

bash 취약점 (shellshock) 업데이트 버전 확인


패치가 발표된 후 취약점이 발표되었는데, 

패치가 불완전하다는 것이 그 후에 밝혀지는 바람에 또다시 패치가 발표되고... 

아무튼 지금 상황이 좀 혼란스럽습니다. 


데비안, 우분투 사용자는 

    apt-get update && apt-get upgrade 

또는 

    apt-get update && apt-get install --only-upgrade bash 

명령을 사용하시고, 


레드햇, CentOS, Fedora 사용자는 

    yum -y update bash 

명령을 사용하여 업데이트하시기 바랍니다. 


어떤 상황에서도 직접 컴파일은 비추입니다. 

bash는 매우 중요한 시스템 패키지이므로 반드시 공식 미러에서 받으셔야 합니다. 

만약 사용중인 미러에 최신 패키지가 존재하지 않는다면 미러를 바꾸세요. 미국 미러도 꽤 빠릅니다 ^^ 


이 시각 현재 모든 패치가 완료된 것으로 알려진 버전은 아래와 같습니다. 


우분투 14.04 LTS: 4.3-7ubuntu1.4 

우분투 12.04 LTS: 4.2-2ubuntu2.5 

우분투 10.04 LTS: 4.1-2ubuntu3.4 


만약 우분투 패키지가 다시 업데이트될 경우, 이 시각 이후에는 아래 링크의 버전 목록을 참조하시면 됩니다. 

http://packages.ubuntu.com/search?keywords=bash 


CentOS 7.x: 4.2.45-5.el7_0.4 

CentOS 6.x: 4.1.2-15.el6_5.2 

CentOS 5.x: 3.2-33.el5_10.4 


만약 CentOS가 다시 업데이트될 경우, 아래 링크의 맨 아래 CESA 2014:1306 관련 부분을 참조하시면 됩니다. 

http://lists.centos.org/pipermail/centos-announce/2014-September/thread.html 


위에 언급한 것보다 오래된 버전은 이미 오래 전에 지원이 중단되었으므로 업그레이드만이 살 길입니다. 

예: CentOS 3.x, 4.x, 우분투 8.x, 9.x, 10.10, 11.x, 12.10, 13.x 등 

정 급하면 최신버전 컴파일해서 쓰세요. 그러나 결과는 책임 못짐. 


이제 가장 큰 문제는 공유기, 모바일 기기, 기타 네트워크 장비 등 

유닉스계열 OS를 사용하지만 업데이트가 곤란한 기기들이죠. 

집집마다 공유기 줄줄이 털리게 생겼음. 이거 제조사에서 펌웨어 업데이트도 잘 안해주는데... 쩝 ㅠㅠ



jQuery 기반 숫자관련 플러그인.

첨부파일 : 

archive.zip


jQuery 기반 숫자관련 플러그인.

- removeText: 숫자제외 텍스트 제거. 

- numberFormat: 3자리 마다 콤마 표시. 

- onlyNumber: 위의 모든 기능 포함. 


소스와 예제는 파일첨부하였습니다.

Javascript parseInt 버그 "08", "09"

Javascript parseInt 버그 "08", "09"


프로젝트하면서 야구 시간표 때문에 달력을 만든 적이 있습니다. 

유독 8일과 9일에서만 에러가 나더군요. 다른데는 다 괜찮은데 

일부 스마트폰에서 그런 에러가 발생하는겁니다. 


문자열 "07"까지는 7로 잘 변환이 되지만 

문자열 "08","09"만 0으로 변환이 되는 

이상한 버그가 있습니다. 


이게 대다수에서는 8, 9로 잘 변환이 되지만 

일 부 기기에서만 0으로 변환이 됩니다. 


해결방법은 앞에 "0" 제거하고 변환하시면됩니다. 


[협찬] http://phpjs.org/ 

  

function intval(mixed_var, base){ 

var type = typeof(mixed_var); 

if(type==='boolean'){ 

return (mixed_var)? 1: 0; 

} else if(type==='string'){ 

tmp = parseInt(mixed_var, base || 10); 

return (isNaN(tmp) || !isFinite(tmp))? 0: tmp; 

} else if(type==='number' && isFinite(mixed_var)){ 

return Math.floor(mixed_var); 

} else{ 

return 0; 

}


네이버 블로그 API 이미지까지 업로드

네이버 블로그 API 이미지까지 업로드


제목보면 뭔가 이상하지만 삽질의 결과물로 인한것이라..../먼산 


서버에 있는 데이터를 네이버 블로그API를 이용하여 글을 올리게 되면 이미지는 서버에 저장된 채로 글만 올라갔었는데 


이것저것 뒤적 뒤적 하다가 어찌어찌 연결되었습니다./먼산 


사용하시는 분들에게 도움이 되었으면 좋겠네요 =ㅅ=ㅋ 


참고로 category의 지정시 없는걸로 하면 아마도 기본 설정으로 저장되는걸로 알고 있습니다. 

(물론 확실하지 않아요/먼산) 


기타 질문도 받습니다. 


http://www.xmlrpc.com/spec 

여기서 xmlrpc.inc 파일 받는거 잊으시면 안됩니다. 


P.S. 제가 작업한 서버쪽은 이상하게 name time out이 자주 뜹니다. 

curl 문제인거 같은데 제가 서버쪽을 잘 몰라서...../먼산 

아마 속도 때문에 그런거 같으니 문제 되시는 분들은 timeout을 늘려주세요< 


P.S.2 지금보니 일부 쓸모없는 echo가 남아있네요.... 어차피 주석처리 되어 있지만 테스트 하실때 써먹../퍽!

[ ▼ 참고 Source ]


include "xmlrpc/lib/xmlrpc.inc" ; // 이 부분은 다 아실테니...
$rs << DB에서 불러온 데이터 입니다.

$tit = $rs[0][title] ;
$tex = $rs[0][text] ;
$loof_chk = 0 ;

$url = "https://api.blog.naver.com/xmlrpc";
$blogid = "ID"; << 어차피 같은 네이버 아이디니...../먼산
$id = "ID";
$pw = "api키 값"; 블로그에서 할당받은 API KEY

// 네이버 api 이미지 업로드 함수
function upload_image( $url , $blogid , $id , $pw , $tit , $tex ) {

	$api_url = $url ;
	$blog_user = $id ;
	$blog_passwd = $pw ;
	preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i", $tex , $out ) ;
	preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/ui", $tex , $out2 ) ;
	$cmm = count($out[1]) ;
//	echo "".count($out[1]) ;
	if ( $cmm > 0 )
	{
		for ( $i = 0 ; $i < $cmm ; $i++ )
		{
			$im = "http://서버주소".$out[1][$i] ;

			$imgbit = file_get_contents($im, FILE_BINARY);
			$img = new xmlrpcval(
			array (
			'bits' => new xmlrpcval($imgbit, 'base64'),
			'type' => new xmlrpcval('image/jpeg', 'string'),
			'name' => new xmlrpcval(basename($im), 'string')
			), 'struct');

			$c = new xmlrpc_client($api_url);
//			$c->debug = true; // Uncomment this line for debugging info
			$c->setSSLVerifyPeer(false);

			$x = new xmlrpcmsg("metaWeblog.newMediaObject");
			$x->addParam(new xmlrpcval($blog_user, 'string'));
			$x->addParam(new xmlrpcval($blog_user, 'string'));
			$x->addParam(new xmlrpcval($blog_passwd, 'string'));
			$x->addParam($img);

			$c->return_type = 'phpvals';
			$r =$c->send($x, 3, 'https');
			$message->request_charset_encoding = "UTF-8";
			$tex = str_replace($out2[1][$i], $r->val[url] , $tex ) ;
			if ( $r->val[errno] == 0 and $r->errno != 8 ) { $loof_chk++ ; }
//			echo $tex."".$i."loof_chk = ".$loof_chk."" ;
//			print_r($r); // 결과 부분입니다. 에러체크용으로도 사용할 수 있습니다.
//			echo "" ;

			if ( ( $r->errno != 8 and $r->val[errno] == 0 ) and ( $i == ( $cmm - 1 ) and $loof_chk == $cmm ) )//이미지가 다량존재시 하나라도 업로드 실패했을 경우에 대비한 if 문입니다.
			{ return m3_naver_post( $url , $blogid , $id , $pw , $tit , $tex , $_GET['position']) ; } //$_GET['position']은 전 페이지에서 카테고리설정을 위해 받는 부분입니다.
			else if ( $i == ( $cmm - 1 ) ) { echo "<script>alert('업로드에 실패하였습니다.');document.getElementById('emd').value = 'fail';</script>" ; }
		}
	}
	else { return m3_naver_post( $url , $blogid , $id , $pw , $tit , $tex , $_GET['position']) ; }
}

// 네이버 api 포스팅 올리는 함수
function m3_simple_metaweblog($url, $blogid, $id, $pw, $title, $description, $category, $publish=true) {
	$GLOBALS["xmlrpc_internalencoding"] = "UTF-8";
	$client = new xmlrpc_client($url);
	//$client->setdebug(1);
	$struct = array(
		'title' => new xmlrpcval($title, "string"),
		'description' => new xmlrpcval($description, "string"),
		'categories' => new xmlrpcval($category, "string") 
		);
	$message = new xmlrpcmsg("metaWeblog.newPost", array(
		new xmlrpcval($blogid, "string"),
		new xmlrpcval($id, "string"),
		new xmlrpcval($pw, "string"),
		new xmlrpcval($struct, "struct"),
		new xmlrpcval($publish, "boolean")
		)
	);
	return $response = $client->send($message);
}

// 네이버 직접 포스팅 함수
function m3_naver_post( $url , $blogid , $id , $pw , $title, $description, $category) {
	global $api;

	return $response = m3_simple_metaweblog($url, $blogid, $id, $pw, $title, $description, $category);
}

$return = upload_image( $url , $blogid , $id , $pw , $tit , $tex ) ;
?>


http/https 혼합 환경에서 세션 보안 강화하기

http/https 혼합 환경에서 세션 보안 강화하기


간만에 올리는 보안팁텍입니다. 


요즘 로그인 페이지, 회원가입 페이지 등 개인정보가 오가는 곳에는 

https (SSL 또는 TLS) 보안서버를 사용하는 것은 상식이 되었죠? 

(음 그러나 현실은... 상식이 되었다고 제발 믿고 싶습니다 ㅠㅠ) 


구글이나 트위터 등의 해외 사이트들은 아예 모든 페이지에 https를 일괄 적용하곤 합니다. 

그러나 국내에서는 https를 적용한 사이트라도 모든 페이지에 일괄 적용하기보다는 

법에서 요구하는 최소한 - 로그인과 회원가입 페이지 - 에만 적용하는 경우가 많습니다. 

여전히 https에 대한 막연한 두려움과 미신이 많기 때문인데요... 


막연한 두려움과 미신 참고: 

http://www.phpschool.com/link/tipntech/77347 

http://www.phpschool.com/link/tipntech/77348 


------------------------------------------------------------------------------------------------------- 


그런데 일부 페이지에만 https를 적용할 경우 치명적인 문제가 한 가지 발생합니다. 

로그인에 사용하는 아이디와 비번은 암호화 전송이 되지만, 

로그인 상태를 표시하기 위한 세션 쿠키는 다른 페이지에서 무방비 상태로 노출된다는 거죠. 


세션 쿠키의 값을 알아낼 수 있다면 아이디와 비번 따위는 훔칠 필요도 없습니다. 

세션 쿠키를 사용하면 자기도 님의 아이디로 로그인된 상태로 만들 수 있으니까요. 

일단 이렇게 로그인 상태로 만들면 회원정보도 마음대로 볼 수 있고 

남의 글이나 댓글을 지울 수도 있고, 심지어 남의 이름으로 물건을 살 수도 있죠. 

이건 뭐, https를 적용한 보람이 전혀 없습니다. 


(회원정보 열람 전에 비번을 다시 입력하도록 하면 어느 정도는 피해를 막을 수 있겠죠? 

그러나 모든 페이지에서 매번 비번을 묻지 않는 한 100% 막을 수는 없습니다.) 


PHP에서는 세션을 시작할 때 $secure 옵션을 사용하면 

https 상태에서만 세션 쿠키가 전송되도록 강제할 수 있습니다. 

그러나 이렇게 하면 https를 적용하지 않은 다른 페이지에서는 로그인이 풀려버리죠. 

그래서 대부분의 사이트들은 세션의 $secure 옵션을 사용하기가 힘듭니다. 


------------------------------------------------------------------------------------------------------- 


오늘은 http와 https를 혼합하여 사용하는 환경에서도 

세션 쿠키 도난의 위험을 최대한 줄이는 방법을 소개해 보겠습니다. 


문제의 핵심은 공격자가 http 상태에서 훔친 세션 쿠키를 

https 상태에서도 마음놓고 사용할 수 있다는 것입니다. 

따라서 우리의 목적은 http 상태에서 세션 쿠키를 훔치더라도 

https 상태에서는 무용지물이 되도록 하는 것입니다. 


------------------------------------------------------------------------------------------------------- 


1. 일단 그냥 세션을 시작합니다. $secure 옵션은 사용하지 않습니다. 

    PHP에서는 보통 PHPSESSID라는 이름의 세션 쿠키를 사용합니다. 


2. 로그인하는 순간에는 https 상태이겠죠? 이 때 쿠키를 하나 더 구워줍니다. 

    이 쿠키를 편의상 "보안쿠키"라고 부르고, 쿠키 이름은 SSLSESSID라고 하겠습니다. 

    랜덤으로 생성한 값을 이 쿠키에 넣고, 같은 값을 세션에도 하나 저장해 둡니다. 

    중요한 건, SSLSESSID 쿠키에는 $secure 옵션을 사용해야 한다는 점입니다. 

    당연히 이 쿠키는 https 상태일 때만 전송되겠죠? 

    다른 방법으로 쿠키를 훔치는 것을 막기 위해 $httponly 옵션도 넣어주면 좋습니다. 


3. 사용자를 http 페이지로 돌려보냅니다. 

    이 때는 세션 쿠키(PHPSESSID)만 전송되고, 보안쿠키는 전송되지 않습니다. 

    따라서 누가 세션 쿠키를 훔쳐가도 알아차릴 방법이 없습니다. 

    공격자가 실제 사용자와 같은 와이파이를 사용하고 있다면 IP도 당연히 같겠고, 

    세션 쿠키를 훔칠 정도면 User-Agent 같은 것도 얼마든지 훔쳐서 베낄 수 있을 테니까요. 

    이건 http의 한계입니다. 어쩔 수 없습니다. 


4. 반면, 사용자가 다시 https 페이지를 방문한다면 어떻게 될까요? 

    정상적인 사용자라면 세션 쿠키(PHPSESSID)와 보안쿠키(SSLSESSID)가 함께 전송되겠죠. 

    그러나 공격자는 세션 쿠키는 훔칠 수 있어도 보안쿠키는 훔칠 수 없습니다. 

    따라서 PHPSESSID만 전송하거나, SSLSESSID의 값을 짐작해야 합니다. 

    그런데 SSLSESSID의 값은 랜덤으로 생성했으므로 짐작하기가 매우 어렵습니다. 


5. https 페이지를 방문할 경우 서버에서 SSLSESSID 쿠키를 체크합니다. 


5-1. 만약 SSLSESSID 쿠키가 있다면 세션에 저장해 두었던 값과 비교합니다. 

      일치하면 정상적인 사용자입니다. 

      일치하지 않는다면 공격자입니다. 세션을 폭파해 버려야 합니다. 콰쾅. 


5-2. 만약 SSLSESSID 쿠키가 없다면 세션에 저장해 둔 값이 있는지 확인합니다. 

      세션에 저장해 둔 값이 없다면 2단계를 거치지 않았다는 뜻이므로 

      2단계와 같이 보안쿠키를 새로 발급해 주면 됩니다. 

      반면, 세션에 저장해 둔 값이 있는데도 보안쿠키를 전송하지 않았다면 

      (즉, 분명 아까 보안쿠키를 구워줬는데 어딘가에 흘리고 왔다면) 

      공격자가 SSLSESSID의 값을 짐작하지 못해서 비워둔 것이겠죠? 

      당연히 세션을 폭파해 버려야 합니다. 쿠콰쾅. 


6. 위와 같은 방법을 사용하면 공격자가 http 상태에서 세션 쿠키를 훔치더라도 

    https 페이지를 방문하는 순간 세션이 폭파되어 버리므로 

    훔친 세션 쿠키는 무용지물이 됩니다. 

    반면, 정상적인 사용자들이 웹사이트를 이용하는 데는 아무 지장이 없습니다. 


7. 단, 로그인 후에 단 한번도 https 페이지를 방문하지 않는다면 아무 소용이 없겠죠? 

    위의 방법으로 최대한의 효과를 얻으려면 

    종종 https 페이지를 방문하도록 해주어야 합니다. 

    로그인, 회원가입, 회원정보 열람 및 수정, 아이디/비번찾기, 결제페이지는 물론이고 

    가끔 막 엉뚱한 것을 https 페이지로 만들어서 공격자를 놀려주세요. 

    예를 들어 게시판에서 글 읽을 때는 평범한 http이지만 

    글 쓰는 폼의 action 주소는 https로 해둔다거나... 

    그러면 만약 세션 쿠키를 훔치더라도 다른 사람을 사칭해서 글을 쓰려고 하는 순간 

    세션 폭파 쿠콰콰콰! 


8. 그런데 대부분의 웹사이트들은 http로 접속하든 https로 접속하든 내용이 똑같습니다. 

    그래서 아주 조심스러운 공격자라면 https 링크를 http로 바꾸어 접속함으로써 

    세션이 폭파되는 것을 피할 수 있어요. 

    이런 꼼수를 막기 위해, https로 접속해야 하는 페이지에 http로 접속한 경우 

    아무 것도 보여주지 말고 곧바로 Location: 헤더를 사용해서 https로 넘겨주세요. 

    만약 공격자였다면 당연히 세션 폭파 쿠콰콰콰! 


------------------------------------------------------------------------------------------------------- 


9. 방법만 알려드리고 예제 소스가 없으면 그건 제 스타일이 아니죠? 

    위에서 언급한 모든 작업을 한 번에 해주는 함수입니다. 

    그 밖에도 3분마다 쿠키값을 바꿔주고 

    세션 관련 php.ini 속성들을 자동으로 조절해 주는 등 

    쓸만한 기능들이 좀 있어요. 

    session_start() 대신 쓰시면 됩니다. 


/** 

 * 합리적인 기본값으로 세션을 시작하는 함수 

 * 

 * @param int $lifetime = 0 

 * @param string $path = '/' 

 * @param string $domain = null 

 * @param bool $secure = false 

 * @param bool $httponly = true 

 * @return void 

 */ 

function session_start_better($lifetime = 0, $path = '/', $domain = null, $secure = false, $httponly = true) 

    // 세션 관련 php.ini 설정 조절 

    ini_set('session.gc_maxlifetime', max($lifetime, 86400)); 

    ini_set('session.hash_function', 1); 

    ini_set('session.use_cookies', 1); 

    ini_set('session.use_only_cookies', 1); 

    ini_set('session.use_strict_mode', 1); 

    if (defined('PHP_OS') && !strncmp(PHP_OS, 'Linux', 5)) 

    { 

        ini_set('session.entropy_file', '/dev/urandom'); 

        ini_set('session.entropy_length', 20); 

    } 

    

    // 실제로 세션을 시작 

    session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly); 

    session_start(); 

    

    // HTTPS인 경우 보안쿠키 체크 

    if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') 

    { 

        // 보안쿠키를 처음 발급하는 경우 

        if (!isset($_SESSION['SSLSESSID'])) 

        { 

            $_SESSION['SSLSESSID'] = sha1(pack('V*', rand(), rand(), rand(), mt_rand(), mt_rand())); 

            setcookie('SSLSESSID', $_SESSION['SSLSESSID'], $lifetime, $path, $domain, true, true); 

            if (isset($_COOKIE[session_name()])) session_regenerate_id(); 

        } 

        // 보안쿠키를 발급했는데 제대로 돌아오지 않은 경우 공격자로 간주함 

        elseif (!isset($_COOKIE['SSLSESSID']) || $_COOKIE['SSLSESSID'] !== $_SESSION['SSLSESSID']) 

        { 

            $_SESSION = array(); 

            $sp = session_get_cookie_params(); 

            setcookie(session_name(), '', time() - 86400, $sp['path'], $sp['domain'], $sp['secure'], $sp['httponly']); 

            setcookie('SSLSESSID', '', time() - 86400, $sp['path'], $sp['domain'], true, true); 

            session_destroy(); 

        } 

        // 보안쿠키가 정상적으로 되돌아온 경우는 별도의 처리 불필요 

    } 

    

    // 세션을 발급한 지 3분이 경과하면 자동으로 쿠키값을 변경해줌 

    if (isset($_SESSION['AUTOREFRESH'])) 

    { 

        if ($_SESSION['AUTOREFRESH'] < time() - 180) 

        { 

            $_SESSION['AUTOREFRESH'] = time(); 

            session_regenerate_id(); 

        } 

    } 

    else 

    { 

        $_SESSION['AUTOREFRESH'] = time(); 

    } 


------------------------------------------------------------------------------------------------------- 


10. 소스가 너무 길어지지 않도록 하기 위해 몇 가지를 간단하게 처리하고 넘어갔는데, 

    실제로 쓰실 때는 아래의 두 군데를 적당히 고쳐쓰셔도 됩니다. 

    

    - 로드밸런싱, CDN 등을 사용할 경우 $_SERVER['HTTPS']가 정확하지 않을 수 있음 

    - 보안쿠키 발급시 난수생성 알고리듬을 더욱 강력한 것으로 변경 

      참고: http://www.phpschool.com/link/tipntech/79087 


11. 물론 최고의 해결책은 웹사이트 전체에 https를 적용하고 

    HTTP Strict Transport Security (HSTS) 헤더를 사용하여 

    아예 브라우저들이 http 사이트로는 접속 시도조차 하지 않도록 만드는 것입니다.

서버스캔 (Snooping) 막기 스크립트 (.htaccess ip deny)

서버스캔 (Snooping) 막기 스크립트 (.htaccess ip deny)



http://kb.site5.com/security/how-to-automatically-block-someone-who-is-snooping-around-your-site/ 

.htaccess 에서, 임의로 서버스캔해가는 놈들 감지되면, block.php 으로 보내고, 


http://kb.site5.com/security/how-to-automatically-block-someone-using-a-php-script/ 

이 스크립트에서, .htaccess 에, 아이피 deny 하는거에요. 



별건 아닌데, 아주 유용하게 쓰일수 있습니다. 


보통 해커들이 스캔 프로그램 임의로 돌리면 , 500 에러서부터, 실제로 뚫리기도 하고요. 


작은 작업으로 큰 효과를 볼수 있는.... 


미국 호스팅 회사인데, 잘 정리해놓은듯 해서 올려봅니다.

서버운영_웹 재요청 방지 및 트래픽 감소를 위한 방법

서버운영_웹 재요청 방지 및 트래픽 감소를 위한 방법


from cache 

서버에 요청자체를 하지 않는다. 

가장 효과가 좋다.(요청 자체가 없으므로) 

최초 한번 데이터를 가져오면, 그 후로는 웹 브라우저의 캐시에서 데이터를 가져온다. 

즉, 서버와의 통신이 없어진다. 

하지만 F5를 누를 경우 새로 데이터가 전송된다.(HTTP Code 200 발생) 

관련 응답 해더 및 PHP 적용법 ($g는 캐시 기간(초)) 

header('Cache-Control:public, max-age='.$g); // HTTP/1.1 

지정 초 이전까지는 재요청하지 않도록 권장함 (새로 고침에서는 무시됨) 

header("Expires: ".gmdate("D, d M Y H:i:s", time()+$g)." GMT"); //캐시 

지정 시간까지는 재요청 하지 않도록 권장함 (새로 고침에서는 무시됨) 

apache의 경우 mod_expires 적용 



304 Not Modified 

요청은 하지만, 트래픽이 아주 적게 발생된다.(해더 전송 정도만 발생) 

F5로 새로 요청해도 Etag나 Last-Modified의 조건에 맞으면 HTTP Code는 304가 발생된다.(실제 데이터 전송은 없음) 

(ctrl+F5의 경우 etag와 Last-Modified 가 없이 요청되므로 새로 가져온다.) 

관련 응답 해더 및 PHP적용법 

header("Etag: ".$etag_key); //etag 

파일의 수정내역을 Etag로 만들어서 출력한다. 

클라이언트가 같은 Etag로 요청하면, 304코드를 알려준다. 

아파치의 경우 FileETag 부분 참고 

파일 수정 시간을 사용할 경우 문제가 될 수 있다. 

서버를 여러대 사용할 경우 서버 간의 파일의 시간 차가 발생될 수 있기 때문이다. 

여러서버를 묶어쓰는(L4에 연결 해서) 경우 사용안하는게 좋다 

PHP에서 처리할 경우 요청에서 HTTP_IF_NONE_MATCH 관련 처리가 필요 

header('Last-Modified: '.gmdate("D, d M Y H:i:s", time()+$g)." GMT"); 

지정 시간까지는 파일이 수정되지 않는다는 것을 나타낸다. 

즉, 그 시간에 재요청해봤자 304 코드가 반환된다. 

apache의 경우 mod_expires 적용 

PHP에서 처리할 경우 요청에서 HTTP_IF_MODIFIED_SINCE 관련 처리가 필요


관련 링크 : http://www.mins01.com/home/board/board.php?type=read&b_id=tech&page=1&b_idx=903&t=1414993105

JENNIFER UI 차트 소개 (1.2 버전 릴리즈)


JENNIFER UI 라이브러리가 약 6개월 만에 정식 릴리즈를 하게 되었습니다. 이번 버전에서는 차트 라인업이 추가되었고, 아이콘 컴포넌트가 기존의 이미지 스프라이트 방식에서 벡터 타입의 폰트 아이콘으로 변경되었습니다.
 
차트는 SVG 기반으로 구현되었으며, 배경이 되는 5종의 그리드와 데이터를 표현할 수 있는 26종의 브러쉬 그리고 인터랙션을 담당하는 6종의 위젯으로 구성되어 있습니다. 또한 기존의 차트를 사용하여 구현한 래핑 컴포넌트로써 리얼타임 데이터를 보여주기 위한 컴포넌트도 제공합니다.
 
앞으로는 좀 더 다양한 종류의 브러쉬를 제공할 예정이며, 이 중에는 3D 브러쉬도 포함되어 있습니다. 그리고 커스텀 브러쉬를 구현할 수 있는 가이드 문서와 차트 구성에 대한 아키텍처 문서를 공개할 예정입니다.
 
관련해서 자세항 사항은 아래 링크를 참조하시면 됩니다.


메뉴얼 - http://seogi1004.github.io/jui
릴리즈 노트 - https://github.com/seogi1004/jui/releases


Link1 http://seogi1004.github.io/jui

Link2 https://github.com/seogi1004/jui/releases




윈도우에서 APM 설치하기

윈도우에서 APM 설치하기


윈도우에서 로컬에서 php를 개발하기 위한 세팅인 APM설치해보겠습니다.
APM 다운받는 곳
MySQL : http://mysql.org
PHP : http://php.net
Apache server : http://httpd.apache.org/
각각 자료실에서 쉽게 다운로드 하실수 있습니다.
MySQL 설치
MySQL은 아무 최신버전을 설치하면 됩니다. MySQL5버전을 설치할경우 설치중간에 root 비밀번호를 입력해주면
됩니다.
다음 중요한것은 php와 apache 설치인데요... 최신 apache2.2가 아직까지 php최신버전을 지원하지 않는 문제
로 인해 이 둘의 설치를 잘 해줘야 합니다.
여기서는 다음의 php와 apache버전을 설치합니다.
php5.1.6
Apache2.0.59
물론 정확히 위 버전대로 설치 안해도 되지만 만약 따라하시다가 설치가 제대로 안되시면 정확히 위 버전으로 설
치하시면 설치가 잘 될겁니다. MySQL은 아무 버전이나 상관없습니다.
PHP 설치
다운받은 PHP 5.1.6 의 압축을 C:\php 폴더에 풀어줍니다. php는 압축을 풀어준것만으로 설치가 다 됩니다.
- php 폴더의 php.ini-dist 파일의 이름을 php.ini로 변경한다.
- php.ini 파일을 C:\WINDOWS 폴더에 복사한다.
- php5ts.dll 파일을 C:\WINDOWS\system32 폴더에 복사한다.
- php 폴더의 libmysql.dll 파일을 C:\WINDOW\system32 디렉토리에 복사한다. (mysql설정)
이제 PHP가 제대로 돌아가도록 php.ini 파일의 설정 부분을 수정해야 한다. 메모장과 같은 편집기를 이용하여
php.ini 파일을 연뒤 extension_dir 부분을 찾아 디렉터리를 'c:\php\ext\로 바꾼다. MySQL의 사용과 관련된
설정인 ;extension=php_mysql.dll 부분을 찾아 앞의 주석 표시(;)를 지우고
'extension=php_mysql.dll' 로 바꾼다.
Apache 설치
apache_2.0.59-win32-x86-no_ssl을 다운받습니다. 이 파일을 더블클릭하여 설치를 시작합니다.
설치 중간에 Network Domain을 localhost 로 설정하고 Typical로 설치합니다.
Change 를 클릭하여 설치폴더를 C:\apache 로 변경합니다. install을 합니다.
이제 httpd.conf 파일의 환경설정이 남았습니다.
Apache가 설치된 폴더(C:\apache\Apache2\conf)를 찾아서 conf 폴더 내에 있는 httpd.conf 파
일을 엽니다. 메모장으로 열어도 되고 다른 에디터에서 열어도 됩니다.
httpd.con 파일의 최하단에 아래의 소스를 추가하고 저장하된 됩니다.
-------------------------------------------------------------------------
LoadModule php5_module "C:\php\php5apache2.dll"
AddType application/x-httpd-php .phtml .html .htm .inc .php .php3
AddType application/x-httpd-php-source .phps
Action application/x-httpd-php "/php/php.exe"
AddDefaultCharset euc-kr
-------------------------------------------------------
httpd.conf 파일의 환경설정이 끝났다면 반드시 Apache를 재실행시켜야 합니다. Apache를 재 실행하지 않으면
PHP가 실행되지 않습니다.
이제 C:\apache\Apache2\htdocs 폴더내에 파일을 저장하면 그 파일을 웹 브라우저에서 볼 수 있는 것입니
다. 메모장이나 에디터를 열어 아래와 같이 작성하고 C:\apache\Apache2\htdocs 폴더 내에 test.php로 저장
합니다.
-------------------------------------------------------------------------
<?
echo "<center><b>PHP 작동과 버전</b><p> ";
phpinfo();
?>
-------------------------------------------------------------------------
브라우저를 열고 주소 창에 http://localhost/test.php 라고 입력하고 이동하면 php 화면이 뜨면 설치가 성공한겁
니다.
참고 : test.php 파일을 htdocs 폴더에 저장하고 웹 브라우저를 실행하여 주소에 127.0.0.1/text.php 라고 하면
test.php 파일이 출력된다. 그런데 htdocs 폴더를 사요하기 싫고 다른 폴더를 설정하고 싶다면 httpd.conf 파일의
228라인의 DocumentRoot 값을 수정하면 된다.
이때 반드시 지정할 디렉터리가 생성되어 있어야 한다.