개발일지
인증(Authentication) / 인가 (Authorization) 본문
인증(Authentication)
인증은 유저의 identification(신원확인)을 확인하는 절차이다 쉽게 유저의 아이디돠 비번을 확인하는 절차이다
인증에는
서버기반 인증 & 토큰 기반 인증이 있다
서버기반 인증은
기존의 서버 기반 인증 시스템은 서버측에서 유저들의 정보를 기억하고 있어야 했습니다. 따라서 여러가지 문제점이 발생했습니다.
- 서버가 유저의 인증 기록을 세션에 저장하는데, 로그인 유저가 많아지면 서버가 과부하됩니다.
- 세션을 사용하면 분산된 시스템을 설계하고 서버를 확장하는 것이 어렵습니다.
- 세션을 관리할 때 사용되는 쿠키는 여러 도메인에서 관리하는 것이 번거롭습니다.
이런 문제점들을 해결하기 위해 토큰 기반 인증 시스템을 사용하기 시작했습니다.
토큰 기반 인증
무상태(Stateless) & 확장성(Scalability)
Stateful Server의 경우 클라이언트에게 요청을 받을 때마다 상태를 유지하고 정보를 서비스 제공에 이용됩니다. 반면 Stateless Server에서는 상태정보를 저장하지 않고, 서버는 클라이언트의 요청만으로 작업을 처리하며 세션을 사용하지 않습니다. 따라서 토큰을 사용하면 클라이언트와 서버의 연결고리가 없어 서버를 확장하기에 매우 적합한 환경을 제공합니다.
확장성(Extensibility)
서버를 확장시키는 것 뿐 아니라 로그인 정보가 사용되는 분야를 확장할 수 있습니다. 우리가 Google 계정을 이용해 Notion, Slack등을 이용하는 것처럼 토큰에 선택적인 권한을 부여해서 발급할 수 있습니다.
토큰기반 인증 시스템 순서
- 유저가 아이디와 비밀번호로 로그인을 합니다.
- 서버측에서 해당 계정 정보를 검증합니다.
- 계정 정보가 정확하다면, 서버측에서 유저에게 signed 토큰(accesstoken)을 발급해줍니다.
- 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다 해당 토큰을 함께 서버에 전달합니다.
- 서버는 토큰을 검증하고, 요청에 응답합니다.
Json Web Token
토큰 기반 인증 시스템의 구현체
JWT는 웹표준으로서 C, Java, Python, JS등 대부분의 주류 프로그래밍 언어에서 지원됩니다. 또한 필요한 모든 정보를 자체적으로 가지고 있어 **자가 수용적(Self-contained)**이며 그렇기에 두 개체 사이에서 쉽게 전달될 수 있는 장점들을 가지고 있습니다.
인가 (Authorization)
유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차이다
사용자의 인증이 필요한 경우 Client는 발급받은 JWT를 Requet Header(HTTP Header)에 실어 같이 보내줍니다. Backend는 JWT를 받고 Guard를 통해 JWT Strategy를 실행하고, Secret Key를 통해 JWT를 Decoding합니다. JWT를 복호화한 후에 원하는 API의 Business Logic이 수행된 후, Response 됩니다.
'Backend' 카테고리의 다른 글
async / await (0) | 2022.12.16 |
---|---|
REST-API vs GraphQL-API (0) | 2022.12.16 |
Login Process (0) | 2022.11.29 |
Cookie, Local Storage, Session Storage (0) | 2022.11.29 |
JWT(Json Web Token) (0) | 2022.11.29 |