TIL. 인증 : Who are u? vs 인가 : Can u do that?

Kim Chioh·2021년 2월 2일
0
post-thumbnail

인증을 굳이 왜 해야 하죠?
인증에 필요한 것은?
비밀번호를 어떻게 관리해야하는가? SSL 적용해서..
암호화. 단방향 해쉬, 솔팅, 키스트레칭, 비크립트
인가는 무엇이고 왜 해야하는것일까요?
JSON Web Token(헤더, 내용, 서명)
요약.

  • 들어가며,
    안녕하세요~ 드디어 어제 저녁 9시에 논문 1차 드래프트를 끝내고 돌아와 기쁜마음에 진짜 오랜만에 1시까지 코딩도해보고 너무 기뻤습니다.. (코딩이 기쁘다니..?) 주말을 논문에 다 쏟은 그 허탈함이란..ㅋㅋㅋㅋ 예상은 했지만 타격이 너무 큽니다. 그래도 산하나 넘었으니 이제 과제하나, 시험두개, 위코드만이 남았군요. 또 이번주 계획을 잘 해봐야겠습니다.

오늘의 목차를 보시면... 인증, 인가.
뭔가 듣기만해도 벌써 지루해지는 내용이라고 생각하실 수도 있는데, 아니거든요? 재밌거든요? ..최대한 재밌게해드릴게요 !! ㅋㅋㅋ 우선 표지다시한번 보고 오실게요. 느낌 빡 오시죠? 그럼 시작하겠습니다.

1.0인증 Authentication. 무슨 말일까요?

우리가 서비스를 이용할 때 인증이 필요한 이유에 대해 명확하게 알고 계신가요? 애초에 우리는 회원가입을 하지 않아도 그 서비스를 이용 할 수 있을 테지만, 꼭 회원이여야만 제공되는 서비스를 이용하기 위해서 회원가입을 해야겠죠. 그때 다른 회원과 나를 서버가 혼동하면...? 어떻게 될까요.
페이스북, 인스타그램에 가입했는데 접속하니까 서버가 비슷한 사람의 정보를 보내 그사람의 사진만 보인다면?;;;; 어이없겠죠. 그래서 필요한게 인.증.입니다. 인증은 회원가입과 로그인을 하는 과정을 말합니다.

1.1. 인증에 필요한 것?

인증에 필요한 것은 그럼 당연히 나를 구분할 수 있는 id 같은 정보겠죠? 중복확인이 그래서 필요한겁니다. id, email, 비밀번호같은 정보들이 나를 구분할 수 있는 것들이겠죠.

여기서 하나 더, id 나 email같은 정보들은 다른 사람들에게 알려줘도 큰 문제가 되지않죠? 근데 비밀번호는 어떨까요. 남에게 막 알려주시고 그러나요? 그러지마세요. 제발.

1.1.1. 비밀번호는 소중합니다.

왜냐하면 이메일이나 아이디는 널리 알려져있고(ex. 글쓰거나, 통신할때, 친구찾기할때 쉽게 서로 공유하죠) 근데, 비밀번호는 회원의 개인정보까지 접근할 수 있는 열쇠이기 때문이죠. 그래서 데이터베이스에 저장하는데 꽤 복잡한 과정을 거쳐서 보안처리를 꼭! 해줘야합니다. 이때 적용되는 개념이 SSL적용한 통신, 해싱, 키스트레칭 이런 작업들이죠. 결과적으로 해커들이 비밀번호를 가져가기 어렵게 만드는 작업니다. 조금 디테일하게 들어가 볼까요?

1.1.2. SSL, Hashing, Key stretching

SSL: SSL은 제가 다루었던 HTTP프로토콜 중 하나로, 웹서버와 브라우저 사이에 보안, 인증을 위해 만들어졌어요. (일반적으로 https://가 사용됩니다)

순서를 간단히 볼게요.
출처는 https://wiki.kldp.org/HOWTO/html/SSL-Certificates-HOWTO/x70.html#:~:text=SSL(Secure%20Socket%20Layer)%20%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C,%EC%9D%B8%EC%A6%9D%EC%9D%84%20%ED%95%98%EB%8A%94%EB%8D%B0%20%EC%82%AC%EC%9A%A9%EB%90%9C%EB%8B%A4.
여기입니다.

  1. [웹브라우저] SSL로 암호화된 페이지를 요청하게 된다. (일반적으로 https://가 사용된다)

  2. [웹서버] Public Key를 인증서와 함께 전송한다.

  3. [웹브라우저] 인증서가 자신이 신용있다고 판단한 CA(일반적으로 trusted root CA라고 불림)로부터 서명된 것인지 확인한다. (역주:Internet Explorer나 Netscape와 같은 웹브라우저에는 이미 Verisign, Thawte와 같은 널리 알려진 root CA의 인증서가 설치되어 있다) 또한 날짜가 유효한지, 그리고 인증서가 접속하려는 사이트와 관련되어 있는지 확인한다.

  4. [웹브라우저] Public Key를 사용해서 랜덤 대칭 암호화키(Random symmetric encryption key)를 비릇한 URL, http 데이터들을 암호화해서 전송한다.

  5. [웹서버] Private Key를 이용해서 랜덤 대칭 암호화키와 URL, http 데이터를 복호화한다.

  6. [웹서버] 요청받은 URL에 대한 응답을 웹브라우저로부터 받은 랜덤 대칭 암호화키를 이용하여 암호화해서 브라우저로 전송한다.

  7. [웹브라우저] 대칭 키를 이용해서 http 데이터와 html문서를 복호화하고, 화면에 정보를 뿌려준다.


1.2. 해싱

해싱은 간단히 말해 어떠한 함수를 돌려 비밀번호를 알아보기 힘들게 만드는 과정이에요. 인증에서 어떻게 보면 가장 중요하고, 보안을 철저히 하는 수단 중에 하나라고 볼 수 있죠.

1.2.3.단방향 해싱 vs 양방향 해싱:

둘의 차이를 헷갈려 할 수 있는데, 기준은 딱 하나입니다. 복호화(해싱을 되돌리는 것)을 할 필요성의 유무! 입니다.
예를 들어볼게요. 비밀번호를 백엔드 개발자가 해싱을 해서 저장을 했을때, 비밀번호를 일일이 확인할 수 있어야 할까요? 필요없겠죠. 그럴땐 단방향 해싱을합니다.(복호화 사실상 어려움).
이와다르게 양방향 해싱은 중요한 정보 + 다시 불러올 가능성들이 잦을때 사용합니다. 예를 들면, 병원에서 의료보험 가입 유무를 조회한달지, 쿠팡같은 사이트에서 카드번호를 저장해 빠른 결제를 유도한다고 할때 사용한다고 볼 수 있습니다.

레이보우테이블: 해싱

salting: 해시값이 노출이 잘되는 것을 방지하기위해 소금(랜덤데이터)을 치는겁니다. 소금을 쳐서 섞으면 알아보기어렵죠.

Keystretching: 솔팅을 여러번 반복해서 다시 해싱하는 작업을 말합니다. 더 알아보기 어렵겠죠?

bcrypt : 앞에 정리한 개념들을 실제로 구현해놓은 라이브러리입니다. 갖다 쓰면 아주 편하겠죠~?

어떠셨나요, 인증. 할만하죠? 핵심개념은 인증이 무엇이고, 비밀번호는 어떻게 저장하고, ssl, hashing, 단방향 양방향 등이 있었습니다.


2.0. 인가

인가는 어떤 권한에 접속할 수 있는 사용자가 맞는지 확인해주는 과정을 인가(가능할 가)라고 합니다.

2.1. 인가란 왜 필요한가?

우선 개념적으로 먼저 볼게요.

인증이랑 다르게 인가는 사용자가 어디까지 권한을 가졌는지를 판별해줍니다. 예를들면 서버에 사용자가 접속할 수없고, 자신의 개인정보에는 갈 수 있지만 다른 회원의 정보는 열람할 수 없겠죠.

다음으로 테크니컬한 측면을 보겠습니다.

HTTP제 블로깅을 보셨다면 HTTP의 속성에대해 기억하실거에요.
1. request & response의 구조를 갖고 있죠.
2. Stateless 합니다.

이 중 Stateless, 한번 소통이 끝나면 그 정보를 저장하고있지 않기때문에 (로그인 정보를 저장하지 않은 상태) 로그인을 하고 싶으면 항.상. 인가를 받아야합니다. 로그인상태유지는 별개의 내용입니다;; 사실 잘 몰라요..

2.2. 인가 과정.

여튼 그래서 로그인을 했으면 어떻게 확인을 할 수 있을까요? (힌트 HTTP.)

바로 headers에 메타데이터를 보내서 확인합니다.
예를들어 요청1 : 네이버 로그인 - 응답1 : 로그인 200 ok & 토큰발행

이 메타정보를 바로 JWT(Jason Web Token)이라고 합니다.

2.2.1. JSON Web Token

우선 토큰이란, 동전거지만 실제로는 권한을 주는 어떤 증표같은거에요. 이것만 있으면 너 로그인 가능해. 라는 뜻으로 쓰이겠죠.

Json web token은 아래와 같은 형식을 띄는데, a는 헤더, b는 내용(payload), c는 서명입니다.

aaaaa.bbbbb.ccccc

중요한 내용은 당연히 c 서명(signature)이겠죠. 프론트에서 JWT를 보내, 백엔드에서 서명부분을 복호화해서 서로 맞는지 확인하는 과정을 가져요.

요약하며: 인증, 단방향 해쉬, 솔팅, 키스트레칭, 비크립트, 인가, JWP를 쭉 머리속으로 그려가며 한번에 말할 수 있는 연습을 하길 바래요. 저도 한번 해볼게요.

우선 인증은 아이디, 이메일, 비밀번호 등의 나를 확실히 구분 가능한 값으로 회원가입을 하는 과정을 말합니다. 이때 비밀번호는 보안을 철저히 해야하기때문에 해쉬라는 과정이 필요한데 특정 함수값을 이용해 비밀번호를 알아보기 힘들게 만드는 과정을말해요. 이 과정은 다시 되돌릴 이유의 유무에 따라 양방향, 단방향으로 진행합니다. 또한 솔팅&키스트레칭등의 테크닉으로 해싱을 더 복잡하게 만들어 보안을 강화할 수 있어요. bcrypt는 이러한 과정을 모아놓은 라이브러리 이니 갖다 쓰세요. 다음으로 인가는 로그인을 확인해주는 과정인데 이때 JSON web 토큰! 이라는 것을 발행하여 프론트에서 전송한 JWT 서명(뒷부분)을 백엔드에서 복호화하여 맞는지 확인합니다!

profile
Just do what to do

0개의 댓글