디렉터리 구조나 파일의 위치, 이동, 삭제 등을 좀 편하게 하기 위해서 FTP를 연결해 로컬에서 관리할 수 있도록 한다.

 

FTP 툴은 FileZilla를 사용한다.

 

FileZilla

 

 

FileZilla를 실행하고 필요한 정보를 채운다.

 

호스트는 서버의 ip 주소, 사용자명과 비밀번호는 서버를 만들 때 입력했던 정보를 쓰면 된다.

 

포트는 FTP의 경우 기본적으로 21번 포트를 사용한다.

 

모든 정보를 입력하고 연결을 하면 디렉터리를 직관적으로 확인할 수 있다.

 

 

이제 GUI로 계층 구조를 직관적으로 확인할 수 있다.

 

FTP 사용을 하게 되면 파일을 관리하기 위해서는 읽기 뿐만 아니라 쓰기 권한도 필요하다. 서버에서 생성했던 파일은 소유자와 그룹 모두 서버에서만 사용할 수 있는 상태인데 일단 test.php를 로컬에서 변경할 것 이기 때문에 이 파일의 권한 중 그룹을 변경하고 쓰기 권한도 추가해 본다.

 

일단 파일들이 계속 추가될 것을 대비해서 폴더를 세분화해 둔다.

 

dev 경로를 생성해서 release 루트와 구분되도록 한다.

 

$sudo mkdir /home/username/html/dev

 

 

해당 경로로 test.php 이동

 

$sudo mv /home/username/html/test.php /home/username/html/dev/

 

test.php 권한 수정

 

// 읽기/쓰기 권한 부여
sudo chmod 664 /home/username/html/dev/test.php
// 소유자 , 그룹 수정
sudo chown apache:username /home/username/html/dev/test.php

 

 

php의 수정된 내용은 기존에 페이지가 열릴 때마다 테이블에 인서트 되던 것을 버튼 입력으로 처리 후 결괏값을 페이지에 반영하도록 수정했다.

 

<?php
// MySQL Connection
$servername = "localhost";
$username = "name";
$password = "password";
$dbname = "testdb";

//conn
$conn = new mysqli($servername, $username, $password, $dbname);

//conn check
if ($conn->connect_error){
	die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";

// data insert test (폼에서 제출 버튼 클릭 시 실행)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $sql = "INSERT INTO users (username, email) VALUES ('testuser', 'test@example.com')";
    if ($conn->query($sql) === TRUE) {
        echo "New record created successfully<br>";

        // 테이블 데이터 출력
        echo "<h3>Users Table:</h3>";
        $result = $conn->query("SELECT * FROM users");
        if ($result->num_rows > 0) {
            echo "<table border='1'><tr><th>ID</th><th>Username</th><th>Email</th></tr>";
            while($row = $result->fetch_assoc()) {
                echo "<tr><td>" . $row["id"]. "</td><td>" . $row["username"]. "</td><td>" . $row["email"]. "</td></tr>";
            }
            echo "</table>";
        } else {
            echo "0 results";
        }
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
}

$conn->close();
?>

<!-- 폼 추가 -->
<form method="POST" action="">
    <button type="submit">Submit</button>
</form>

 

로컬에서 수정한 test.php를 ftp를 사용해서 파일을 덮어쓰기 해본다.

 

이전에는 권한이 없어서 해당 동작이 실패했지만 권한 수정 후 문제없이 동작이 실행되었고 서버에서 vim으로 파일을 열어 변경된 내용을 확인해 보면 잘 바뀐 것을 확인할 수 있다.

 

이제 수정된 test.php 페이지를 열어본다.

 

 

 submit 클릭 시

 

 

FTP 연결까지 이상 없이 완료되었다.

728x90
반응형

'Develop > Server' 카테고리의 다른 글

[NHN Cloud Hosting - Linux] 로컬에서 DB 접속  (0) 2025.03.01
vim 명령어  (0) 2025.03.01
리눅스 명령어 - ls  (0) 2025.03.01
[NHN Cloud Hosting - Linux] php 테스트  (1) 2025.03.01
[NHN Cloud Hosting - Linux] mysql 테스트  (0) 2025.03.01

리눅스 서버에서 db를 사용하기에는 불편함이 많아서 로컬에서 클라이언트 툴을 연결해서 사용하기로 한다.

 

툴은 평소에 자주 쓰던 HeidiSQL을 쓰기로 한다.

 

NHN에서 서버의 보안 그룹 관련된 내용을 보면 my_sql은 기본적으로 허용하지 않기 때문에 직접 서버의 콘솔 페이지에서 보안그룹에 들어가서 포트와 접근 ip에 대한 설정을 해주어야 한다.

 

대시보드 > 자세히 보기 > 프로젝트 명 선택

 

보안 그룹 관리에서 추가하여 상태를 변경해 준다.

 

수신 / 사용자 정의 TCP / 3306 (MY-SQL) / IPv4 / 내 로컬 주소 (CIDR)

 

CIDR은 IP 주소 범위를 지정하는 방법인데 0.0.0.0/0은 모든 IP 주소를 허용하는데 내 로컬 주소만 허용하기로 한다.

 

https://ipinfo.io/ 에서 확인하여 내 IP를 특정하여 입력해 준다.

 

이렇게 하면 콘솔에서 보안은 해결되었고 이제 서버의 mysql에 로그인해서 로컬에서 사용할 계정을 따로 추가하도록 한다.

 

CREATE USER 'user_id'@'user_ip' IDENTIFIED BY 'user_password';

 

계정은 접속할 수 있는 IP를 지정(내 로컬 ip)하여 생성한다.

 

그리고 이 계정에 권한을 준다.

 

GRANT ALL PRIVILEGES ON testdb.* TO 'user_id'@'user_ip';
FLUSH PRIVILEGES

 

위에서 만든 계정에 database_name 데이터베이스에 대한 모든 권한(.*)을 준다.

 

이제 이렇게 만든 계정으로 HeidiSQL에 로그인하면 

 

HeidiSQL

 

서버의 db를 GUI로 확인할 수 있어 편한 게 관리할 수 있게 되었다.

728x90
반응형

'Develop > Server' 카테고리의 다른 글

[NHN Cloud Hosting - Linux] FTP 연결  (0) 2025.03.01
vim 명령어  (0) 2025.03.01
리눅스 명령어 - ls  (0) 2025.03.01
[NHN Cloud Hosting - Linux] php 테스트  (1) 2025.03.01
[NHN Cloud Hosting - Linux] mysql 테스트  (0) 2025.03.01

먼저 vim이란 텍스트 편집기이며 파일을 편집할 때 사용하는 만큼 다양한 명령어들에 대해서 알고 있어야 유의미한 활용이 가능하다.

 

vim은 모드마다 수행할 수 있는 동작들이 구분되며 vim을 사용해서 파일을 열게 되면 일반 모드로 시작하게 된다.

 

일반 모드

텍스트를 수정할 수 없으며 커서 이동, 삭제, 복사, 붙여 넣기 등의 명령을 실행할 수 있다.

커서 위치를 기준으로 동작하는 명령어들이 있는데 커서 위치는 방향키로 이동할 수 있다.

 

x : 커서 위치의 문자 하나 삭제

dd : 현재 줄 삭제

d$ : 커서부터 현재 행의 끝까지 삭제

d0 : 커서부터 현재 행의 시작까지 삭제

d{motion} : {motion}이 가리키는 텍스트를 삭제 ({motion}은 이동 명령어)

ex) dw는 단어 삭제

 

yy : 현재 줄 복사

y {motion} : {motion}이 가리키는 텍스트 복사

ex) yw는 한 단어 복사

 

p : 복사한 텍스트를 커서 뒤에 붙여 넣기

P : 복사한 텍스트를 커서 앞에 붙여 넣기

u : 마지막 변경 취소 (undo)

Ctrl + r : 마지막 취소 작업 복구 (redo)

입력 모드

텍스트를 수정할 수 있는 상태로 진입한다. esc로 일반모드 전환할 수 있다.

 

i : 커서 앞에 텍스트 입력 시작

I : 현재 행의 맨 앞에서 입력 시작

a : 커서 뒤에서 텍스트 입력 시작

A : 현재 행의 맨 끝에서 입력 시작

o : 다음 줄에 새 행을 추가하고 입력 모드로 전환

O : 현재 줄 위에 새 행을 추가하고 입력 모드로 전환

 

h : 왼쪽으로 한 칸 이동

j : 아래로 한 줄 이동

k : 위로한 줄 이동

l : 오른쪽으로 한 칸 이동

w : 단어 단위로 앞으로 한 칸 이동

b : 단어 단위로 뒤로 한 칸 이동

0 : 현재 행의 시작으로 이동

$ : 현재 행의 끝으로 이동

gg : 파일의 첫 번째 줄로 이동

G : 파일의 마지막 줄로 이동

 

/검색어 : 파일 내에서 '검색어'를 검색, 다음 단어로 이동은 n

? 검색어 : 파일 내에서 '검색어'를 역방향으로 검색, 이전으로 이동은 N

 

ZZ : 저장하고 종료

 

명령모드

vim의 명령어를 입력할 수 있는 모드로 : 를 입력해 진입할 수 있다.

 

:{숫자} : 지정한 줄로 이동 (:10은 10번 줄로 이동)

:w :현재 파일 저장

:w filename : 다른 이름으로 파일 저장

:q : vim 종료, 저장되지 않은 변경 사항이 있으면 경고가 뜬다.

:q! : 저장하지 않고 종료

:wq : 저장하고 종료

 

:set number : 줄 번호 표시

:set nonumber : 줄 번호 숨기기

:set ignorecase : 대소문자 구분 없이 검색

:set noignorecase : 대소문자 구분하여 검색

 

:set autoindent : 자동 들여 쓰기 활성화 (현재 줄의 들여 쓰기를 자동으로 이전 줄의 들여쓰기와 맞춰주는 기능)

:set smartindent : 스마트 들여쓰기 활성화 (코드 구조에 따라 들여쓰기를 조정하는 기능)

 

:set paste : 붙여 넣기 모드 활성화 (들여쓰기가 깨지지 않도록)

:set nopaste : 붙여넣기 모드 비활성화

:help : vim 도움말 열기

 

:split or :sp : 수평 분할

:vsplit or :vsp : 수직 분할

 

이 외 이동명령

Ctrl + f : 한 페이지 아래로 이동

Ctrl + b : 한 페이지 위로 이동

Ctrl + d : 파일에서 절반 정도 아래로 이동

Ctrl + u : 파일에서 절반 정도 위로 이동

 

Ctrl + w, s : 창을 수평으로 나누고 커서 이동

Ctrl + w, v : 창을 수직으로 나누고 커서 이동

Ctrl + w, q : 분할된 창 닫기

728x90
반응형

자주 사용되는 명령어를 생각날 때마다 정리하기로 한다.

 

ls

ls

 

list의 약자로 디렉터리 내의 파일과 폴더 목록을 나열하는 데 사용된다.

 

기본 사용법인 ls는 현재 디렉터리의 파일과 폴더 목록을 나열한다.

 

다른 디렉터리의 목록을 보려면

 

ls /path/to/directory

 

ls 뒤에 확인하고자 하는 경로를 입력한다.

 

옵션

ls -l

파일의 권한, 소유자, 크기, 수정 시간 등 상세 정보와 함께 목록을 표시한다.

 

ls -a

숨겨진 파일(점으로 시작하는 파일)도 포함하여 모든 파일을 나열한다.

 

ls -lh

파일 크기를 사람이 읽기 쉬운 형식으로 표시한다.

 

ls -R

하위 디렉터리까지 재귀적으로 목록을 나열한다.

 

ls -lt

수정 시간을 기준으로 파일을 정렬 (최근 수정된 파일 우선)

 

ls -lS

파일 크기를 기준으로 정렬 (큰 파일이 우선)

 

ls -lr

역순으로 정렬

 

ls -d */

디렉터리 자체만 표시 (디렉터리 내의 파일 목록은 표시되지 않음)

 

ls -1

한 줄에 하나의 파일만 표시

기본적으로 여러 열로 표시되지만, -1 옵션을 사용하면 한 줄에 하나씩 표시

 

man ls

이 외의 옵션들에 대한 매뉴얼을 확인할 수 있다.

728x90
반응형

이번에는 test.php 파일을 만들어서 잘 동작하는지 테스트해본다.

 

먼저 리눅스에서 텍스트 파일을 사용하기 위해서 텍스트 편집기가 필요한데 일반적으로 vim이나 nano를 사용한다.

 

vim이 좀 더 복잡하지만 기능이 많고 nano가 더 단순하면서 간단하게 쓰는 도구라고 하는데 

 

일단 서버에 깔려있는 건 vim이라서 그대로 vim을 쓰기로 한다.

 

vim 버전확인

vim --version

 

파일을 생성하기 위해서는 경로가 필요한데 생각해 보니 아직 리눅스 서버의 폴더 구조를 모른다.

 

일단 폴더가 뭐가 있는지 확인해 본다.

 

ls /

 

ls 명령어는 자주 사용되는 것 중 하나로 list를 의미한다.

 

리눅스의 ls는 디렉터리 내의 파일과 폴더 목록을 나열하는 데 사용되며 / 를 통해서 루트 디렉터리에서 목록을 나열해 본다.

 

 

- bin : 시스템 부팅 및 작업에 필수적인 명령어들이 위치한다. 

- dev : 하드웨어 장치와 관련된 파일들이 들어 있다.

- home : 일반 사용자 계정의 홈 디렉터리가 위치한다. 각 사용자의 개인 디렉토리

- lib64 : 64비트 시스템 및 프로그램에 필요한 라이브러리  위치

- mnt : 일반적으로 임시로 다른 파일 시스템을 마운트 하는 디렉터리

- proc : 가상 파일 시스템으로, 시스템 상태나 프로세스 정보를 제공

- run : 시스템의 현재 실행 중인 프로세스와 관련된 정보가 저장

- srv : 서버가 제공하는 서비스에 관련된 데이터를 저장 (웹 서버, FTP 서버 등)

- tmp : 임시 파일들이 저장되는 경로, 시스템이 재부팅되면 지워진다.

- var : 로그 파일, 캐시 파일, 스풀 파일 등 변동하는 데이터가 저장되는 경로

- boot : 커널 파일 및 부트로더 관련 파일이 있다.

- etc : 시스템 설정 파일들이 모여 있는 경로이며 네트워크 설정, 사용자 설정 등이 포함된다.

- lib : 32비트 프로그램 실행에 필요한 필수적인 라이브러리 파일

- media : usb 드라이브나 cd/dvd 등 이동식 미디어 장치가 마운트 되는 곳

- opt : 추가적인 소프트웨어 패키지들이 설치되는 디렉터리

- root : 시스템의 루트 사용자 홈 디렉토리

- sbin : 시스템 관리자용 명령어들이 위치하는 경로

- sys : 시스템 관련 정보를 제공하는 가상 파일 시스템

- usr : 사용자 프로그램과 관련된 파일들이 위치로 프로그램, 라이브러리, 문서 등이 포함

 

Apache 웹 서버의 경우 보통 /var/www/html/ 경로에서 파일을 처리한다고 하는데 먼저 이 경로에서 파일을 만들고 테스트했을 파일을 못 찾는 문제가 있었다.

 

 

어떤 문제인지 찾아보면서 Apache 설치와 실행 상태, 찾으려는 파일의 디렉터리 권한도 변경해보고 했지만 해결이 안 되었다.

 

그리고 Apache 로그를 조회해 보았는데 경로에 문제가 있었다는 걸 알게 되었다.

 

$sudo tail -f /var/log/httpd/error_log

 

/var/www/html/ 가 아닌 /home/bakcoding/html/ 에서 test.php 파일을 찾고 있어서 Not Found 에러가 뜬 것

 

서버 환경이나 세팅에 따라서 달라지는 부분인가 보다.

 

처음부터 에러 로그를 찾았다면 더 빨리 해결됐을 문제였다.

 

이제 정확한 경로를 알게 됐으니 다시 파일 생성으로 돌아간다.

 

vim을 사용해서 파일을 생성해 보기로 한다.

 

$sudo vim /home/username/html/index.php

 

sudo는 Super Do로 이걸 붙이면 관리자 권한으로 실행과 마찬가지로 볼 수 있다.

 

권한에 따라 sudo 없이 vim만 실행하면 파일을 열어볼 수 만 있으므로 sudo를 붙여서 명령어를 실행해 준다.

 

위 명령어를 실행하면 파일이 있는 경우 해당 파일이 열리고 없으면 새로 생성되면서 콘솔창이 vim 창으로 바뀐다.

 

 

이 상태에서는 특정 키워드를 입력하면 동작으로 이어지게 되는데 먼저 파일을 작성할 때는 명령어 입력 상태에서 i를 입력하면 된다.

 

그리고 php 내용을 채워주는데 간단하게 db에 연결하고 성공과 실패 시 리턴 그리고 테이블에 값도 넣어보도록 한다.

 

<?php
// MySQL Connection
$servername = "localhost";
$username = "userid";
$password = "password";
$dbname = "testdb";

//conn
$conn = new mysqli($servername, $username, $password, $dbname);

//conn check
if ($conn->connect_error){
        die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";

// data insert test
$sql = "INSERT INTO users (username, email) VALUES ('testuser', 'test@example.com')";
if ($conn->query($sql) === TRUE){
        echo "New record created successfully";
} else{
        echo "Error: " . $sql . "<br>" . $conn->error;      
}
$conn->close();
?>

 

이렇게만 해놓고 

 

이제 http://내 서버 주소/test.php를 주소창에 입력했을 때 아무 문제가 없다면 성공했다는 텍스트가 뜨고 db에 값이 제대로 들어가 있는지 보면 된다.

 

 

 

php 테스트 일단은 문제가 없는 것으로 보인다.

728x90
반응형

'Develop > Server' 카테고리의 다른 글

vim 명령어  (0) 2025.03.01
리눅스 명령어 - ls  (0) 2025.03.01
[NHN Cloud Hosting - Linux] mysql 테스트  (0) 2025.03.01
[NHN Cloud Hosting - Linux] SSH로 서버 접속  (0) 2025.03.01
SSH와 RDP  (0) 2025.03.01

 

이번에는 mysql에 로그인하고 테스트해본다.

제품 설명

 

내가 결제한 서버의 설명을 보면 DB는 MySQL 8.0이라고 표기되어있다.

 

먼저 mysql이 잘 설치되어 있는지와 버전도 일치하는지 확인해 본다.

 

$mysql --version

 

 

문제가 없어 보이니 이제 서버 신청 시 입력했던 DB 계정으로 로그인해본다.

 

$mysql -u 'userid' -p

 

userid에 db 계정을 입력하고 엔터를 치면 패스워드를 입력하는 단계로 넘어가고 패스워드까지 문제없이 입력하고 나면 명령어 창이 mysql>로 바뀌고 mysql 명령어를 입력할 수 있는 상태로 된다.

 

테스트 용으로 데이터베이스를 하나 만들어 본다.

 

CREATE DATABASE testdb;

 

명령어를 입력하니 권한이 없다는 에러가 발생한다.

 

일단 mysql 콘솔창을 나간다. 이때 명령어 창에 quit 또는 exit을 입력하면 나올 수 있다.

 

이번엔 root 계정으로 로그인한 다음 내 계정에 권한을 주기로 한다.

GRANT ALL PRIVILEGES ON *.* TO 'userid'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

 

권한을 준 다음 즉시 변경 사항이 반영되도록 한다.

 

그리고 다시 내 계정으로 로그인 후 testdb를 생성하고 잘 생성됐는지 목록도 뽑아 본다.

 

SHOW DATABASES;

 

이번엔 해당 데이터베이스에 테이블도 만들어 본다.

 

USE testdb;
CREATE TABLE users (
	id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

 

 

 

생성된 테이블을 목록에 뽑아 본다.

 

SHOW TABLES;

 

생성한 users 테이블이 잘 보이는 게 확인된다.

 

테이블의 자세한 정보도 확인한다.

 

DESCRIBE users;

 

 

입력한 대로 잘 만들어졌다.

728x90
반응형

'Develop > Server' 카테고리의 다른 글

리눅스 명령어 - ls  (0) 2025.03.01
[NHN Cloud Hosting - Linux] php 테스트  (1) 2025.03.01
[NHN Cloud Hosting - Linux] SSH로 서버 접속  (0) 2025.03.01
SSH와 RDP  (0) 2025.03.01
NHN 리눅스 서버 개설  (0) 2025.03.01

리눅스에서도 Xrdp를 사용하면 GUI가 있는 RDP를 사용할 수 있다고 한다.

 

그럼에도 SSH를 사용하기로 한 이유는 서버 사양을 고려한 부분이 크고 다른 이유는 다양한 명령어들을 이번 기회에 공부할 수 있을 것 같아서이다.

 

PuTTY

SSH 클라이언트로 사용할 프로그램은 대표적인 PuTTY로 정했다.

 

PuTTY

 

Download PuTTY: release 0.83

0.83, released on 2025-02-08, is the latest release. You can also find it at the Latest Release page, which will update when new releases are made (and so is a better page to bookmark or link to). Release versions of PuTTY are versions we think are reasona

www.chiark.greenend.org.uk

 

PuTTY 최신 버전을 다운로드하여 설치하고 puttygen.exe 도 다운로드해 놓는다.

 

SSH로 접속할 때 서버 접속 인증키가 필요한데 NHN에서 서버를 생성할 때 만든 키 파일은. pem 확장자로 PuTTY에서는 이 파일을 그대로 사용할 수 없기 때문에. ppk로 변환하는 과정이 필요하다.

 

먼저 서버를 신청할 때 생성하고 다운해 놓은 서버 접속 인증키를 준비해 놓고 puttygen.exe를 실행시킨다.

 

puttygen.exe

 

Load 버튼을 클릭하면 탐색기가 열리는데 여기서 All Files 설정으로 모든 파일이 보이게 한 다음 내 서버 접속 인증키. pem 파일을 불러온다. 

 

불러온 후에 알림 창이 뜨는데 성공적으로 불러오게 되면 Successfully imported ~ 내용을 확인할 수 있다.

 

이제 활성화된 버튼 Save private key를 클릭하고 알아볼 수 있는 이름으로 저장한다.

 

이제 putty를 실행한 다음 서버와 연결에 필요한 정보들을 채워 넣는다.

 

Session 항목

Host Name (or IP address) : 서버 이름이나 주소

Port : 기본 22

Connection type : SSH

 

PuTTY - configration

 

 

Connection > SSH > Auth > Credential 항목에서 Private key file for authentication에 생성해 놓은. ppk 파일을 선택한다.

PuTTY - configration

 

이렇게 세팅해 놓고 다시 Session 항목으로 이동해서 현재 설정해 놓은 session 정보를 저장해 두면 나중에 다시 접속할 때 편하다.

 

PuTTY - session save

 

Saved Sessions 아래에 세션이름을 입력하고 Save 클릭하면 해당 이름으로 세션이 저장된다.

 

이제 내 서버에 SSH 연결할 준비가 끝났다.

 

Open을 눌러주면 터미널 창이 뜬다.

 

PuTTY - login as :

 

창에는 login as :라는 문구만 보이고 무언가 입력을 기다리고 있다.

 

이는 어떤 사용자 계정으로 로그인할지에 대한 입력을 기다리는 것으로 이 계정은 서버에 따라 다르기 때문에 확인을 해서 입력한다.

 

내가 사용 중인 서버는 CentOS이며 사용자 계정이름은 centos이다.

 

centos를 입력하고 엔터를 치면

 

PuTTY

 

성공적으로 서버에 접속했다.

728x90
반응형

'Develop > Server' 카테고리의 다른 글

리눅스 명령어 - ls  (0) 2025.03.01
[NHN Cloud Hosting - Linux] php 테스트  (1) 2025.03.01
[NHN Cloud Hosting - Linux] mysql 테스트  (0) 2025.03.01
SSH와 RDP  (0) 2025.03.01
NHN 리눅스 서버 개설  (0) 2025.03.01

서버가 만들어지고 가장 처음 해야 할 작업은 내 서버에 접속을 하는 것이다.

 

접속하는 방법에는 SSH와 RDP 크게 두 가지 방식이 있다.

 

RDP (Remote Dsktop Protocol)

원격 데스크톱 프로토콜 

다양한 종류의 RDP 소프트웨어들이 있는데 Microsoft에서 개발한 RDP 프로토콜을 확장하거나 개선한 형태로 제공되며 기본적으로 원격 컴퓨터의 화면을 클라이언트에게 전송하고 클라이언트의 입력을 서버로 전달한다.

 

사용자가 그래픽 환경을 원격으로 사용할 수 있도록 즉, 데스크톱 화면을 그대로 보면서 마우스와 키보드로 제어할 수 있는 방식으로 일반적으로 윈도우 환경에서 많이 사용된다. GUI를 그대로 볼 수 있기 때문에 사용이 편리하고 직관적이라 원격으로 그래픽 환경이 필요한 작업을 할 때 유용하다.

 

SSH (Sercure Shell)

보안 쉘

 

주로 터미널 기반의 명령어를 사용하여 원격 시스템에 접속하는 데 사용되며 이는 GUI가 따로 없으며 명령줄 인터페이스(CLI)만을 사용하여 서버에 접속하여 제어할 수 있다.

 

SSH는 암호화된 통신을 제공하는 프로토콜이며, 서버와 클라이언트 간에 안전한 데이터 전송을 보장한다. 이 접속 방식은 서버의 텍스트 기반 셸에 접근할 수 있으며 일반적으로 리눅스나 유닉스 시스템에서 많이 사용된다.

 

결론적으로 두 방식의 가장 큰 차이점은 GUI 유무에 있고 그 안에서 각각의 장단점이 존재하게 된다.

 

 

728x90
반응형

항상 무료 플랜만 찾아다니며 사용했는데 그러다 보니 제약도 많고 내가 원하는 것들을 써보지도 못하고 끝나는 경우가 많았다.

 

그래서 테스트나 간단하게 사용하기 위한 용도로 저렴한 서버를 찾다가 NHN에 적당한 가격을 찾게 되어 사용해 보기로 한다.

 

 

서버의 사양은 가격만큼 낮지만 간단하게 개발용으로 쓰면서 공부하기에는 부족하지 않을 것이라고 생각된다.

 

일단 큰 금액이 아니기 때문에 즉시 결제하고 바로 활용해 보기로 한다.

 

 

웹 환경은 php가 필요하기 때문에 선택한다. 그에 필요한 Apache도 함께 설치된다.

 

 

접근 포트를 미리 선택해 놓으면 기본 보안 그룹 설정이 반영된다고 하는데 리눅스 터미널은 무조건 필요하지 않을까 싶어서 선택해 주었고 FTP 포트는 쓰긴 할 것 같아서 선택했다.

 

이 부분은 나중에 보안그룹에서 변경이나 추가해서 설정이 가능하다고 하니 일단 이렇게 진행하기로 한다.

 

이후로 FTP 정보, DB 정보를 입력하고 혹시 모르니 따로 메모해 둔다.

 

 

마지막으로 키페어(서버 접속 인증 키)에 대한 안내가 나오는데 이게 있어야 서버에 SSH 연결을 할  수 있고 보안을 위해서 신청 시 잘 보관하지 않았다가 이걸 잃어버리면 서버에 연결할 수 없기 때문에 주의해야 한다.

 

기존 키페어가 없으니 적당한 이름을 넣어주고 새로 만들어 생성된 키를 다운로드하여서 잘 보관하도록 한다.

 

 

 

신청하고 나면 5분 이내로 서버가 생성되고 클라우드 호스팅 콘솔 페이지에서 서버의 ip나 사용량 등 세부적인 사항들을 확인할 수 있다.

 

윈도우 서버를 사용해 본 경험이 있긴 하지만 그건 이미 세팅이 완료된 상태에서 원격으로 접속한 것뿐이었다.

이렇게 서버를 열어본 게 처음이고 거기다 리눅스를 사용해 본 적도 없기 때문에 앞으로 서버를 사용하면서 다양하고 새로운 정보와 문제들과 마주할 것으로 생각되는데 나중에 이 정보들이 다시 필요한 상황이 왔을 때 참고가 되도록 자세하게 잘 정리해 보도록 해야겠다.

728x90
반응형

'Develop > Server' 카테고리의 다른 글

리눅스 명령어 - ls  (0) 2025.03.01
[NHN Cloud Hosting - Linux] php 테스트  (1) 2025.03.01
[NHN Cloud Hosting - Linux] mysql 테스트  (0) 2025.03.01
[NHN Cloud Hosting - Linux] SSH로 서버 접속  (0) 2025.03.01
SSH와 RDP  (0) 2025.03.01

버전 : Unity 6

 

구글 계정에 연동과정

 

Google Sign In SDK에서 ID 토큰, 액세스 토큰을 받는다.

 

Firebase Authentication으로 Google ID 토큰을 Firebase로 전달하고 이를 인증한다.

 

Google Sign In SDK는 구글 계정으로 로그인할 수 있지만 이후 로그인한 사용자를 앱의 인증 시스템에서 관리할 방법이 없다.

 

또한 Google ID 토큰을 앱에서 직접 검증하는 것은 보안상 위험하기 때문에 파이어베이스를 통해서 토큰을 검증하고 관리하여 안전하게 관리할 수 있고 파이어베이스의 다양한 기능과 연계하여 사용할 수도 있다.

 

1. 파이어베이스 인증 SDK 설치

Firebase Authentication SDK

 

Google 로그인과 Unity를 사용하여 인증하기  |  Firebase

의견 보내기 Google 로그인과 Unity를 사용하여 인증하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Google 로그인을 앱에 통합하여 사용자가 Google 계정으로

firebase.google.com

 

Firebase Authentication

 

다운로드한 압축 파일에서 FirebaseAuth.unitypackage 패키지를 프로젝트에 임포트

 

FirebaseAuth

 

2. Google-Signin-Unity

Google-SignIn-Unity

 

GitHub - googlesamples/google-signin-unity: Google Sign-In API plugin for Unity game engine. Works with Android and iOS.

Google Sign-In API plugin for Unity game engine. Works with Android and iOS. - googlesamples/google-signin-unity

github.com

 

최신버전 1.0.4 사용

 

* 프로젝트에 임포트하면 Unity.Task 관련해서 충돌 에러가 발생하는데 Assets > Parse  폴더를 지우면 해결 가능하다.

 

설치 후 패키지 문제 없는지 테스트 빌드를 진행

 

gradle 에러가 발생해서 빌드에 실패한다. 안드로이드 빌드 시 자주 발생하는 에러로 이런 경우 프로젝트 세팅의 최소 타겟 API를 올리면 해결되는 경우가 많은데 먼저 이 부분을 확인해서 다시 빌드해 본다.

 

Minimum API Level 23 -> 24로 변경 후 다시 빌드하니 해결되었다.

 

3. Key Store 생성

파이어베이스에서 인증 정보를 저장하고 관리할 프로젝트를 생성해야 하는데 이때 유니티 프로젝트의 SHA 키가 필요하다.

 

먼저 유니티에서 키스토어를 생성하고 SHA를 확인해 둔다.

 

1. 키스토어 생성

 

 

2. SHA 확인

키스토어를 열어보기 위해서는 keytool을 사용해야 하는데 유니티 에디터를 설치하면 포함되어 있기 때문에 에디터 설치 경로에서 

keytool.exe 파일이 위치한 경로에서 명령 프롬프터를 켜서 'keytool -list -keystore [키스토어 경로]' 를 실행한다.

 

 


* 구글 계정 인증에는 SHA-1 이 필요한데 Unity 6 버전의 keytool을 사용했더니 256만 뜨고 나머지 지문들은 생략된다.

   다른 에디터 버전의 keytool을 사용해서 SHA-1을 확인하고 메모해 둔다.

 

해당 키는 잠시 메모해 둔다.

 

4. 파이어베이스 프로젝트 세팅

Firebase

 

Firebase | Google's Mobile and Web App Development Platform

개발자가 사용자가 좋아할 만한 앱과 게임을 빌드하도록 지원하는 Google의 모바일 및 웹 앱 개발 플랫폼인 Firebase에 대해 알아보세요.

firebase.google.com

 

로그인 인증을 처리할 프로젝트를 생성한다.

 

 

유니티 플랫폼을 선택해서 앱을 추가한다.

 

 

여기서 디지털 지문 추가에서 키스토어의 SHA 키를 입력한다.

 

Authentication 항목으로 들어가서 로그인 제공업체를 추가한다.

 

 

Google을 선택하고 사용설정을 해준다.

 

5. 클라이언트 ID 확인

Google Cloud

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

구글 클라우드에 접속하면 파이어베이스에서 생성했던 프로젝트와 동일한 정보로 프로젝트가 생성되어 있다.

 

이 중에서 사용자 인증 정보 항목에서 OAuth 2.0 클라이언트 ID를 사용해서 유니티에서 접속을 시도한다.

 

 

6. 로그인 스크립트

유니티로 돌아가서 로그인 스크립트를 구현한다.

 

* 에러

SignIn 함수 호출 시 계정 선택 UI 팝업이 뜬 후 계정을 선택하고 나서 반응이 없는 현상이 있었는데 결과를 받아서 처리하는 콜백에서 에러가 발생했었다.

 

이때 메인스레드에서 처리되도록 Dispatcher 함수를  구현해서 처리하니 문제가 해결되긴 했는데 정확한 원인은 확인을 못한 부분이다.

 

using System.Collections.Generic;
using UnityEngine;

public class MainThreadDispatcher : MonoBehaviour
{
    private static MainThreadDispatcher instance;
    private readonly Queue<System.Action> executionQueue = new Queue<System.Action>();

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void Update()
    {
        lock (executionQueue)
        {
            while (executionQueue.Count > 0)
            {
                executionQueue.Dequeue()?.Invoke();
            }
        }
    }

    public static void RunOnMainThread(System.Action action)
    {
        if (instance != null)
        {
            lock (instance.executionQueue)
            {
                instance.executionQueue.Enqueue(action);
            }
        }
    }
}

 

 

디스패처를 사용해 SignIn 함수 결과를 처리한다.

 

using Google;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

public class GoogleLogin : MonoBehaviour
{
    private string web_client_id = "구글 클라우드의 클라이언트 ID";

    private void Awake()
    {
        Init();
    }

    private void Init()
    {
        GoogleSignIn.Configuration = new GoogleSignInConfiguration
        {
            WebClientId = web_client_id,
            UseGameSignIn = false,
            RequestEmail = true,
            RequestIdToken = true
        };
    }

    public void SignIn()
    {
        DebugMessage.Instance.ShowMessage("Calling SignIn");
        Debug.Log("Calling SignIn");
        GoogleSignIn.DefaultInstance.SignIn().ContinueWith(
          OnAuthenticationFinished);
    }

    internal void OnAuthenticationFinished(Task<GoogleSignInUser> task)
    {
        Debug.Log("Authentication finished, processing on main thread");
        MainThreadDispatcher.RunOnMainThread(() => ProcessAuthResult(task));
    }

    private void ProcessAuthResult(Task<GoogleSignInUser> task)
    {
        Debug.Log("Auth Result");
        if (task.IsFaulted)
        {
            using (IEnumerator<System.Exception> enumerator = task.Exception.InnerExceptions.GetEnumerator())
            {
                if (enumerator.MoveNext())
                {
                    GoogleSignIn.SignInException error = (GoogleSignIn.SignInException)enumerator.Current;
                    DebugMessage.Instance.ShowMessage("Got Error: " + error.Status + " " + error.Message);
                    Debug.Log("Got Error: " + error.Status + " " + error.Message);
                }
                else
                {
                    DebugMessage.Instance.ShowMessage("Got Unexpected Exception?!?" + task.Exception);
                    Debug.Log("Got Unexpected Exception?!?" + task.Exception);
                }
            }
        }
        else if (task.IsCanceled)
        {
            DebugMessage.Instance.ShowMessage("Canceled");
            Debug.Log("Canceled");
        }
        else
        {
            DebugMessage.Instance.ShowMessage("Welcome: " + task.Result.DisplayName + "!");
            DebugMessage.Instance.ShowMessage(task.Result.Email + "!");
            DebugMessage.Instance.ShowMessage(task.Result.IdToken + "!");

            Debug.Log("Welcome: " + task.Result.DisplayName + "!");
            Debug.Log(task.Result.Email + "!");
            Debug.Log(task.Result.IdToken + "!");
        }
    }
}

 

 

폰트에 한글이 지원되지 않아서 깨진 것 빼고는 로그인 성공 후 들어오는 리턴 정보를 로그로 찍은 값들이 잘 출력되는 게 확인된다.

 

 

728x90
반응형

+ Recent posts