Judaeng
Authentication - Token 본문
✏️Token이란?
유저 정보를 암호화한 상태로 다를 수 있는 인증 수단이다.
인증을 위해 사용되는 암호화된 문자열을 말한다.
✏️토큰을 왜 사용하게 되었나요?
과거에는 서버 기반 인증 시스템이 있었다.
이런 방식의 인증 시스템은 아직도 많이 사용되고 있다.
하지만 요즘 웹/모바일 웹 어플리케이션들이 부흥하게 되면서, 이런 방식의 인증 시스템은 문제를 보이기 시작했다.
⚡서버 기반 인증의 문제점
1. 세션
유저가 인증할 때, 서버는 이 기록을 서버에 저장을 한다.
이를 세션이라고 하는데, 대부분의 경우엔 메모리에 이를 저장하는데, 로그인 중인 유저의 수가 늘어난다면 어떻게 될까? 서버의 램이 과부하가 된다.
이를 피하기위해 세션을 데이터베이스에 시스템에 저장하는 방식도 있지만, 이 또한 유저의 수가 많으면 데이터베이스의 성능에 무리를 준다.
2. 확장성
세션을 사용하면 서버를 확장하는 것이 어렵다.
서버의 확장이란, 단순히 서버의 사양을 업그레이드하는 것이 아니라, 더 많은 트래픽을 감당하기 위하여 여러 개의 프로세스를 돌리거나, 여러 대의 서버 컴퓨터를 추가하는 것을 의미한다.
세션을 사용하면서 분산된 시스템을 설계하는 것은 불가능한 건 아니지만 과정이 매우 복잡하다.
3. CORS(Cross-Origin Resource Sharing)
웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있다.
따라서 쿠키를 여러 도메인에서 관리하는 것은 번거롭다.
✏️토큰기반 인증(Token-based Authentication) 시스템
세션 기반 인증 시스템의 문제점을 해결하기 위해 나타났다.
인증받은 사용자들에게 토큰을 발급하고, 서버에 요청을 할 때 헤더에 토큰을 함께 보내도록 하여 유효성 검사를 한다.
✏️토큰 특징
1. Stateless 서버
Stateless 서버는 상태를 유지하지 않는다.
상태 정보를 저장하지 않으면, 서버는 클라이언트 측에서 들어오는 요청만으로만 작업을 처리한다.
이렇게 상태가 없는 경우 클라이언트와 서버의 연결고리가 없기 때문에 서버의 확장성 (Scalability) 이 높아집니다.
2. 모바일 어플리케이션에 적합하다.
만약에 Android / iOS 모바일 애플리케이션을 개발한다면, 안전한 API를 만들기 위해선 쿠키 같은 인증시스템은 이상적이지 않다. (쿠키 컨테이너를 사용해야 하죠).
토큰 기반 인증을 도입한다면, 더욱 간단하게 이 번거로움을 해결 할 수 있다.
3. 인증 정보를 다른 어플리케이션으로 전달
대표적인 예제로는, OAuth 가 있습니다.
구글/페이스북/카카오/네이버 같은 소셜 계정들을 이용하여 다른 웹서비스에서도 로그인할 수 있게 할 수 있다.
4. 보안
토큰 기반 인증 시스템을 사용하여 어플리케이션의 보안을 높일 수 있다.
이 토큰 기반 인증을 사용한다고 해서 무조건 해킹의 위험에서 벗어나는 건 아니다.
1. 토큰은 항상 노출될 가능성이 있다.
2. 토큰은 노출되더라도 해석하거나 위조되기 충분히 어려워야 한다.
++추가
크로스 도메인 지원
RFC 7519의 표준화된 체계
⚡토큰기반 인증 동작 과정
1. 유저가 아이디와 비밀번호로 로그인한다.
2. 서버 측에서 해당 계정 정보를 검증한다.
3. 계정 정보가 정확하다면, 서버에서 유저에게 signed 토큰을 발급해준다.
4. 클라이언트에서 전달받은 토큰을 저장해 두고, 서버에 요청을 할 때마다, 해당 토큰을 함께 서버에 전달한다.
5. 서버는 토큰을 검증하고, 요청에 응답한다.
웹서버에서 토큰을 서버에 전달할 때에는, HTTP 요청의 헤더에 토큰 값을 포함시켜서 전달한다.
✏️토큰의 장점
1. 무상태성(Stateless)이며 확장성(Scalability)이 있다.
위에서도 나오고 있는 내용이다. 그만큼 토큰 기반 인증 시스템의 중요한 속성이다.
토큰은 클라이언트 사이드에 저장하기 때문에 완전히 stateless 하며, 서버를 확장하기에 매우 적합한 환경을 제공한다.
서버는 클라이언트에 대한 정보를 저장할 필요가 없다.
토큰을 헤더에 추가함으로써 인증 절차가 완료된다.
2. 보안성
클라이언트가 서버에 요청을 보낼 때, 더 이상 쿠키를 전달하지 않음으로 쿠키를 사용함으로 인해 발생하는 취약점이 사라진다.
하지만 토큰을 사용하는 환경에서도 취약점이 존재할 수 있다!
3. 확장성(Extensibility)
확장성(Extensibility)은 로그인 정보가 사용되는 분야를 확장하는 것을 의미한다.
토큰을 사용하여 다른 서비스에서도 권한을 공유할 수 있다. ex) GitHub, Google 계정으로 로그인 => 소셜 로그인이 가능하다.
큰 기반 시스템에서는, 토큰에 선택적인 권한만 부여하여 발급을 할 수 있습니다
(예를 들어서 로켓펀치에서 페이스북 계정으로 로그인을 했다면, 프로필 정보를 가져오는 권한은 있어도, 포스트를 작성할 수 있는 권한은 없다.)
4. 여러 플랫폼 및 도메인
서버 기반 인증 시스템의 문제점을 다룰 때 우리는 CORS에 대하여 언급했었다.
애플리케이션과 서비스의 규모가 커지면, 우리는 여러 디바이스를 호환시키고, 더 많은 종류의 서비스를 제공하게 된다.
토큰을 사용한다면, 그 어떤 디바이스에서도, 그 어떤 도메인에서도, 토큰만 유효하다면 요청이 정상적으로 처리된다.
서버 측에서 애플리케이션의 응답 부분에 다음 헤더만 포함시켜주면 된다.
Access-Control-Allow-Origin: *
이런 구조라면, assets 파일들(이미지, css, js, html 파일 등)은 모두 CDN에서 제공을 하도록 하고, 서버 측에서는 오직 API만 다루도록 하도록 설계할 수도 있다. => Payload 안에 어떤 정보에 접근 가능한지 정할 수 있다.
최근에는 Json 포맷을 이용하는 JWT(Json Web Token)을 주로 사용한다.
'Develop > Authentication' 카테고리의 다른 글
Authentication - OAuth 2.0 (0) | 2021.04.24 |
---|---|
Authentication - JWT (0) | 2021.04.24 |
Authentication - Session (0) | 2021.04.19 |
Authentication - Cookie (0) | 2021.04.18 |
HTTPS 알아보기 (0) | 2021.04.18 |