1. HTTP란

Hyper Text Transfer Protocol의 약자로 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜이다.

즉 HTTP는 인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약으로 80번 포트를 사용하고 있다. 따라서 HTTP 서버가 80번 포트에서 요청을 기다리고 있으며 클라이언트는 80번 포트로 요청을 보낸다.

 

애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다. HTTP는 상태를 가지고 있지 않아 stateless 프로토콜이다.

HTTP의 단점으로는 암호화가 되지 않아서 정보를 제 3자가 조회하기가 너무 쉬웠다. 그래서

HTTPS가 등장하게 되었다.

 

 

2. HTTPS란

HTTP에서 암호화가 추가된 프로토 콜이다. 433번 포트를 사용하며, 네트워크 상에서 중간에 제 3자가 정보를 볼 수 없도록 공개키 암호화를 지원하고 있다.

 

공개키 암호화 : 공개키로 암호화를 하면 개인키로만 복호화(암호를 푸는 것) 할 수 있다. -> 개인키는 나만 가지고 잇으므로, 나만 볼 수 있음

 

개인키 암호화 : 개인키로 암호화하면 공개키로만 복호화 할 수 있다. -> 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려서 신뢰성 확보

 

3. HTTPS의 동작 과정⭐

 

서버는 클라이언트가 요청을 보낼 때 암호화를 하기 위한 공개키를 생성해야되는데, 일반적으로는 인증된 기관에 공개키를 전송하여 인증서를 발급받고 있다. 

 

자세한 과정은

  1. A기업은 HTTP 기반의 애플리케이션에 HTTPS를 적용하기 위해 공개키/개인키를 발급함
  2. CA 기업에게 돈을 지불하고, 공개키를 저장하는 인증서의 발급을 요청함
  3. CA 기업은 CA 기업의 이름, 서버의 공개키, 서버의 정보 등을 기반으로 인증서르 ㄹ생성하고, CA 기업의 개인키로 암호화하여 A기업에게 이를 제공함
  4. A기업은 클라이언트에게 암호화된 인증서를 제공함
  5. 브라우저는 CA기업의 공개키를 미리 다운받아 갖고 있어, 암호화된 인증서를 복호화함
  6. 암호화된 인증서를 복호화하여 얻은 A기업의 공개키로 데이터를암호화하여 요청을 전송함

 

 

추가적인 HTTPS의 장점은

검색엔진 최적화(SEO)에 있어서도 도움을 받는다.

 

4. 결론

개인 정보와 같은 민감한 데이터를 주고 받아야 한다면 HTTPS를 이용해야 하지만, 단순한 정보 조회 등만을 처리하고 있다면 HTTP를 이용하면 된다

 


참고 : 

https://mangkyu.tistory.com/98

http://blog.wishket.com/http-vs-https-%EC%B0%A8%EC%9D%B4-%EC%95%8C%EB%A9%B4-%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%9D%98-%EB%A0%88%EB%B2%A8%EC%9D%B4-%EB%B3%B4%EC%9D%B8%EB%8B%A4/

https://velog.io/@blackb0x/HTTPHTTPS%ED%86%B5%EC%8B%A0%EA%B3%BC-%EC%86%8C%EC%BC%93%ED%86%B5%EC%8B%A0

https://jeong-pro.tistory.com/89

 

 

 

'개발합시다. > BackEnd 공부' 카테고리의 다른 글

SSH란  (0) 2021.07.08
로드밸런싱(Load Balancing)  (0) 2021.07.07
Django client ip address 얻기  (0) 2021.07.07
Django - Redis 세션 & 쿠키 & 캐시 정리  (0) 2021.07.07
Reverse Proxy & Foward Proxy의 장단점 정리  (0) 2021.07.07
def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

 

참고 : https://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django

'개발합시다. > BackEnd 공부' 카테고리의 다른 글

SSH란  (0) 2021.07.08
로드밸런싱(Load Balancing)  (0) 2021.07.07
HTTP와 HTTPS란?  (0) 2021.07.07
Django - Redis 세션 & 쿠키 & 캐시 정리  (0) 2021.07.07
Reverse Proxy & Foward Proxy의 장단점 정리  (0) 2021.07.07

1. 세션이란?

웹 브라우저와 서버가 HTTP 프로토콜을 통해서 하는 모든 커뮤니케이션은 무상태(stateless)라고 합니다. 메시지가 완벽하게 각각 독립적이라는 뜻이다.

 

그렇기에 우리는 사이트와 특정 브라우저 사이의 state를 유지시키기 위해서 세션을 사용한다. 세션은 매 브라우저마다 임의의 데이터를 저장하게 하고, 이 데이터가 브라우저에 접속할 때 마다 사이트에서 활용될 수 있도록 한다. 세션에 연결된 각각의 데이터 아이템들은 'key'에 의해 인용되고, 이는 또 다시 데이터를 찾거나 저장하는데 이용된다.

 

클라이언트 별 정보를 브라우저가 아닌 웹서버에 저장하는 것

 

웹브라우저에 저장 : cookie

웹서버에 저장 : session

 

session의 라이프 사이클은 브라우저에 의존한다. 같은 브라우저를 사용하고 있다면 링크를 통해서 다른 사이트로 이동해도 session_id는 유지가 된다. 하지만 브라우저를 닫으면 사라진다.

 

Django는 세션을 활용할때, session_id를 포함하는 쿠키를 사용해서 세션을 알아낸다.


2.설정

세션사용설정은 프로젝트 settings.py에서 아래와 같이 INSTALLED_APPS 와 MIDDLEWARE 부분에 있다.

INSTALLED_APPS = [ ... 'django.contrib.sessions', ....

MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', ....

3. 사용

세션은 request.session으로 바로 사용할 수 있다. dictionary 형식으로 key값을 넣어주면 된다.

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']

4. Session의 원리

  1. 유저가 웹사이트에 접속
  2. 웹사이트의 서버가 유저에게 session_id를 부여
  3. 저의 브라우저가 이 session_id를 cookie에 보존
  4. 통신할때마다 session_id를 웹서버에 전송
  5. session_id에 의해 웹사이트는 많은 접속 유저중 특정 유저를 인식할 수 있음

5.Cookie란

웹사이트에서는 cookie를 사용해 유저의 로그인 상태를 유지하거나 유저의 사이트 이용설정을 기억시킵니다.

 


6. 캐시(Cache)란?

리소스 파일들의 임시저장소. 같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않아도 된다. 자주 사용되는 데이터들은 빠르게 접근 가능하게 cache에 넣는다.

 

캐시 순서 : 

  1. URL이 오면, 그 페이지를 먼저 캐시에서 찾는다.
  2. 캐시에 있다. -> 캐시된 페이지를 보여준다.
  3. 캐시에 없다. -> 페이지를 가져오고 캐시에 저장하고, 보여준다.

7. 캐시 설정

pip install django-redis

Settings.py에 설정을 해준다.

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://{URL}:6379',
    },
}

아래는 캐시를 사용하는방법이다.

from django.core.cache import cache

def get_post_count():
        cache_key = 'my_blog_post_count'
        count = cache.get(cache_key, None)
        if not count:
            count = self._get_post_count()
            cache.set(cache_key, count, 60 * 60)
        return count

cache.get()을 통해 캐시에 접근하고,

cache.set()을 통해 캐시를 저장한다.

 

캐시는 Key-Value구조이다.

 

cache.set할때 마지막 인자값은 캐시의 유효기간이다. 


8. Redis

Key - Value 기반의 인-메모리 데이터 저장소입니다. 그래서 쿼리를 따로 할 필요없이 결과를 바로 가져올 수 있습니다. 디스크에 데이터를 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠르다.

 

싱글 스레드라서 한번에 하나의 명력어만 실행할 수 있다.

 

Redis의 데이터 구조

1. Strings : 단순한 키-값 매핑 구조입니다.

2. Lists : Array형식의 데이터구조입니다. List를 사용하면 처음과 끝에 데이터를 넣고 빼는 것은 속도가 빠르지만 중간에 데이터를 삽입할 때는 어려움이 있습니다.

3. Sets : 순서가 없는 Strings 데이터 집합입니다. Sets에서는 중복된 데이터는 하나로 처리하기 때문에, 중복에 대한 걱정을 할 필요가 없습니다.

4. Sorted Sets : 위의 Sets와 같은 구조이지만, Score를 통해서 순서를 정할 수 있습니다. Sorted Sets를 사용하면 Leaderboard와 같은 기능을 손쉽게 구현하실 수 있습니다.

5. Hashes : 키-값의 구조를 여러개 가진 object 타입을 저장하기 좋은 구조입니다.


참조 : 

https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Sessions

https://valuefactory.tistory.com/708

https://ryusae.tistory.com/7

https://lee-seul.github.io/django/2019/05/02/django-cache-framework.html

http://milooy.github.io/TIL/Django/django-cache.html#%E1%84%8F%E1%85%A2%E1%84%89%E1%85%B5

 

추가적인 Cache 종류

https://dingrr.com/blog/post/django-seo-%EB%8D%94-%EB%B9%A0%EB%A5%B4%EA%B2%8C-cache%EC%99%80-%EC%95%95%EC%B6%95

 

Redis 정리

https://brunch.co.kr/@jehovah/20

'개발합시다. > BackEnd 공부' 카테고리의 다른 글

SSH란  (0) 2021.07.08
로드밸런싱(Load Balancing)  (0) 2021.07.07
HTTP와 HTTPS란?  (0) 2021.07.07
Django client ip address 얻기  (0) 2021.07.07
Reverse Proxy & Foward Proxy의 장단점 정리  (0) 2021.07.07

0. 프록시란?

 

간단히 말해서 "중계 서버"입니다.

 

클라이언트와 서버간 통신을 직접하지 않고 중계 서버인 프록시 서버를 사용하여 보안, 트래픽 분산 등의 여러 장점을 가질 수 있습니다.

또한 포록시 서버는 서버로 요청된 내용을 캐시 해 놓고 동일한 요청시 바로 응답을 주도록 설정할 수도 있어서 시간과 리소스 사용을 절약할 수 있습니다.

 

1. Reverse Proxy (리버스 프록시)

1. 정보

클라이언트 (USER)가 인터넷에 데이터를 요청 -> 리버스 프로시가 요청을 받음 -> 내부 서버에 데이터를 요청하고 리버스 프록시가 데이터를 받음 -> 클라이언트에게 전달함

 

클라이언트는 내부 서버에 대한 정보를 알 필요 없이 리버스 프록시에게 요청만 함.

 

클라이언트가 요청하는 End Point가 프록시 서버의 도메인이고 실제 서버의 정보는 알 수 없음.

 

2. 장점

내부 서버에 대한 설정으로 로드 밸런싱(Load Balancing)이나 서버 확장 등에 유리함

 

서버가 감춰짐 -> 실제 서버의 정보를 알수가 없음 -> 보안 Good

 

웹서버가 해킹당해도 웹 서버 권한으로는 내부망으로 연결이 불가함

 

 

2. Foward Proxy (포워드 프록시)

1. 정보

클라이언트 (USER)가 프록시 서버에 요청을 함 -> 프록시 서버가 인터넷에 요청을 보냄 -> 인터넷이 내부 서버에 데이터를 요청하고 데이터를 받음 -> 클라이언트에게 전달함

 

클라이언트가 요청하는 End Point가 실제 서버 도메인이고 프록시는 둘 사이의 통신을 담당해줌

 

2. 장점

프록시 서버는 Cache를 사용하여 자주 사용하는 데이터는  요청을 보내지 않고 캐시에서 가져올 수 있어서 속도가 빠름

 

정해진 사이트만 연결하게 설정하는 등 웹 사용 환경을 제한 할 수 있으므로 기업 내부 환경 등에서 많이 사용

 

클라이언트가 감춰짐 -> 서버는 포워드 프록시 서버를 통해서 요청을 받아서 클라이언트의 정보를 알 수 없음

 

 

3. 정리

 

망 내에서 외부로의 서비스 이용 -> 포워드 프록시

망 밖에서 내부로의 서비스 이용 -> 리버스 프록시

 

프록시 서버를 사용하면 HTTPS의 인증서 관리를 하나의 프로시 서버가 담당하고 뒤에 동작하고 있는 서버는 HTTP로 서비스 할 수 도 있어서 인증서 관리에 용이함

 


사진 출처 : https://www.imperva.com/

참조 :

https://bcp0109.tistory.com/194

https://sb.pe.kr/7371

https://firework-ham.tistory.com/23

 

 

'개발합시다. > BackEnd 공부' 카테고리의 다른 글

SSH란  (0) 2021.07.08
로드밸런싱(Load Balancing)  (0) 2021.07.07
HTTP와 HTTPS란?  (0) 2021.07.07
Django client ip address 얻기  (0) 2021.07.07
Django - Redis 세션 & 쿠키 & 캐시 정리  (0) 2021.07.07

+ Recent posts