[네트워크] 인증/인가 (1)

EMMA·2022년 3월 21일
0
post-thumbnail

📍 http - 인증/인가에 대하여 쫌 더 파보기


지난번 [http에 대하여] 글을 포스팅하면서 개인키/공개키, 관련 알고리즘 및 SSL에 대해서 간단히 정리했었다.
마침 오늘 오전 인증/인가 관련 세션이 진행되어 이어서 내용 정리해본다.


1
만약 마켓컬리에서 쇼핑하려면 먼저 회원가입을 해야 한다.

그러면 나의 account는 마켓컬리 database에 저장된다.
로그인을 하면, 나는 상품을 구매할 수 있다.
내 비밀번호는 중요한 개인정보이기 때문에 서버는 그대로 저장하지 않고 암호화 작업을 거친 후 저장한다. 이 때 hash 함수가 사용된다.

  • hash 함수를 통해 digest가 생성됨 (단방향성임)
    • 원본 메세지를 알면 digest는 알 수 있음
    • 하지만 digest를 알아도 원본 메세지는 알 수 없음
  • 하지만 hash 함수도 결국 digest 데이터를 만들기 때문에, 안전하지 않음. 그래서 추가로 하는 작업이 saltingkey stretching
    • salting : 추가 랜덤 데이터를 생성해서 해쉬에 더하는 작업
    • key stretching : 생성된 digest에 hash작업을 추가로 하여 원본 데이터를 얻기 어렵게 만드는 작업 (공격자가 rainbow table을 만드는 것을 어렵게 함


이렇게 해서 최종 hash 값을 얻으면, 이를 최종적으로 database에 저장한다. 이렇듯 서버는 hash값을 통해 사용자를 식별할 수 있다. 이것이 Authentication(인증) 이다.

2
http는 stateless 상태를 유지하기 때문에, 내가 한번 로그인을 했어도 http는 이를 계속 기억하지 못한다. 그런데 우리는 로그인을 새로 하지는 않는다.
이 때 사용되는 개념이 access token이며, 이를 발행하는 여러 가지 기술 중에 하나가 JWT(JSON Web Token) 이다.

내가 마켓컬리에 회원 가입을 하고, 로그인을 했다고 가정하자.
이 때 서버는 로그인에 성공했다고 알려주면서 access token을 준다.

그러면 나는 이제부터 이 token을 가지고 서버에 request(API 호출)를 하며, 서버는 이 token을 복호화해 내 정보를 확인하고 접근 허용을 해주는 것이다.

#나의 token을 복호화하면, id가 1번으로 등록되어 있는 user임을 확인함  
{
    user_id = 1 
}

나는 권한이 있음이 확인되었으므로, 처리 되었다는 response를 받는다. 권한이 없을 경우, 서버는 401 등의 에러를 반환한다. 이것이 Authorization(인가) 과정이다.
이러한 인증/인가 작업들을 django에서는 bcrypt 라는 라이브러리를 사용해 해결할 수 있다.

(220322 update) JWT는 아래와 같이 구성된다 - header/payload/signature

header에는 hash/token의 타입 및 hash 알고리즘 정보가,
payload에는 토큰 대상자,발급자,만료 시간 등의 정보가,
(payload 내용 조차도 인코딩만 하기 때문에 노출되면 안되는 정보들은 절대 넣지 않는다)
signature에는 서버에서 제공해준 개인키가 들어간다. 그래서 이 부분은 오직 서버만 복호화할 수 있다. (Django에서는 SECRET_KEY)

(220322 update)
payload란, 전송되는 데이터를 말하는데 정확히는 header/meta data는 제외한 데이터를 말한다.

{
    "status":"OK",
    "data": {
      	#payload는 아래 메세지라고 할 수 있다. 
        "message":"Hello, world!"
    }
}

마지막으로 SSL은 이러한 클라이언트-서버 간의 통신을 잘 볼 수 없도록 세션 계층을 다시 한번 감싸주는 역할을 하는 것이다.
(SSL 인증서는 CA로부터 받아야 한다!)


참고 사이트
: https://pypi.org/project/PyJWT/, pyjwt 공식문서
:https://ko.wikipedia.org/wiki/%ED%8E%98%EC%9D%B4%EB%A1%9C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
: https://bcp0109.tistory.com/321

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글