토큰 기반 인증 간단 정리 Token based Authentication 기술 이야기 2018.05.02 23:10

토큰을 사용하여 인증하는 방법에 대해서 간단하게 정리해 본다. 이미 정리된 내용이 많이 있는데, 그 정보들을 바탕으로 요점정리 해 둔 것이라고 보면 된다.


토큰 vs 세션

토큰과 세션의 차이를 설명하는 글이 엄청 많은데, Client가 고유 식별자를 갖고, 그 식별자를 바탕으로 인증을 처리한다는 점에서 두 기술은 같다. 세션이 식별자에 대한 정보를 서버에 저장한다고 하지만, 결국 식별자의 일부는 client에도 저장이 되어야 한다. 보통 cookie로 저장되는데, cookie에 모든 정보를 저장하는 더 낮은 보안수준의 방식과 비교하여 세션 방식은 주요 정보가 서버에 저장된다는 의미이니 오해하지 말자.

세션은 그 식별자가 http session에 한정된다는 점에서 토큰보다 제한된 범위의 활용성을 갖는다. 세부 구현 사항에 따라서 이야기가 조금씩 달라질 수 있지만, 큰 흐름에서 세션은 기존의 웹 서비스에서 http session을 기준으로 정보를 처리하는데 사용되었고, 토큰은 고유 식별자로 토큰을 만들어서 client에게 전달하는 방향으로 진화했기에 토큰만 전달된다면 다양한 포맷(JSON, XML등)의 구분없이, 상태와 상관없이(stateless) 폭넓게 사용될 수 있다. 토큰 기반의 방식이 활발하게 확산된 이유도 모바일 생태계에 맞는 인증 방법이 필요했기 때문이다.

OAuth가 사용되기 전에는 인증방식의 표준이 없었기 때문에 기존의 기본인증인 아이디와 비밀번호를 사용하였는데, 이는 보안상 취약한 구조이다...OAuth는 이렇게 제각각인 인증방식을 표준화한 인증방식이다.OAuth 위키

그러므로, 새롭게 서비스를 계획 중이라면 당연히 토큰 기반으로 만들기를 권장한다.

JWT, OAuth

JWT(Json Web Token)과 OAuth는 RFC표준으로 등록되어 있는 토큰 기반 인증방식이다. OAuth는 이미 아주 널리 사용되고 있으며, JWT는 최근에 활발하게 이야기 거리가 되고 있는것 같은데, 장단점이 명확해서 적절한 곳에 사용되기 좋은 것 같다.

JWT의 장점이자 단점은 토큰 자체가 사용자 정보를 가지고 있다는 것이다. 어떤 정보를 갖을지 정할 수 있지만, 정보를 갖는 다는 것은 보다 효율적일 수도 있고, 보다 보안에 취약할 수도 있기 때문에 신중히 결정해야 할 것 같다. 그리고 정보를 갖게되면서, 토큰 자체가 사이즈가 매우 커지는데 이것도 부담이 만만치 않다.ㅋ

JWT를 테스트해봤다는 글은 많이 봤어도 JWT를 사용하고 있다는 사례는 많이 접하지는 못했다.

-> 구글 IoT Cloud에서 사용한다고 한다! 역시 트렌디한 구글.
Google Cloud Internet of Things Core, Using JSON Web Tokens (JWTs)

토큰 서버의 운영

토큰을 어떻게 만들지와 어디에다가 어떻게 저장해야 할까의 고민도 필요하다.

유추가 가능한 임의 스트링보다는 salting과 key stretching을 사용해서 토큰을 생성하는 것이 좋고, 개별 서버에서 암호화된 데이터를 저장하고 있는 것이 좋다. 하지만 보안이 강력할 수록 비용이 증가하므로, 상황에 맞게 적절하게 적용하는 것이 좋은데, 적당한 정도를 판단하는 것이 핵심이다!ㅋ

토큰 통안 인증과 권한 허가가 이루어지게 된다면 자연스럽게 성능 개선을 위해서 캐싱을 고려해야 한다. 거의 모든 요청에서 사용될 것이므로, 같은 사용자가 동일 시간에 집중적으로 사용하게 되며, 이런 상황에서 캐싱은 가장 먼저 고려되어야할 성능 개선 방법이다.

[node.js] Token 기반 인증

토큰 기반 인증 시스템

JWT(JSON Web Token)에 대해서...

토큰화(Tokenization) 기술이란

JWT를 구현하면서 마주치게 되는 고민들

안전한 패스워드 저장

티스토리 툴바