적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

컴퓨터시스템

사용자 인증 방식 - OAuth, JSON Web Token(JWT)

hongssup_ 2021. 12. 31. 14:31
반응형

HTTP 인증 

사용자 인증 Authorization : 하나의 세션 동안 사용자의 신원을 확인하여 인증하는 것. 

사용자 인증 방식

- 기본 인증 (ID/PW)

- 토큰 인증 (OAuth, JWT)

- 전자 서명

 

로그인은 사용자 인증의 한 방식일 뿐. 

단순히 http 헤더에 사용자 계정정보(Id/pw)를 넣어 서버에서 식별하게 되면 제 3자에 의해 탈취당했을 때 개인정보가 드러나기 때문에 보안에 좋지 않은 방식이라 할 수 있다. 

기본 인증 방식은 보안에 매우 취약한 구조이기 때문에 OAuth JWT 같은 다른 대안들이 떠오르고 있다. 

 

쿠키와 세션

로그인 과정에서만 계정 정보를 서버에 직접 보내고, 그 후로는 세션과 쿠키를 활용하여 인증하는 방식. 

HTTPS는 Stateless, Connectionless라는 상태 및 접속 정보를 유지하지 않는다는 특징이 있다.

따라서 서버에서 클라이언트를 식별하고 사용자 인증을 유지할 수 있는 기능이 필요했다. 

그래서 클라이언트가 로그인 등으로 한 번 사용자 인증을 하면, 그 인증을 유지할 수 있도록 쿠키와 세션이라는 기술을  사용해왔다.

하지만 쿠키는 브라우저에 사용자 정보가 기록되기 때문에 위변조의 가능성이 높아 보안에 취약하며, 

세션 또한 서버의 메모리를 차지하고 있기 때문에 동시접속자가 많은 웹사이트일 경우 서버 과부하의 원인이 되며, 또한 세션 정보가 중간에 탈취 당할 수 있기 때문에 보안에 완벽하다고 할 수 없다.

 

=> 이러한 쿠키와 세션의 문제점들을 보완하기 위해 토큰 기반의 인증 방식이 도입되었다. 

토큰 기반 인증 방식의 핵심은 보호할 데이터를 토큰으로 치환하여 원본 데이터 대신 토큰을 사용하는 기술. 

만약 토큰 전송 과정에서 중간에 토큰이 탈최당하더라도 데이터에 대한 정보가 암호화 되어있어 공격자가 본래 내용을 알 수 없게됨.

보안적으로 우수하다고 할 수 있다.  

 

OAuth 란?

서비스마다 제각각인 인증방식을 표준화한 토큰 기반의 사용자 인증방식이라 할 수 있다. (접근 권한을 부여하기 위한 개방형 표준)

구글, 페이스북으로부터 토큰을 발급 받아 구글, 페이스북에 로그인 할 수 있도록 권한을 부여 받는

페이스북으로 가입하기, 구글 계정으로 회원가입하기 등의 방식으로

한 어플리케이션에서 사용자 인증을 하기 위해 다른 어플리케이션의 사용자 인증방식을 하도록 인가하는 것.

사용자들이 타사 어플리케이션이나 웹사이트의 계정에 관한 정보를 공유할 수 있게 허용하는 것.  

즉, OAuth는 사용자 인증 프로토콜이 아닌, 인가 프로토콜이다.

구글, 페이스북으로부터 토큰을 발급 받아 구글, 페이스북에 로그인 할 수 있도록 권한을 부여 받는 것. 

여기서 권한이란 로그인 뿐 아니라 API 호출하는 권한도 의미

그런데 여기서 발급받은 토큰은 아무 의미 없는 문자열 형태

때문에 구글, 페이스북 서버에서는 토큰과 연관된 정보를 탐색 후 어떤 기능을 수행하게 됨. 

이와달리 JWT는 서버의 탐색이 필요 없음. 

 

JSON Web Token (JWT) 이란?

JSON 포맷으로 사용자에 대한 속성을 저장하는 토큰 기반의 인증 방식.

인증에 필요한 정보들을 토큰으로 만든 것.

주로 사용자 인증이나 정보 전달에 사용. 

: 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미. 

헤더, 페이로드, 서명 으로 구성

사용자 정보를 JSON 객체에 담아 이를 암호화하고 해싱 작업을 거쳐 문자열 토큰을 생성하는 기술. 

클라이언트는 이 토큰을 HTTP Header에 추가하여 요청을 보냄으로써 사용자 인증을 얻게 됨. 

JWT는 서버에 저장되지 않기 때문에 서버 부하를 일으키지 않으며, 해싱을 통해 데이터의 무결성을 보장하는 인증방식. 

(토큰에 사용자 정보와 권한을 명시)

JSON으로 된 Token을 사용하는 토큰 기반의 사용자 인증 방식

OAuth와 다른 점은 JWT는 토큰 자체가 의미를 갖는 Claim 기반의 토큰 방식이라는 것.

Claim(권한)은 사용자에 대한 프로퍼티나 속성을 의미.

토큰 자체를 정보로 이용하는 self-contained 자가 수용적 방식

자체적으로 정보를 갖고 있는 토큰이기 때문에 서버에 저장될 필요가 없어 서버의 부담을 덜어줄 수 있다는 장점

발급 후 검증만 하면 되기 때문에 추가 저장소가 필요 없음.

 

Token 생성 및 요청 프로세스

- JSON 객체에 요구사항을 작성

- 어떠한 암호화 방식을 사용하여 문자열로 인코딩

- HTTP header에 추가함으로써 사용자 인증을 요청

- 서버에서는 header에 추가된 Token을 디코딩하여 사용자를 인증. 

 

특징

정보가 담긴 데이터(JSON 객체)를 암호화하여, HTTP 헤더에 추가 시킨다는 것. - 보안성 증가

권한을 부여하기 위해 필요한 데이터가 JWT 안에 모두 담겨있다. - OAuth처럼 인증 서버에서 토큰에 대한 정보를 찾을 필요 없음

but JWT가 보안에 완벽한 것은 아님.

누군가 토큰을 탈취하면 그 토큰을 이용하여 권한을 수행할 수 있음. 

그래서 토큰을 서버에 저장하는 것이 아니기 때문에 토큰에 유효시간을 설정해야 하며, 탈취될 가능성을 줄이기 위해 유효시간을 짧게 해주는 것이 좋음. 

 

JWT의 데이터 무결성 - HMAC 

JWT는 토큰이 탈취 당하더라도 위변조의 위험을 벗어날 수 있도록 무결성을 보장하는 몇가지 방법이 있다.

그 중 하나는 데이터를 암호화하고, 해싱하는 HMAC(Hash-based Message Authentication) 기법을 사용하는 것

중간에 데이터가 조작되어도 서버에서 이를 알아차릴 수 있다. 

 

JWT 사용하는 이유?

사용자의 정보 상태를 client에 유지 시킨다.

많은 웹 서비스들은 사용자 인증을 구현하기 위해 쿠키와 세션을 이용해왔음. 

하지만 쿠키와 세션에는 여러 문제들이 있어서, 최근에는 OAuth와 JWT 같은 토큰 기반의 인증방식이 주로 사용되고 있음.

 

server에 요청했을 때 검증을 하기 때문에? 매번 로그인을 하지 않아도 됨. 

 

 

 

ㄸㄱㅋ 프로젝트에서 로그인 시 보내는 fcm token에 대해 확인을 하다가

JWT token 이라는 것을 발견했다. 

해당 토큰을 이용하여 사용자를 판별하는 API Header Token 이라는데

마침 또 새로 들어가는 ㄴㅈㅇ 프로젝트에서 서버 개발자들에게 API, push에 jwt 인증 방식을 적용해서 개발을 요청하는 것을 보고

도대체 이 jwt가 무엇일까 궁금해서 간략하게 찾아보았다. 

 

 

 

 

참고 : 똑똑한개발자 - JWT란 무엇인가, JSON 웹 토큰 네이버 블로그, JWT로 사용자 인증하기, 사용자 인증 방식들,

728x90
반응형

'컴퓨터시스템' 카테고리의 다른 글

네트워크 기초  (0) 2022.01.06
[네트워크] 네트워크 패킷 분석 및 Wireshark 설치 (mac)  (0) 2022.01.06
low-level / high-level 프로그래밍 언어  (0) 2021.11.22
CRUD  (0) 2021.05.21
SDK? API?  (0) 2021.04.28