웹 기술 - 인증

업데이트:

제반 지식

웹은 HTTP로 통신한다.

그리고 HTTP는 그 설계부터 Stateless(무상태)한 성질을 가지고 있다.
무상태라는 것은, 이전 통신이 다음의 통신에 영향을 주지 않는다는 것이다.

무상태성이란

Alice🧒: 사과 주세요
Bob🤷‍♀️: 몇개 드릴까요?
Alice🧒: 3개 주세요
Bob🤷‍♀️: 뭘 3개 달라는거죠?
Alice🧒: ???

HTTP 그 자체로는 상태를 가지지 않기 때문에, ‘사과 주세요’ 요청과 ‘3개 주세요’ 요청은 완전 별개의 요청으로 간주된다.
내 웹사이트 회원에게 개인화된 서비스를 제공하고 싶더라도, HTTP 그 자체로는 불가능하다는 것이다.

내가 누군지 알려주자

Alice🧒: 나 옆동네 사는 Alice이올시다. 사과 주세요
Bob🤷‍♀️: 몇개 드릴까요?
Alice🧒: 나 옆동네 사는 Alice이올시다. 3개 주세요
Bob🤷‍♀️: (Alice가 사과를 달라고 했었지?) 네 사과 3개요~

손님이 요청마다 자신의 주소와 이름을 이야기하기 때문에, Bob의 입장에서는 상태(이름)를 기억해두었다가 응대할 수 있다.
그리고 이 과정이 곧 인증이다.

인증

인증은 내가 누군지 신원을 증명하는 것을 말한다. (나 Alice 이올시다.)
내가 Alice인 것을 말하기 위해, 웹브라우저의 ‘Cookie’, ‘Storage’라고 부르는 저장 공간에 내 이름을 저장할 수 있다.

인증 방식

Happy?

이제 문제가 없을까? 다음 경우를 생각해보자.

Alice🧒: 나 옆동네 사는 Alice이올시다. 사과 주세요
Bob🤷‍♀️: 몇개 드릴까요?
Mallory👧: (Alice를 골탕먹여볼까?) 나 옆동네 사는 Alice이올시다. 100개 주세요
Bob🤷‍♀️: (Alice가 사과를 달라고 했었지?) 네 사과 100개요~

Mallory가 Alice의 이름을 도용해 자기 멋대로 사과를 100개 주문했다.
이처럼 타인이 알기 쉬운 정보로 ‘나’임을 인증하게 되면, 정보 보호에 취약해진다.

세션 방식

Alice🧒: 나 옆동네 사는 Alice. 별명 지어줘
Bob🤷‍♀️: 당신의 이름은 이제부터 Ace요.
Alice🧒: 난 Ace. 사과 주세요
Bob🤷‍♀️: 몇개 드릴까요?
Mallory👧: (Alice를 골탕먹여볼까?) 난 Alice. 100개 주세요
Bob🤷‍♀️: Alice가 누군데?

현대의 웹사이트들은 특별한 별명을 지어주고 이 별명으로 대화하는 ‘세션 방식’을 사용한다.

Token 방식

Token을 통한 인증 방식은 세션 방식과 다르게, 인증에 있어서 Bob에게 치매(Stateless)가 있지만, 정상적인 요청임을 인증할 수는 있어진다.

Alice🧒: 나 옆동네 사는 Alice.
Bob🤷‍♀️: Alice. 이 마패에 너만을 위한 싸인을 해줄게.
Alice🧒: (마패를 제시하며) 사과 주세요.
Bob🤷‍♀️: (네가 누군진 모르지만 내 싸인이 맞군) 몇개 드릴까요?
Alice🧒: (마패를 제시하며) 사과 3개 주세요.
Bob🤷‍♀️: (네가 누군진 모르지만 내 싸인이 맞군) 네 사과 3개요~

여기서 치매가 있다는 것은 Stateless하다는 것이고, 인증에 있어서 Database를 사용하지 않는다는 것이다.
현대의 MSA로 구성된 애플리케이션들은 Session 서버의 수평 확장때문에 세션 방식을 사용하기 어려워한다.
보통 인증을 위한 Database 없이 Token 방식을 이용해 ‘요청이 유효한지 비유효한지’ 여부를 따진다.

구현

Token 방식을 JWT로 구현해보자. 바로가기

댓글남기기