페이스북 로그인을 사용할 일이 있어 제 티스토리를 둘러 봤는데, 없어서, 작업하며 남겨 둡니다.

 

[공식문서]

Manually Build a Login Flow : https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow .

 

[주요 사이트]

페이스북 개발자 센터 : https://developers.facebook.com/ .

 

 

1. 페이스북 개발자 센터 로그인 및 앱정보 확인.

먼저, 개발자 센터로가 로그인하고, 해당 앱을 선택합니다. (페이스북 앱이 아직 없다면, 생성해 주면됩니다.).

 

베이직 셋팅으로가 AppID와 App Secret을 확인하고 메모해 둡니다. 앱 시크릿은 show 버튼을 누르면 표시가 됩니다.

그리고, 개발 계정에서도 사용할 수 있도로 계발자를 몇 명 등록합니다.

 

그리고, 페이스북 로그인을 사용할 수 있도록 추가합니다.

 

그리고 플랫폼별 퀵스타트가 나오는데 우리는 웹에 해당 하지만, 매뉴얼로 직접 설치 할 것 이므로, 굳이 보시지 않으셔도 좋습니다.

 

중요한 것은 리디렉션 페이지를 지정하는 것 입니다. 페이스북 로그인 시 처음 아이디 페스워드를 입력하는 창을 띄울 때 리디렉션을 통해 띄웁니다. 그리고, 이 것이 성공하면 호출될 리디렉션 주소를 입력하면 됩니다.

 

2. 로그인 창 부르기.

공식문서 Manually Build a Login Flow를 보면 아래와 같이 입력하라고 되어 있습니다.

https://www.facebook.com/v3.3/dialog/oauth?
  client_id={app-id}
  &redirect_uri={redirect-uri}
  &state={state-param}

 

값을 만들어 웹브라우저에 바로 붙여 넣어도 되며, 지금은 php서버로 작업할 것이며, start.php 파일을 만들어 위 페이지로 리다이렉션 시키도록 하겠습니다. state값은 임의로 생성해 주면 되며, redirect-url 은 로그인 결과를 돌려 받을 url로 위에서 적어둔 주소와 일치해야 합니다. 몇 개를 추가할 수는 있지만, 리스트에 없는 값으로 redirect를 요청하면 오류가 납니다. app-id는 위에서 확인했을 것 입니다.

그럼 로그인 페이지를 요청하겠습니다. 로그인이 끝나고, 돌려받는 redirect-url은 http:// 부터 (또는 https://) 파일명까지 풀로 적어 줍니다. 아래 소스가 페이스북 로그인 창을 부르는 소스의 모두 입니다. (편의상 start.php 라 하겠습니다.)

<?php

// 페이스북 로그인을 위한 주소를 만들어 줍니다.
$facebook_call_dialogue = "https://www.facebook.com/v3.3/dialog/oauth?"
  . "client_id={app-id}"
  . "&redirect_uri={redirect-uri}"
  . "&state={state-param}"
  ;
  
  
  
// 지정한 주소로 리디렉션 시키기.
header( 'Location: ' . $facebook_call_dialogue );

 

정상 동작한다면 아래와 같은 페이지를 만나게 됩니다.

 

페이스북의 API는 에세스 토큰을 얻은 다음 유저의 정보를 검색 하거나, 해당 유저 명의로 글을 쓰거나 할 수 있습니다.  이 때 권한이 필요한 데, 유저에게 이 앱이 그렇게 할 수 있는 권한을 주겠니 라고 물어보며, 그 화면이 아래와 같이 뜹니다.

 

여기서 다음을 누르면 code와 state를 위에서 적었던 redirect-url 페이지로 돌려 줍니다. 여기서 받은 코드를 서버에서 에세스 코드로 변경하는데, 보안상 php 서버에서 facebook과의 통신으로 통해 교환하며, GET 방식으로 연결해 받아 옵니다. php에서는 fsocketopen을 이용해 받아 올 수 있습니다.

 

 

 

3. 리디렉션 처리 하기.

리디렉션 까지 무사히 마쳤다면, GET을 통해 서버로 code 값이 전해 졌을 것 입니다. 그럼 아래 코드를 통해 토큰으로 교환할 수 있습니다. 이 부분은 redirect.php 에서 처리를 하면됩니다.

    // 코드값을 가지고 옵니다.
    $code = @$_GET['code'];



    // 에세스 토큰 교환을 위한 api 주소를 가지고 옵니다.
    $exchange_host = "graph.facebook.com";
    $exchange_path = "/v3.3/oauth/access_token";

    // 보낼 주소를 만들어 주도록 합니다.
    $mainAddr =
      $exchange_path
      . "?client_id=" . {app-id}
      . "&redirect_uri=" . {redirect-uri}
      . "&client_secret=" . {app-secret}
      . "&code=" . $code
    ;


    $addr = "https://" . $exchange_host . $mainAddr;
    echo "<br><br>";
    echo $addr;
    echo "<br><br>";


    // 보낼값을 만들어 줄 변수들을 만들어 줍니다.
    $endline = "\r\n";
    $req = "";

    // 보낼 데이터를 만들어 주도록 합니다.
    $req = "GET $mainAddr HTTP/1.1" . $endline
    . "Host: " . $exchange_host . $endline
    . "Connection: Close" . $endline . $endline
    ;





    // 페이스북 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://" . $exchange_host , 443 );

    if( @!$fsock )
    {
      // $error_result['method_error'] = "토큰을 교환하기 위한 페이스북 서버 접근에 실패하였습니다.";
      echo "토큰 교환을 위한 소켓을 여는 데 실패했습니다.";
      exit;
    }



    // 토큰 데이터를 확인합니다.
    $headPassed = false;
    $AccessTokenJson = "";

    // 데이터 보내기를 합니다.
    fwrite( $fsock, $req );

    while( !feof($fsock) ) {
      $runCount++;
      // 한 줄 라인을 가지고 옵니다.
      $line = fgets($fsock, 128);

      // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
      if( $line == "\r\n" && !$headPassed )
      {
        $headPassed = true;
        continue;
      }

      // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
      if( $headPassed )
      {
        $AccessTokenJson .= $line;
      }

    }

    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );


    print_r( $AccessTokenJson );

 

 

4. 로그인 유저의 정보 확인하기.

에세스 토큰을 교환하던 요령으로, 한번 더 http 요청을 하면됩니다.

    // json 문자열을 객체로 전환.
    $AccessTokenObj = json_decode( $AccessTokenJson );
    $token = $AccessTokenObj->access_token;




    // 접속한 유저의 정보를 가지고 옵니다.
    $me_host = "graph.facebook.com";
    $me_path = "/v3.3/me";


    $me_path =
      $me_path
      . "?access_token=" . $token;
      echo $me_path;
      echo "<br>"
      ;


    // 보낼값을 만들어 줄 변수들을 만들어 줍니다.
    $endline = "\r\n";
    $req = "";

    // 보낼 데이터를 만들어 주도록 합니다.
    $req = "GET $me_path HTTP/1.1" . $endline
    . "Host: " . $me_host . $endline
    . "Connection: Close" . $endline . $endline
    ;





    // 페이스북 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://" . $me_host , 443 );

    if( @!$fsock )
    {
      // $error_result['method_error'] = "토큰을 교환하기 위한 페이스북 서버 접근에 실패하였습니다.";
      echo "프로필 확인을 위한 소켓을 여는 데 실패했습니다.";
      exit;
    }



    // 토큰 데이터를 확인합니다.
    $headPassed = false;
    $meJson = "";

    // 데이터 보내기를 합니다.
    fwrite( $fsock, $req );

    $runCount = 1;

    while( !feof($fsock) ) {
      $runCount++;
      // 한 줄 라인을 가지고 옵니다.
      $line = fgets($fsock, 128);

      // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
      if( $line == "\r\n" && !$headPassed )
      {
        $headPassed = true;
        continue;
      }

      // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
      if( $headPassed )
      {
        $meJson .= $line;
      }

    }

    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );



    // 페이스 북으로 부터 access 토큰 교환 값을 표시합니다.
    echo "<br><br>respone of logined user profile from facebook:<br>";


    // 에세스 토큰을 확인해 주도록 합니다.
    // $AccessTokenObj = @json_decode( $AccessTokenJson );
    // $AccessToken = @$AccessTokenObj->access_token;

    print_r( $meJson );

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

sendmail 혹은 postfix를 설치하면, 메일을 보내는 것은 문제가 없습니다. 하지만, 수많은 지능적인 스팸메일들로 인해 대형 메일 서버(특히 GMail)는 추가적인 형식을 갖추어야 겨우 메일을 스팸으로 처리 할 것인지를 심사해 줍니다. 일단 여러가지 방법으로 스팸으로 처리 되지 않도록 하겠습니다.

 

1. mail-tester.com

우리가 보낸 혹은 보내게될 메일에 어떤 문제가 있는 지 검사를 해 줍니다. 일단 사이트로 접속을 하면, 처음 부터 자신에게 보낼 메일 주소를 알려 줍니다.

 

메일주소는 접속할 때 마다 바뀝니다. 알려준 메일로 주소를 보내어 봅시다. (창은 닫으면 안됩니다.). 그리고 메일이 도착하는 시간 30~1분 뒤 THEN CHECK YOUR SCORE 버튼을 눌러 주도록 합니다.

sendmail만 설치하고, 메일을 보냈다면, 다음과 같은 결과를 보게 될 것 입니다. 10점 만점에 -12.2 (센스 있게 0점으로 표시해 주더군요.)

 

각각의 + 항목을 눌러 본 세부적인 결과는 다음과 같습니다.

 

큰 문제는 도메인이 설치 되지 않아 발생하는 문제였습니다.

 

저는 위 상황을 보고, Reverse domain의 문제가 있다라고 보고, Reverse domain을 신청했습니다. Reverse domain은 인터넷 네트워크를 제공하는 장비 회사에 신청해야 합니다. 우리나라에서 직접 회선을 신청해 사용할 경우, KT 나 SKT 등이 될 것 입니다. 저는 aws에서 EC2( Elastic Compute 2 )라는 가상 머신에 ubunte 서비스를 사용하므로, aws에 신청을 했습니다.

먼저, aws에 지원에 리버스 도메인 신청서 제출 방법을 물었고, 아마존에서는 다음과 지원서 작성 양식폼의 주소를 알려 주었습니다. https://aws.amazon.com/forms/ec2-email-limit-rdns-request .

로그인된 상태라면 폼이 바로 보입니다.

작성을 해서 보냈고, 답을 기다리고 있습니다. (답이 오면 계속해서 적어 나가겠습니다.)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

MongoDB 설치 Ubuntu  (0) 2019.07.04
ubuntu sendmail 설치  (0) 2019.06.17
Postfix 설치 (ubuntu, SquirrelMail, apache, php)  (0) 2019.06.10
우분투 18.04 vsftp 설치  (0) 2019.06.04
Posted by 창업닉군
,

ubuntu에서 메일을 주고 받으려면, sendmail 이나 postfix를 설치하면 됩니다. 요즘 postfix를 사용하는 곳이 많은 것 같지만 저와는 상성이 별로 좋지 못하더군요. 저는 쉽게 설치되고, 잘 동작하는 sendmail을 써 보도록 하겠습니다. sendmail을 설치하고, 이 곳 저 곳으로 메일을 보내어 보면, 많은 곳에서 (특히 Gmail) 스팸 처리가 됩니다. 다음 문서에서 스팸 처리를 피하는 것에대해서 다뤄 보려고 합니다. (저도 아직 해 보지 않아 스팸 처리를 피할 수 있는지 확신은 없습니다.)

 

1. sendmail SMTP Server 설치.

설치는 매우 쉽습니다.

apt-get install sendmail

 

2. /etc/mail/sendmail.mc 파일 변경.

/etc/mail/sendmail.mc 파일을 열어 아래 2줄을 지웁니다. (왜 지우는지는 아직 모르겠음->안지워도 잘 갔던 느낌이).

DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
DAEMON_OPTIONS(`Family=inet, Name=MTS-v4, Port=smtp, Addr=127.0.0.1')dnl

 

3. 샌드메일 재 시작.

sudo service sendmail restart

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

MongoDB 설치 Ubuntu  (0) 2019.07.04
스팸메일로 처리 되지 않게 하기  (0) 2019.06.17
Postfix 설치 (ubuntu, SquirrelMail, apache, php)  (0) 2019.06.10
우분투 18.04 vsftp 설치  (0) 2019.06.04
Posted by 창업닉군
,

구글 맵만 표시하고, 사용자가 원하는 위치를 확인하려면, 터치 좌표를 확인하는 것이 필 수 인데요. 그것을 사용하려면, 구글 맵 공식 문서의 events 페이지를 보면 됩니다. 설명과 시각적인 표시가 잘되어 배우기 쉽지만, 모든 이벤트가 들어 있어 필요한 부분만 골라써야 합니다. 어렵지는 않습니다. 일단 구글 맵 표시 부분을 먼저 보시고 숙지하시는 것이 좋을 것 같습니다. 그래야, 필요한 코드가 어떤 것인지 쉽게 확인할 수 있습니다.

 

[공식문서]

Google Mpas Platform Map > javascript Overview : https://developers.google.com/maps/documentation/javascript/tutorial .
Google Mpas Platform Map > javascript Events : https://developers.google.com/maps/documentation/javascript/events .
Google Mpas Platform Map > javascript Reverse Geocoding : https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse .

 

[선행작업]

구글 지도 표시 : https://nicgoon.tistory.com/240 .

 

 

1. 사용 이벤트들 확인하기.

Event 공식 문서를 보면, 발생하는 이벤트를 시각적으로 표시해 주는 뷰가 하나 있습니다. 여기서 확인해 원하는 이벤트를 받아 주면 되겠습니다.

 

2. 클릭 이벤트 적용.

클릭 이벤트 리스너를 사용하면 됩니다. 처음 맵이 생성되면 콜백을 받는 메소드가 있습니다. 공식문서에는 initMap() 메소드인데, api키와 함께 지정할 수 있는데, 굳이 바꿀필요가 없어 대체로 저 이름으로 되어 있을 것 입니다. 이 속에 아래와 같이 이벤트를 걸어 주면됩니다.

  map.addListener('click', function(e) {
	// 여기에 맵의 클릭 이벤트를 넣어 줍니다.
  });

 

위경도 좌표는 다음 과 같이 볼 수 있습니다.

map.addListener('click', function(e) {

  console.log( e.latLng );

});

 

 

3. 받은 위경도 좌표를 우리가 인식할 수 있는 주소로 변환하기.

가이드를 이용해 만들 수 있고, 구글에서는 이 상황에 대비해 샘플로 공개 해 두었습니다. 위에 걸어 놓은 공식 문서 Google Mpas Platform Map > javascript Reverse Geocoding 의 내용을 보시면 되겠습니다.

 

먼저 geo 코드를 가지고 옵니다.

var geocoder = new google.maps.Geocoder;

 

그리고, 받은 위경도 좌표를 다음과 같이 요청할 수 있는 데이터로 변경합니다.

var latlng = {
  lat: e.latLng.lat(),
  lng: e.latLng.lng()
};

 

그리고, 주소는 다음과 같이 확이할 수 있습니다.

geocoder.geocode({'location': latlng}, function(results, status) {

  if( status === "OK" )
  {
    // console.log( results );
    alert( JSON.stringify( results ) );
  }else{
    alert("주소를 못 가지고 왔습니다. 사람 사는 곳이 아닌 것 같습니다.");
  }

});

 

 

 

4 전체 코드 보기.

전체 코드는 모두 초기 콜백 메소드인 initMap() 속에 다 넣을 수 있었고, 이 메소드만 보여 드립니다. 크게 어려움 없이 동작할 것 입니다.

    <script>
      var map;
      function initMap() {

        // 맵의 초기 위치 지정.
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
        });


        // 각 값들을 가지고 옵니다.
        var geocoder = new google.maps.Geocoder;


        // 클릭한 위치 확인.
        map.addListener('click', function(e) {
          // alert(e.latLng.lat());

          console.log( e );


          // 위경도 좌표를 요창할 객체를 만들어 줍니다.
          var latlng = {
            lat: e.latLng.lat(),
            lng: e.latLng.lng()
          };

          console.log( latlng );



          geocoder.geocode({'location': latlng}, function(results, status) {

            if( status === "OK" )
            {
              // console.log( results );
              alert( JSON.stringify( results ) );
            }else{
              alert("주소를 못 가지고 왔습니다. 사람 사는 곳이 아닌 것 같습니다.");
            }

          });



        });

        // 클릭한 좌표를 주소 형태로 변환.



      }
    </script>

 

 

 

 

 

 

 

 

 

 

 

'솔루션 > google Maps Platform' 카테고리의 다른 글

구글 맵 표시 ( javascript 이용)  (0) 2019.06.16
Posted by 창업닉군
,

웹페이지에 맵을 넣을 일이 있어, 구글맵을 적용하고, 잊지 않기 위해 글을 남겨 둡니다.

 

[공식문서]

Maps JavaScript API : https://developers.google.com/maps/documentation/javascript/tutorial .

 

[참고 사이트]

Google Maps Platform : https://cloud.google.com/maps-platform .

 

 

1. API키 받기.

먼저 구글 지도 플랫폼으로 들어 갑니다. 그리고 오른쪽 상단의 시작하기 버튼을 눌러 줍니다.

 

그리고 사용할 지도 플랫폼을 지정합니다. 일단 지도만 있으면 될것 같지만, 지역정보도 함께 선택해 둡니다.

 

그리고 새로운 프로젝트를 생성합니다. (기존의 프로젝트도 사용해도 상관은 없습니다.)

 

여기까지 들어 오면, 생성한 프로젝트에 결제 사용을 설정할 수 있습니다. 결제 계정을 만들어 줍니다.

 

결제계정을 지정하였다면 아래와 같이 프로젝트가 설정되고, 지도 사용을 위한 API 키가 나옵니다.

 

2. 소스 작성.

소스 작성은 공식 문서 Maps JavaScript API 에 있는 코드를 그대로 복사해 사용하면 됩니다.api키만 바꾸시면됩니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Simple Map</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
    <style>
      /* Always set the map height explicitly to define the size of the div
       * element that contains the map. */
      #map {
        height: 100%;
      }
      /* Optional: Makes the sample page fill the window. */
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      var map;
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
        });
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    async defer></script>
  </body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

파이어 베이스는 아주 간단하게 주요 인증 (sns, email, 문자발송)등을 쉽게 구현합니다. 로그인을 적용하는 방법은 2가지가 있는데, 첫 번째는 삽입형으로, 웹소스에 FirebaseUI 인증에 접근할 수 있는 UI까지 완전 삽입하는 방법, 두번째는 사용할 로그인 타입의 UI를 직접 만들 수 있는 Firebase SDK 인증 방식이 있습니다.

 

[공식문서]

Firebase 인증소개 : https://firebase.google.com/docs/auth/?authuser=0 .
기본 UI로 로그인 : https://firebase.google.com/docs/auth/web/firebaseui?authuser=0 .

 

 

 

1. 프로젝트 생성.

먼저 파이어 베이스 프로젝트를 추가하겠습니다. 파이어 베이스 콘솔페이지에서, 새 프로젝트를 선택합니다.

 

프로젝트 추가 창이 뜨면, 프로젝트 이름을 적고 프로젝트 만들기 버튼을 눌러 주도록 합니다.

 

콘솔화면에 들어와 웹추가 버튼을 눌러 줍니다.

 

그러면, 파이어 베이스 설정 코드를 붙여 넣어 파이어베이스 SDK를 초기화 할 수 있도록 해 줍니다. 사용할 웹페이지의 Head 태그 사이에 붙여 넣도록 합니다.

 

2. 파이어 베이스 인증 라이브러리 추가.

지금 부터 시작하는 내용은 공식문서의 [ 기본 UI로 로그인 ] 페이지의 내용을 보고 진행하였습니다. 함께 보며 따라하신다면 좋으실 것 같습니다.

위에서 html소스를 붙여 넣은 것은, 파이어 베이스 기본 라이브러리와 생성한 프로젝트의 설정 입니다. 인증을 사용하기 위해서는 인증 라이브러리를 추가해야 합니다. 공식문서에는 3가지 방법을 설명하고 있는 데, 저는 그중 CDN을 통해 추가하도록 하겠습니다. 아래 태그를 <head> 태그 속에 붙여 넣으면 됩니다.

<script src="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.js"></script>
<link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css" />

 

3. 로그인 방법 설정.

파이어 베이스는 현재 이메일/비밀번호 부터 익명의 로그인까지 10가지 (게임센터는 베타) 로그인 방법을 제공합니다. 처음에는 모두 비활성화 되어 있으므로, 사용할 방법을 파이어 베이스에서 설정해야 합니다.

일단 이메일/비밀번호를 사용해 로그인할 수 있도록 설정하겠습니다. 관리자 콘솔에서 Authentication을 선택하고, 로그인 방법 탭을 선택한 후 이메일/비밀번호를 선택합니다.

 

아래와 같이 [이메일/비밀번호]에 사용설정을 한 후 저장 버튼을 눌러 주도록 합니다. (상단 하나만 활성화 합니다.)

 

그 다음 파이어 베이스 인증 라이브러리를 추가합니다.

<script src="https://www.gstatic.com/firebasejs/6.1.1/firebase-auth.js"></script>

 

 

4. 로그인 창 호출.

너무 간단해 당황스럽지만, 이제 마지막 단원입니다. 아래와 같이 로그인 UI를 그려 주는 창을 호출 합니다.

var ui = new firebaseui.auth.AuthUI(firebase.auth());

ui.start('#firebaseui-auth-container', {
    signInFlow: 'popup',
    signInSuccessUrl: 'http://ntct24p006.cafe24.com/corner_v1/service/',
    signInOptions: [
        firebase.auth.EmailAuthProvider.PROVIDER_ID
    ]

    // Other config options...
});

 

그리고, 창이 그려질 위치를 지정해 줍니다.

<div id="firebaseui-auth-container"></div>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

목적 자체는 Postfix를 설치해 메일을 보내는 것 입니다. 하지만, 메일이 잘 오고 가는지 테스트를 해야 하므로, apache + php 설치 후 SquirrelMail이라는 웹메일 프로그램을 설치해, 테스트를 할 예정입니다.

 

[공식문서]

Squirrel Mail : https://squirrelmail.org .
Apache : http://apache.org .
PHP : php.net .
Postfix : postfix.org .
Dovecot : https://www.dovecot.org .

 

[참고문서]

Postfix 설치 : https://www.tecmint.com/setup-postfix-mail-server-in-ubuntu-debian/ .

 

 

 

1. Apache2 and PHP5 설치.

먼저 adt-get update를 해 줍니다. 이 것은 다운로드 가능한 최신 목록을 가지고 오는 명령입니다. 제가 한 번 안하고 설치했다 고생한 경험이 있습니다. 꼭 해 주는 것이 좋습니다.

$ sudo apt-get update

 

그럼 아래의 명령을 이용해 apache2와 php5를 설치하도록 합니다.

$ sudo apt-get install apache2 php

 

다른 곳에서 접속하려면 80번 포트를 열어두어야 함을 잊지 말아야 합니다.

 

 

 

2. postfix mail 서버 설치.

아래와 같이 입력해 postifx를 설치하도록 합니다.

$ sudo apt-get install postfix

 

설치중 첫 항목에서는 인터넷 사이트용으로 설정하도록 선택합니다.

 

그 다음 항목에서 메일을 받기 원하는 주소를 입력해 줍니다. 우리는 도메인을 설정하지 않았으므로, testing 이라고 입력합니다. 블로그를 쓰며 하다보니 'ㅅ'이 들어 갔습니다.

 

그 다음 메일 서버를 다시 시작해 줍니다.

$ sudo service postfix restart

 

 

 

3. Dovecot

다음과 같이 Deovecot을 설치합니다.

$ sudo apt-get install dovecot-imapd dovecot-pop3d

 

dovecot을 재 시작합니다.

$ sudo service dovecot restart

 

 

 

4. Installing SquirrelMail

SquirrelMail을 아래와 같이 입력해 설치 합니다.

$ sudo atp-get install squirrelmail

 

SquireelMail을 설정합니다.

$ sudo squirrel-configuire

 

 

 

*다음에 계속 작성하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

MongoDB 설치 Ubuntu  (0) 2019.07.04
스팸메일로 처리 되지 않게 하기  (0) 2019.06.17
ubuntu sendmail 설치  (0) 2019.06.17
우분투 18.04 vsftp 설치  (0) 2019.06.04
Posted by 창업닉군
,

고객의 요청으로 aws, EC2 node.js 웹 서버를 구축하게 되었습니다. 그래서 파일을 업로드할 ftp 서버를 하게되어, ftp 설치를 하는 김에 같이 하게 되었습니다.

 

[참고문서]

VSFTPD 설치방법 : https://linuxize.com/post/how-to-setup-ftp-server-with-vsftpd-on-ubuntu-18-04/ .

 

 

1. FTP 설치.

- 먼저 우분투에 접속하기 위해 ssh를 켭니다. 그리고, 키 페어를 이용해 로그인합니다. (키페어 관련은 따로 다루지 않습니다.).

$ ssh <키페어파일 위치> <EC2 서버 주소>

 

-  apt를 이용해 설치하기전 apt를 업데이트해 주는 것이 좋습니다.

sudo apt update

 

- 간단히 apt를 이용해 vsftp를 설치하겠습니다. 아래와 같이 명령을 통해, apt를 설치해 주도록 합니다.

$ sudo apt install vsftpd

 

- 그럼 약 10초 정도면 설치가 끝이 납니다. 그리고, vsftpd를 이용해 ftp 상태를 확인합니다.

$ sudo systemctl status vsftpd

명령을 치면 아래와 같이 설치된 위치와 현재 상태등을 확인할 수 있습니다.

 

- 부팅시 자동으로 시작되게 하려면, 아래와 같이 명령합니다.

$ sudo systemctl enable vsftpd

 

그리고 방화벽을 확인해 FTP 트래픽이 허용되어 있는지 확인합니다.

$ sudo ufw status

저는 UFW를 따로 설치하지 않아 다음과 같이 표시되었습니다.

 

 

 

2. AWS  보안 그룹 업데이트.

단독으로 리눅스를 쓰게 되면, UFW를 이용해, 방화벽을 설치해 사용하면 되고, 저처럼 아마존이나, AZURE를 사용하게 되면, 보안 그룹을 업데이트해야 합니다. (기본적으로 모든 포트가 막혀 있습니다.).

저는 AWS를 사용해 업데이트를 하겠습니다. 제 경험상 애저또한 설정이 크게 다르지 않습니다.

 

- 콘솔에 접속 후 EC2 서비스를 눌러 줍니다.

 

- 리소스화면이 나타나면, 보안그룹을 선택해 줍니다.

 

- FTP를 설치한 인스턴스의 보안 그룹을 선택하고, 작업 버튼을 눌러 인바운드 규칙 탭을 누르고, 편집 버튼을 눌러 줍니다.

 

- 인바운드 규칙 창이 나타나면, 규칙 추가 버튼을 눌러 줍니다.

 

- 새로운 규칙입력 필드가 추가되면, 유형은 [사용자 지정 TCP], 포트범위는 [20-21], 소스는 어디서나 접속이 가능하도록 [0.0.0.0/0], 설명은 [FTP]를 입력하고 저장버튼을 눌러 줍니다.

- 그럼 아래와 같이 인바운드 규칙이 추가되었습니다.

 

- 그리고 나서 파일 질라를 통해 접속해 보면 접속이 매우 잘 됨을 확인할 수 있습니다.

 

 

3. 전통적인 id-password 방식 로그인을 위한 계정 추가 및 설정.

위와 같이 키-페어 방식을 사용해 접속을 하면 여러모로 편리하지만, ftp를 지원하는 많은 프로그램 툴들( ATOM VS-CODE 등 )은 위와 같은 방식으로 접속할 수 없거나, 접속되어도 제약이 발생할 수 있습니다. 그래서, 전통적인 id-pass 방식을 통한 접속도 가능하도록 설정해 둘 필요가 있습니다.

 

- 파일을 주고 받을 때 사용할 포트 열기.

id-password 방식은 데이터를 주고 받을 포트를 따로 열어야할 필요가 있습니다. 앞서 열어둔 22번 포트는 로그인등 명령을 주고 받을 때만 사용합니다. 저는 AWS 사용해 이것으로 설명을 하지만, 여러분들은 상황에 맞게 방화벽등의 포트를 열어 두시면되겠습니다.

다시 보안 그룹으로 돌아와 포트를 열어 둡니다.

 

- 유저 추가.

아래와 같이 명령어를 입력하면, 유저가 추가되고, /home 폴더 아래 해당 유저를 위한 폴더가 추가됩니다.

$ sudo adduser ftpuser

 

- ftp 폴더 생성.

상위 폴더에서도 사용이 가능하지만, 아마존에서는 ftp를 위한 폴더를 생성하고 그곳에 사용하도록 권하고 있었습니다. 먼저 ftp만 사용할 폴더를 생성합니다.

$ sudo mkdir /home/ftpuser/ftp

 

그리고, 해당 폴더는 누구나 접근 가능하도록 (아마 아파치 웹과 같이 사용할 경우가 많으므로, 아마존에서는 이렇게 셋팅하도록 하는 것 같습니다.) 소유자를 바꿔줍니다.

$ sudo chown nobody:nobody /home/ftpuser/ftp

 

이 ftp 폴더는 모두가 읽기와 실행만 가능하도록 변경합니다.

$ sudo chmod a-w /home/ftpuser/ftp

 

- ftp 파일 업로드 폴더.

이제 해당 유저를 위한 파일 업로드 폴더를 생성해 줍니다.

$ sudo mkdir /home/ftpuser/ftp/files

 

소유자는 해당 유저로 설정해 줍니다.

$ sudo chown ftpuser:ftpuser /home/ftpuser/ftp/files

 

 

 

4. vim 패키지 추가.

이제 FTP를 설정할 텐데, 이 작업에 사용할 vi 툴이 필요합니다. 기본적으로 설치되어 있지만, 가끔 설치되어 있지 않을 수 있습니다. 아래와 같이 입력해 vim 패키지가 설치되어 있는지 확인합니다.

$ dpkg -l vim

 

설치되어 있지 않다면, 아래와 같이 표시됩니다.

 

아래 명령을 통해 패키지를 설치합니다.

$ sudo apt install vim

 

 

 

5. ftp 콘피그.

/etc/vsftpd.conf 파일에 vsFtp 설정이 들어 있습니다. 조금전 설치한 vi라는 툴을 이용해 이 파일을 설정하겠습니다. 아래 명령을 통해 vi 로 /etc/vsftpd.conf 파일을 읽어 드립니다.

sudo vi /etc/vsftpd.conf

 

- 누구나 FTP를 사용할 수 있는 설정을 no로 하고, 현재 리눅스 로컬 유저의 로그인 방식을 허용 합니다.

설치 후 기본적으로 아래와 같이 되어 있기 때문에, 그렇게 되어 있는가 만 확인하면 됩니다.

local_enable=YES
anonymous_enable=NO

 

- 파일을 업로드 설정.

파일을 업로드할 수 있도록. 다음 문장의 주석 (#)을 제거해 아래와 같은 상태가 될 수 있도록 합니다.

write_enable=YES

 

- 일반 유저가 자신이 권한을 가진 폴더외에는 경로 트리를 보지 못하게 설정합니다. (자신의 홈 디렉토리 부터 볼 수 있음).

chroot_local_user=YES

 

- 각 유저의 로컬 디렉토리를 알려 줄 수 있도록 다음과 같이 설정합니다.

user_sub_token=$USER
local_root=/home/$USER/ftp

 

- 패시브 모드를 위한 설정을 해 줍니다.

pasv_min_port=12000
pasv_max_port=12100

userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

 

- [esc]키를 눌러서 아래와 같이 명령하고 vi를 저장과 함께 종료합니다.

:wq

 

- 재시작 및 상태확인.

옵션을 적용하기 위해 재 시작해 줍니다.

$ sudo systemctl restart vsftp

 

그리고 동작상태를 확인해 줍니다.

sudo systemctl status vsftpd

 

잘 설정되었다면 아래와 같이 나옵니다.

 

6. ftp 접속.

파일 질라에서 아래와 같은 요령으로 접속을 합니다.

저는 접속이 잘되었는데 여러분은 어떤가요?

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

MongoDB 설치 Ubuntu  (0) 2019.07.04
스팸메일로 처리 되지 않게 하기  (0) 2019.06.17
ubuntu sendmail 설치  (0) 2019.06.17
Postfix 설치 (ubuntu, SquirrelMail, apache, php)  (0) 2019.06.10
Posted by 창업닉군
,

html 은 일반 채팅과 같은 TCP/IP 프로토콜을 사용하지만, 클라이언에서 서버로 요청을 보내면, 요청에 대한 처리 후 접속을 끊어 버립니다. 그런 이유로 단방향 통신이라하며, 서버에서 원할 때 클라이언트로 메시지를 보낼 방법이 없습니다.

하지만, HTML5에서 웹소켓 개념이 추가되며, 이런 문제를 해결하였습니다. node.js에서 잘 알려진 웹소켓 지원 모듈은 ws 와 socket.io 입니다. 둘다 websocket을 이용할 수 있다는 점은 같지만, 특징이 뚜렸하기 때문에, 사용목적이 달라질 수 있습니다.

ws : 표준 웹소켓을 구현하였습니다. 그래서, 웹 브라우저, 게임을 포함한 앱, 윈도우 프로그램 모든 곳에서 사용할 수 있습니다. 하지만, 구형 웹브라우저나, 웹소켓이 모두 구현되지 않은 곳에서는 잘 동작하지 않을 수 있습니다.

socket.io : 브라우저만을 위한 특화된 방식으로 모듈이 구현되어 있습니다. 그래서 표준 웹소켓이 아니므로, 웹에서만 사용이 가능합니다. 하지만, 웹소켓을 지원하지 않는 브라우저는 polling을 이용해 연결합니다. 즉, 99.99% 브라우저에서 동작합니다.

이 문서는 socket.io의 내용만을 답고 있습니다.

 

[공식문서]

websocket org : https://www.websocket.org .
socket io : http://socket.io .

 

[참고문서]

express 구축 : https://nicgoon.tistory.com/234 .
javascript 웹 소켓 클라이언트 : https://nicgoon.tistory.com/227 .

 

 

1. express 구축.

이 부분은 따로 설명하지 않습니다. ws 사용법을 집중적으로 다루기 위함 입니다. express를 사용해 본 경험이 없으시다면, 참고 문서의 express 구축 ( 링크 ) 페이지를 따라 구축해 주시면 될 것 같습니다.

 

 

2. socek.io를 이용한 route 구축.

- socket.io 모듈을 설치 합니다.

$ npm i socket.io

 

- 웹소켓을 구현 합니다.

그리고 웹소켓을 처리할 모듈파일 webSocket.js 을 적당한 위치에 만들어 줍니다. 모듈 파일을 생성했다면, 아래와 같이 소스를 만들어 줍니다. (각 소스에 대한 설명은 주석을 달아 두었습니다.). socket.io의 특징은 connect, disconnect, error외에 이벤트를 직접 정의 한다는 것 입니다. 즉 어디로 받을 것인지 선택할 수 있으며, 아래소스에서는 ms라는 이벤트를 추가하였습니다.

const SocketIO = require("socket.io");

module.exports = function ( _server ) {

    // 소켓 io를 처리할 객체를 생성합니다.
    const io = SocketIO( _server, {path: '/socket.io'} );

    // 접속 처리 및 해당 클라이언트에 대한 모든 처리를 합니다.
    io.on( "connection", function( socket ){

        // 접속한 정보를 표시합니다.
        const req = socket.request;
        const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
        console.log( ip + "의 새로운 유저가 접속하였습니다." );

        // 접속이 끊어진 경우 처리를 하는 콜백 입니다.
        socket.on( "disconnect", function(  ){
            console.log("접속을 해제 하였습니다.");
        });

        // 오류가 난 경우 처리를 하는 콜백 입니다.
        socket.on( "error", function( error ){
            console.log( "error:" + error );
        });

        // 일반 메시지를 받은 경우의 처리 입니다. (ms 라는 이벤트로 클라이언트가 보낼 때 마다 이 메소드가 호출 됩니다.)
        socket.on( "ms", function( data ){

            // 클라이언트로 부터 받은 메시지를 표시합니다.
            console.log( "클라이언트로 부터 받은 메시지 : " + data );

            // 클라이언트에 구현된 echo 이벤트로 메시지를 보내어 줍니다.
            socket.emit( "echo", data );

        });
        
    });

}

 

- 구현한 웹소켓을 연결합니다.

그런다음 모듈을 http 서버에 연결해 줍니다. (express 같은 경우 listen을 통해 만들어진 서버, http의 경우 createServer 메소드로 만들어진 서버). 위에 링크된 express 구축을 따라했다면, /bin/www 파일속에 server 객체가 정의 되어 있습니다. 적당한 위치에 아래와 같이 웹소켓을 연결하도록 합니다.

const webSocket = require( "../routes/webSocket" );
webSocket( server );

 

 

3. 브라우저를 통해 웹소켓 서버에 접속해 보기.

- 지금까지 구현한 서버 실행.

$ npm start

 

- 클라이언트 만들고 호출 하기.

테스트할 웹브라우저에 아래 소스를 추가합니다. 웹에서 우리가 만든적 없는 js 파일 "/socket.io/socket.io.js" 파일을 추가하는데, express 서버에 socket.io를 구현하였다면, 자동으로 추가되어 다운로드 받을 수 있습니다. 그리고, 서버와 마찬가지로, 받는 이벤트명을 마음대로 정할 수 있습니다. 특징은 접속을 따로 하거나, 연결을 따로 하지 않습니다. 끊어지면 바로 자동으로 새 접속을 시도합니다. (언제나 연결을 유지 합니다.)

<!DOCTYPE html>
<meta charset="utf-8" />
<title>WebSocket Test</title>

<script src="/socket.io/socket.io.js"></script>
<script>

  // 웹소켓 서버를 설정합니다.
  var socket = io.connect( "http://localhost:3000" , {path: "/socket.io"} );
  socket.on( 'echo', function( data ){

    console.log( data );
    writeToScreen( "받은메시지:" + data )


  });

  // 서버로 데이터를 보내기 위한 메소드 입니다.
  function sendMessage( )
  {
    // 서버에 구현된 ms 이벤트로 메시지를 보냅니다.
    mss = document.getElementById( "message" ).value;
    socket.emit( "ms", mss );
    
  }
  // 받은 메시지를 출력합니다.
  function writeToScreen(message)
  {
    var pre = document.createElement("p");
    pre.style.wordWrap = "break-word";
    pre.innerHTML = message;
    output.appendChild(pre);
  }

</script>


<h2>소켓 io 동작을 테스트 하기 위한 node js 입니다.</h2>


<form>

    <input id="message" /> <button type="button" onclick="sendMessage();" >전송</button><br>

</form>


<div id="output"></div>

 

- 브라우저 호출.

브라우저에서 위의 소스를 실행하면, node.js에 아래와 같은 메시지를 볼 수 있습니다. (자동으로 바로연결됨)

 

- 메시지 보내기.

브라우저에서 적당한 메시지를 입력하고, 전송 버튼을 눌러 봅니다.

 

그러면 아래와 같이, 메시지를 되돌려 받았을 것 입니다.

 

서버의 상태를 보면, 아래와 같이 클라이언트가 접속했음을 확인할 수 있습니다.

 

그리고 브라우저를 닫으면, 서버에서 접속이 끊어진 메시지 또한 확인할 수 있습니다.

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

그간의 html 통신은 요청에 대한 처리를 한 후 응답을 돌려주는 방식으로 동작했습니다. 우리가 흔히 챗팅 프로그램에서 사용하는 포로토콜인 TCP/IP를 사용했지만, [연결->요청에대한처리->응답->연결끊기] 사이클을 반복하며, 연결을 계속 끊기 때문에, 클라이언트의 요청은 언제든지 전달 할 수 있지만, 서버의 메시지는 클라이언트로 전달할 수 없었습니다.

그래서 나온 것이 웹소켓 이며, 서버의 구현도 간단하며 (직접 구현해도 될 정도), 클라이언트 또한 매우 간결하며, 요즘은 대부분은 웹브라우저에서 지원을 해 줍니다. 이 페이지는 ws 모듈을 이용해 웹브라우저와 node.js간의 간단한 통신을 구현한 예제를 설명하고 있습니다. 간단하지만, 이를 바탕으로 원하는 채팅 모듈을 구현할 수 있으리라 생각이 됩니다.

본 문서를 보려면, node.js 에서 express 서버의 구축 과정을 알고 있어야 합니다. (물론 아래에 관련 링크를 제공합니다.)

 

 

[공식문서]

websocket org :  https://www.websocket.org .
ws : http://www.npmjs.com/package/ws .

 

[참고문서]

express 구축 : https://nicgoon.tistory.com/234 .
javascript 웹소켓 클라이언트 : https://nicgoon.tistory.com/227 .

 

 

 

1. express 구축.

이 부분은 따로 설명하지 않습니다. ws 사용법을 집중적으로 다루기 위함 입니다. express를 사용해 본 경험이 없으시다면, 참고 문서의 express 구축 ( 링크 ) 페이지를 따라 구축해 주시면 될 것 같습니다.

 

 

 

2. ws를 이용한 route구축.

ws 모듈을 설치 합니다.

$ npm i ws

 

그리고 웹 소켓 통신을 처리할 모듈을 구현할 webSocket.js 파일을 만들어 줍니다.

모듈파일을 생성했다면, 아래와 같이 소스를 만들어 줍니다. (각 소스에 대한 설명은 주석을 달아 두었습니다.)

const wsModlue = require( "ws" );


module.exports = function( _server )
{


    // 웹소켓 서버를 생성합니다.
    const wss = new wsModlue.Server( {server:_server} );

    // 클리이언트가 접속했을 때 처리하는 이벤트 메소드를 연결합니다.
    wss.on( 'connection', function( ws, req ){

        // 사용자의 ip를 파악합니다.
        let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
        console.log( ip + "아이피의 클라이언트로 부터 접속 요청이 있었습니다." );

        // 메시지를 받은 경우 호출되는 이벤트 메소드 입니다.
        ws.on('message', function( message ){

            // 받은 메시지를 출력합니다.
            console.log( ip + "로 부터 받은 메시지 : " + message );

            // 클라이언트에 받은 메시지를 그대로 보내, 통신이 잘되고 있는지 확인합니다.
            ws.send( "echo:" + message );

        });

        // 오류가 발생한 경우 호출되는 이벤트 메소드 입니다.
        ws.on('error', function(error){
            console.log( ip + "클라이언트와 연결중 오류 발생:" + error );
        })

        // 접속이 종료되면, 호출되는 이벤트 메소드 입니다.
        ws.on('close', function(){
            console.log( ip + "클라이언트와 접속이 끊어 졌습니다." );
        })


    });


}

 

그런 다음 모듈을 http 서버에 연결해 줍니다. (express같은 경우 listen을 통해 만들어진 서버, http의 경우 createServer 메소드로 만들어진 서버). 위에 링크된  express 구축을 따라 했다면, /bin/www 파일 속에 server 객체가 정의 되어 있습니다. 적당한 위치에 아래와 같이 웹소켓을 연결하도록 합니다.

const webSocket = require("../routes/webSocket");
webSocket( server );

 

웹소켓은 익스프레스 서버와 port를 공유하므로, 따로 포트를 지정할 필요가 없습니다.

 

 

3. 브라우저를 통해 웹소켓 서버에 접속해 보기.

브라우저에서 웹소켓 이용 방법은 위의 참고 문서 [javascript 웹소켓 클라이언트 (링크)] 문서를 읽어 주세요. 이 페이지는 node js를 통한 웹소켓 서버 구축만 집중적으로 설명을 합니다.

웹소켓을 테스트하기 위한 웹 브라우저는 따로 만들지 websocket공식 사이트에 구현된 챗팅 클라이언트 페이지를 이용합니다. 웹소켓 기능을 구현할 때 일단 websocket 공식 사이트에 구헌된 챗팅 클라이언트 페이지를 이용해 구축하고, 클라이언트 부분은 이렇게 완성된 웹소켓 서버와 연결하는 식으로 구축합니다. 2가지를 한 꺼번에 구축하면, 오류 발생시 어느쪽이 문제인지 알 기 힘듭니다. 이렇게 단계별로 만든다면, 약간은 쉽게 구현이 가능합니다.

먼저 지금 까지 구현 한 서버를 동작 시켜 줍니다.

$ npm start

 

그 다음, 클라이언트로 이용할 https://www.websocket.org/echo.html 페이지로 접속합니다. 그러면 아래와 같은 화면을 볼 수 있습니다. 여기서, 로케이션 창에 주소를 입력하고 connect 버튼을 누릅니다. 이라고 입력 합니다.  위의 참고 문서 [express 구축] 을 보고 서버를 구축했다면, 주소는 ws://localhost:3000 이 됩니다.

그럼 아래와 같이 접속이 됩니다.

서버 또한 클라이언트로 부터 연결이 있었음을 알 수 있는 로그를 표시합니다.

 

다음 웹브라우저에서 서버로 메시지를 보내 보겠습니다. Message 항목에 적당한 메시지를 입력하고, Send 버튼을 누릅니다.

그럼 메시지가 가고, 서버로 부터 보낸 내용을 그대로 보낸 메아리를 받을 수 있습니다.

서버측에서도 클라이언트가 보낸 메시지의 로그를 확인할 수 있습니다.

 

마지막으로 접속을 끊어 보겠습니다. Disconnect 버튼을 누릅니다.

그리고 나면 접속이 끊어졌음을 로그로 확인할 수 있습니다.

 

물론 서버측에서도 클라이언트와 접속이 끊어졌음을 확인하는 로그를 볼 수 있습니다.

 

 

저는 웹소켓동작이 잘되었습니다. 여러분들도 잘 동작이 되었으면 좋겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,