백엔드 개발 협업하시는 분께서 상태 코드를 상황에 맞게 나오도록, 예외 처리와 함께 고민해보라고 리뷰해주셔서,

우선 그 전에 상태코드에 대해 정리해 보기로 했다!

클라이언트 - 서버 구조에서 클라이언트가 서버에게 request를 보내면 서버는 이에 대해 response를 보낸다.

모든 HTTP 응답 코드는 5개로 분류할 수 있다. => Status code의 첫 번째 숫자에 따라 response class가 달라진다.

 

1️⃣ 1로 시작하는 경우 = Informational responses

: 요청을 받았으며 프로세스를 계속함

 

100 Continue 요청의 시작 부분이 받아들여졌으며 클라이언트는 계속 이어서 보내야 함
이미 요청을 완료한 경우에는 무시해도 됨
101 Switching Protocol 요청 헤더의 Update 필드 중 하나로 서버가 프로토콜을 변경함
102 Processing 서버가 요청을 수신하고 이를 처리하고 있으나 제대로 된 응답을 알려줄 수 없음

 

 

2️⃣ 2로 시작하는 경우 = Success

: 요청을 성공적으로 받았으며 인식했고 수용했음

 

200 OK 요청을 정상적으로 처리함
201 Created 성공적으로 생성에 대한 요청을 받었으며 서버가 새 리소스를 작성함 (대개 POST, PUT일 때)
202 Accepted 요청을 접수했지만 아직 처리하지 않음 (요청은 적절했음)
203 Non-Authoritative Information 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공함, 검증이 되지 않은 상태
204 No Content 서버가 요청을 성공적으로 처리했지만 제공할 컨텐츠는 없음
205 Reset Content 서버가 요청을 성공적으로 처리했지만 새로운 내용을 확인해야 함을 알려줌 (새로고침 등을 이용)
206 Partial Content 서버가 GET 요청의 일부만 성공적으로 처리함
- Content-Range와 Date 헤더를 반드시 포함
207 Multi Status 여러 개의 리소스가 여러 status code를 갖고 있는 상황에서 적절한 정보 전달
208 Already Reported DAV에서 사용

 

 

3️⃣ 3로 시작하는 경우 = Redirection

: 클라이언트의 요청에 대해 적절한 위치를 제공하거나 대안의 응답을 제공

 

300 Multiple Choice 클라이언트가 동시에 여러 응답이 가능한 요청을 보냈을 경우 클라이언트의 선택지를 반환
301 Moved Permanently 요청한 리소스의 URI가 변경됨 -> 변경된 URI에 대한 정보와 함께 응답
302 Found 요청한 리소스의 URI가 일시적으로 변경된 것이므로 원래 요청했던 URI로 요청해야 함
303 See Other 클라이언트가 요청한 작업을 하기 위해서는 다른 URI에서 얻어야 할 때 클라이언트에게 줌
304 Not Modified 이전의 요청과 비교하여 달라진 것이 없음 (캐시를 목적으로 사용됨)
305 Use Proxy proxy를 통해 요청되어야 함
306 Unused 지금은 사용하지 않는 코드 -> 추후 사용을 위해 예약되어 있음
307 Temporary Redirect 302와 동일하나 클라이언트가 보낸 HTTP 메소드도 변경하면 안됨
308 Permanent Redirect 요청한 리소스가 영구적으로 다른 URI에 위치하고 있음, 301과 동일하나 HTTP 메소드도 변경하지 말 것

 

 

4️⃣ 4로 시작하는 경우 = Client Error

: 클라이언트의 잘못된 요청

 

400 Bad Request 잘못된 문법으로 요청을 보내고 있어 서버가 이해할 수 없음
401 Unauthorized 요청을 위해 권한 인증이 필요함 (ex. 토큰이 없음)
402 Payment Required 결제 시스템을 위해 만들어졌으나 현재는 사용하지 않음
403 Forbidden 클라이언트가 요청한 컨텐츠에 대해 접근할 권리가 없음 (신원 인증은 되었지만 권한은 없음)
404 Not Found 요청한 URI를 찾을 수 없음
405 Method Not Allowed 클라이언트가 보낸 메소드가 해당 URI에서 지원하지 않음
406 Not Acceptable 클라이언트의 요청에 대해 응답할만한 컨텐츠가 없음
407 Proxy Authentication Required 401과 동일하나, proxy를 통해 인증해야 함
408 Request Timeout 요청에 응답하는 시간이 오래 걸려 요청을 끊음 (보내지 않고 끊을 때도 있음)
409 Conflict 클라이언트의 요청이 서버의 상태와 충돌이 발생할 수 있음
410 Gone 요청한 URI가 더 이상 사용되지 않고 사라졌음
411 Length Required 요청 헤더에 Content-length가 포함되어야 함
412 Precondition Failed 요청 헤더의 조건이 서버의 조건에 적절하지 않음
413 Payload Too Large request payload가 서버에서 정의한 최대 크기보다 큼
414 URI Too Long 요청된 URI가 너무 길어서 처리할 수 없음
415 Unsupported Media Type 서버가 지원하지 않는 미디어 포맷을 요청함
416 Requested Range Not Satisfiable 요청 헤더에 있는 Range 필드가 잘못됨
417 Expectation Failed 요청 헤더에 있는 Expect 필드가 적절하지 않음
418 I'm a teapot 서버는 티팟이므로 커피 내리기를 거절했음
421 Misdirected Request 요청이 응답을 생성할 수 없는 서버로 지정됨
422 Unprocessable Entity 문법 오류로 인하여 처리할 수 없음?
423 Locked 요청한 리소스는 접근하는 것이 잠겨있음
424 Failed Dependency 이전 요청이 실패했기 때문에 현재의 요청도 실패했음
425 Too Early 서버가 재생될 수 있는 요청을 처리하는 것을 원치 않음
426 Upgrade Required 현재 요청한 프로토콜에 대한 처리는 거절함,
다른 프로토콜로 업그레이드를 하면 서버가 처리해줄 수도 있음
428 Precondition Required 필수 전제 조건 헤더가 누락됨
429 Too Many Requests 클라이언트가 한정된 시간에 너무 많은 요청을 보냄
431 Request Header Fields Too Large 요청한 헤더 필드가 너무 커서 처리할 수 없음, 헤더 필드를 줄여서 다시 요청해야 함
451 Unavailable For Legal Reasons 클라이언트가 요청한 것은 정부에 의해 검열된 불법적인 리소스임

 

 

5️⃣ 5로 시작하는 경우 = Server Error

: 정상적인 클라이언트의 요청에 대해 서버의 문제로 인해 응답할 수 없음

 

500 Internal Server Error 서버의 문제로 응답할 수 없음
501 Not Implemented 서버가 지원하지 않는 새로운 메소드를 사용하여 요청함
클라이언트 요청에 대해 서버가 수행할 수 있는 기능이 없음
502 Bad Gateway 서버 위의 서버에서 오류가 발생, proxy나 gateway 등에서 응답함
503 Service Unavailable 현재 서버가 일시적으로 사용이 불가함
일반적으로 유지보수로 인해 중단되거나 과부하가 걸린 서버임
504 Gateway Timeout 서버가 다른 서버로 요청을 보냈으나 delay가 발생하여 처리가 불가능함
505 HTTP Version Not Supported 서버가 지원하지 않거나 적절하지 않은 프로토콜로 요청을 함
506 Variant Also Negotiates 서버에 내부 구성 오류가 있음
507 Insufficient Storage 서버에 내부 구성 오류가 있음
508 Loop Detected 요청을 처리하는 동안 무한 루프를 감지함
510 Not Extended 서버가 처리하기 위해서는 요청을 더 확장해야 함
511 Network Authentication Required 클라이언트가 네트워크 액세스를 얻으려면 인증이 필요함

출처는 https://hocheon.tistory.com/68 요기!

'CS > 네트워크' 카테고리의 다른 글

면접 질문 요약(1)  (0) 2024.01.01
HTTP 상태코드  (0) 2024.01.01
HTTP&HTTPS  (0) 2024.01.01
포트포워딩(2)  (0) 2023.10.22
포트포워딩(1)  (0) 2023.10.22

본격적으로 포트포워딩해보자.

예를 들어보겠다.

ssh -L 3306:localhost:3306 사용자명@원격 서버(ip)

SSH 포트 포워딩을 설정하는 것을 의미한다. 

SSH 포트 포워딩은 로컬 컴퓨터와 원격 서버 간의 특정 포트를 전달하거나 중계하는 기능을 한다. 위의 명령어에서 -L 옵션은 로컬 포트 포워딩을 설정하라는 의미이며, 3306:localhost:3306은 로컬 컴퓨터의 3306번(MySQL) 포트와 원격 서버의 localhost(원격 서버 자체)의 3306번 포트를 연결한다는 의미이다.

이 경우, 로컬 컴퓨터의 3306번 포트에 접속하는 모든 요청은 SSH 연결을 통해 원격 서버로 전달되고, 원격 서버에서 다시 localhost(자기 자신)의 3306번 포트로 전달되며, 일반적으로 이러한 방식으로 SSH 포트 포워딩을 사용하여 데이터베이스 등의 서비스에 보안 연결을 설정하거나, 네트워크 상에서 접근이 제한된 리소스에 접근하기 위해 사용한다.

위 예시에서 사용자명@ 원격 서버(ip) 는 SSH 접속할 때 사용되는 호스트 주소와 계정 정보이다.

즉 위 명령어는 로컬 컴퓨터의 3306번 포트를 통해 SSH 연결을 수립하고, 해당 연결로부터 데이터베이스 등 원격 리소스에 접근할 수 있도록 해준다.

 

따라서, 개발 자체는 SSH 서버에 접속해서 이루어져야 하지만(테스트도 마찬가지, 애초에 SSH 서버에 접속하지 않으면 실행 자체가 되지 않는다...연결 시간 초과가 뜨거나 연결 실패가 뜬다. 그게 그거다..) MySQL과 같이 로컬 서버에 있는 경우 이를 포트포워딩해서 SSH 서버에서도 로컬 서버에 있는 DB 리소스에 접근할 수 있다고 보면 된다!

 

++ ssh [사용자명]@[호스트주소]는 SSH를 사용하여 원격 서버에 접속하기 위한 명령어이다.

실제로 사용할 때는 [사용자명]과 [호스트주소]를 실제 값으로 대체해야 하며, 여기서 [사용자명]은 원격 서버에 접속할 때 사용되는 계정 이름이고, [호스트주소]는 접속하려는 원격 서버의 IP 주소나 도메인 이름이다.

예를 들어, ssh myuser@example.com와 같이 명령어를 실행하면 myuser라는 계정으로 example.com 호스트에 SSH로 접속하게 된다. 이때 myuser와 example.com은 실제로 사용하는 계정 이름과 호스트 주소로 대체되어야 한다.

SSH 명령을 실행하기 전에 해당 호스트에 SSH 서비스가 구성되어 있고, 액세스 권한이 있는지 확인해야 하며, 기본적으로 SSH 포트인 22번을 사용하지만 다른 포트 번호가 설정되어 있다면 -p [포트번호] 옵션을 추가하여 명시해야 한다. 따라서 실제 환경에서는 [사용자명]@[호스트주소], 즉 유효한 계정과 호스트 주소를 사용하여 SSH 접속을 시도해야 한다. ++

 

개발 중 테스트를 위해 개발 중인 서버에 접속하려면?

개발 중인 서버의 홈페이지에 접속하려면 일반적으로 웹 브라우저의 주소창에 해당 서버의 IP 주소 또는 도메인 이름을 입력하면 된다. 예를 들어, 개발 중인 서버의 IP 주소가 123.456.789.123이라면, 웹 브라우저의 주소창에 http://123.456.789.123을 입력하여 접속할 수 있다.

만약 개발 중인 서버에 도메인 이름이 연결되어 있다면, 해당 도메인 이름을 사용하여 접속할 수도 있습니다. 예를 들어, 개발 중인 서버의 도메인 이름이 dev.example.com이라면, 웹 브라우저의 주소창에 http://dev.example.com을 입력하여 접속할 수 있다. 생각보다 매우 간단하다.

단, 실제로 접속 가능한지 확인하기 위해서는 해당 서버가 실행 중이고 네트워크 설정 및 방화벽 등이 올바르게 구성되어 있는지 확인해야 한다. 또한, 개발 중인 서비스가 HTTPS를 사용하는 경우 https:// 프로토콜을 사용하여 보안 연결로 접속해야 할 수도 있다. 따라서 실제 환경에서는 개발 중인 서버의 IP 주소나 도메인 이름을 확인하고 이를 바탕으로 적절한 URL을 입력하여 웹 페이지에 접속해야 한다.

 

+++

SSH 터널링 명령어는 터미널 또는 명령 프롬프트에서 실행해야 합니다. 아래는 각 운영체제별로 명령어를 실행하는 방법이다.(포트포워딩을 터널링이라고도 한다)

Windows:

  1. 시작 메뉴에서 "명령 프롬프트" 또는 "PowerShell"을 검색하여 실행합니다.
  2. 명령 프롬프트 또는 PowerShell 창이 열리면, 주어진 SSH 터널링 명령어를 입력합니다.
  3. Enter 키를 눌러 명령을 실행합니다.

macOS/Linux:

  1. 애플리케이션 폴더에서 "터미널"을 찾아 실행합니다.
  2. 터미널 창이 열리면, 주어진 SSH 터널링 명령어를 입력합니다.
  3. Enter 키를 눌러 명령을 실행합니다.

위 단계를 따라 하시면 SSH 터널링이 설정되고, 로컬 포트 3306가 원격 MariaDB에 연결된다.

SSH 터널링 설정 후에 DBeaver나 다른 MySQL/MariaDB 클라이언트 등에서 로컬호스트(localhost)의 3306 포트로 연결하면 원격 MariaDB에 접근할 수 있다.

주의: 실제 IP 주소와 사용자 이름은 제공된 정보에 따라 변경되어야 한다. 또한, 해당 계정의 비밀번호도 입력해야 한다.

https://jizard.tistory.com/339 이 블로그에 가면 자세히 나와있다!

'CS > 네트워크' 카테고리의 다른 글

면접 질문 요약(1)  (0) 2024.01.01
HTTP 상태코드  (0) 2024.01.01
HTTP&HTTPS  (0) 2024.01.01
HTTP 상태 코드(HTTP Status code) 정리표  (2) 2023.10.26
포트포워딩(1)  (0) 2023.10.22

프로젝트에 합류하고 나서, 포트포워딩의 개념을 잘 몰라 DB연결부터 애를 먹었던 기억이 있다.

들어본 적은 있는데, 정작 써먹어 본 적은 없다. 근데 내가 하고 있던 게 포트포워딩이었고(ssh 접속) 이게 잘 안되서 DB접속이 되지 않았던 것이다. 이참에 확실히 포트포워딩에 대해 이해하고 넘어가려 한다.

 

DATABASE_MARIADB_URL 환경 변수 설정을 보면, 다음과 같은 형식으로 MySQL 데이터베이스에 연결하기 위한 URL이 지정되어 있었는데, 이는 일반 ip로는 접속이 안된다. 실제 서비스를 목적으로 한 프로젝트이다 보니 보안이 매우 중요하기도 하고, 웬만해선 다들 이런식으로 개발하는 것 같다. 그래서 어찌되었건 ssh로 접속을 해야만 DB에 연결이 된다.

(학교 와이파이 등으로 접속하면 보안 문제상 안 되는 경우가 많은데, 우리 학교도 그런 줄 알았으나 접속이 잘 되는거 보면 우리 학교는 예외인가 보다.. 휴 다행)

 

포트 포워딩에 대해 알아보기 전에 포트의 개념에 대해 알아보자

하나의 서버가 다양한 역할을 수행할 때, 가령 웹사이트를 전달해주는 역할, 그리고 파일을 요청하는 역할이 있다고 한다면, 클라이언트가 서버에 요청을 보냈을 때 웹사이트 요청인지 파일 요청인지 구분할 수 있는 방법이 필요하게 됩니다. 이때 사용하는 것이 포트이다.

 

포트는 숫자로 표현하게 되어 있으며 65535번까지 존재하며 아래와 같이 3종류로 표현이 된다.

  • 0번 ~ 1023번: 잘 알려진 포트 (well-known port)
  • 1024번 ~ 49151번: 등록된 포트 (registered port)
  • 49152번 ~ 65535번: 동적 포트 (dynamic port)

잘 알려진 포트 번호의 대표적 예는 다음과 같습니다.

  • 번호 프로토콜 통신 프로토콜 설명
    80 HTTP TCP 웹 서버 접속
    443 HTTPS TCP 웹 서버 접속(SSL)
    110 POP3 TCP 메일 읽기
    25 SMTP TCP 메일 서버간 메일 전송
    22 SSH TCP 컴퓨터 원격 로그인
    53 DNS UDP DNS 질의
    123 NTP TCP 시간 동기화
    20 FTP TCP 데이터 전송
    21 FTP TCP FTP 제어

 

잘 알려진 포트 번호를 본다면 파일 요청은 일반적으로 21번 포트, 그리고 http요청은 80 포트를 이용하게 된다. 따라서 이제 서버는 21번 포트로 오는 요청은 파일 요청임으로 받아들이고 80 포트로 오는 요청은 웹사이트를 요청하는 것으로 이해하게 되어 여러 가지 역할을 할 수 있게 되는 것이다. 정리하자면 포트란 컴퓨터의 Lan선은 하나인데 통신을 필요로 하는 프로그램이 다수일 때 이 다수의 프로그램을 구별할 수 있는 번호가이다.

 

라고 한다. 특히 나의 경우 SSH(Secure Shell)로 포트포워딩해서 쓰기 때문에 22번이 익숙했다.

SSH로 포트포워딩(원격 서버 접속) 하기 위해서는

ssh [사용자명]@[호스트주소]

 

실제로 해당 호스트가 SSH 서버로 구성되어 있고, 액세스 권한이 있다면 위의 명령어를 사용하여 접속할 수 있다. 만약 액세스 권한이 없거나 정확한 계정 정보가 필요하다면 관리자 또는 시스템 운영팀과 상담하여 정확한 접속 정보와 계정 정보를 확인해야 한다.(개발에 참여하는 멤버들만이 접속할 수 있는 일련의 암호 같은 느낌이라 생각하면 쉽다.)

또한, SSH 포트 번호가 기본값인 22번이 아닌 다른 포트 번호로 설정되어 있다면 -p 옵션을 사용하여 포트 번호도 지정해주어야 합니다. 예를 들면 'ssh -p 2222 호스트주소' 와 같이 명령어를 실행한다.

참고: 실제 환경에서의 도메인 및 SSH 접속 방법은 시스템 구성 및 관리자 정책에 따라 다르므로, 상황에 맞게 정확한 정보를 확인하는 것이 중요하다.

 

그렇다면 포트 포워딩이란?

포트 포워딩이란 컴퓨터 네트워크에서 패킷이 라우터나 방화벽 같은 네트워크 게이트웨이를 통과하는 동안 네트워크 주소를 변환해주는 것을 의미합니다. 쉽게 말해 외부에서 접속이 가능하도록 하는 것입니다.

 

예를들어 보겠습니다. 공유기를 설치하게 되면 공유기와 연결된 PC들은 192.168~로 시작하는 IP를 공유기로부터 부여받게 됩니다. 그리고 공유기는 ISP 업체로부터 할당받은 IP를 가지게 됩니다.

 

공유기를 기점으로 공유기 뒤에 있는 PC들은 내부 IP라고 부르고, 공유기를 외부 IP라고 부르게 됩니다. 그런데 만약 다른 영역에 있는 PC에서 내부 IP에 있는 192.168.0.20 PC에 접속하고자 하는 요청이 들어왔을 때 공유기는 어느 PC로 연결을 해주어야 할지 모르는 상태가 됩니다.

 

이러한 상황에서 공유기에게 해당 포트로 요청이 오면 192.168.0.20 PC로 연결하라는 이정표를 달아주는 것을 포트 포워딩이라고 합니다.

출처: https://ooeunz.tistory.com/104

 

무슨 말인지 이해하기 어렵다면, 본디 외부에서 접속이 불가능한(관리자나 시스템 운영자 외) 네트워크 주소를, 관리자와 시스템 운영자의 허락을 받은 사람에 한해(접속할 수 있는 스크립트를 공유받고) 접속할 수 있도록 해준다고 생각하면 이해가 쉬울 듯 하다. 

 

다음부터는 포트포워딩을 구체적으로 어떻게 하는지에 대해 적어보겠다.

'CS > 네트워크' 카테고리의 다른 글

면접 질문 요약(1)  (0) 2024.01.01
HTTP 상태코드  (0) 2024.01.01
HTTP&HTTPS  (0) 2024.01.01
HTTP 상태 코드(HTTP Status code) 정리표  (2) 2023.10.26
포트포워딩(2)  (0) 2023.10.22

+ Recent posts