HTTP Authorization header에 Bearer와 jwt 중 무엇을 사용할까?

김혜지·2020년 12월 30일
11

토큰 기반 인증을 사용하는 토이 프로젝트를 진행하면서 Authorization 헤더의 토큰 앞에 붙은 "무언가"에 "Bearer"를 사용하는가, "jwt"를 사용하는가로 의견이 나뉘었다. 의견을 낸 당사자들도 뚜렷한 이유를 알지 못해 제대로 공부하고 다시 얘기하기로 했다 ! 먼저 기본 지식(HTTP 인증, Authorization header)을 간단하게 살펴보고 본격적으로 이 문제를 파헤쳐보자.

기본 지식


HTTP 인증

HTTP는 엑세스 제어와 인증을 위한 프레임워크를 제공한다. (RFC 7235에 정의됨) 서버에서 클라이언트 요청을 challenge하고, 클라이언트가 인증 정보를 제공하는데 사용될 수 있다. challenge와 응답 과정은 다음과 같이 작동한다.

  1. Client가 Server로 인증되지 않은 request를 보낸다.
  2. Server는 Client로 적어도 하나의 challenge를 포함하는 WWW-Authenticate 응답 헤더와 함께 401(Unauthorized) 응답을 보낸다.
    • WWW-Authenticate: 인증 타입에 대한 정보를 제공하는 HTTP Header
  3. Client는 Authorization 요청 헤더에 인증 정보(credentials)를 포함하여 재요청을 보낸다. (일반적으로 사용자에게 로그인을 요청한다)
  4. Server에서 인증 정보를 확인하여 올바른 정보라면 200(OK), 아니라면 403(Forbidden) 응답을 보낸다.

"challenge" 부분을 어떻게 자연스럽게 바꿔야 할 지 모르겠다

Authorization header

HTTP Authorization request header. Server의 사용자 에이전트임을 증명하는 자격(credentials)을 포함하여, 보통 서버에서 WWW-Authenticate 응답 헤더와 함께 401(Unauthorized) 응답을 보낸 뒤 추가한다.

Syntax

Authorization: <type> <credentials>

type

인증 타입(인증 scheme라고도 불림). 보통 타입은 Basic이며 다음과 같은 타입이 있다.

type에 따라 credentials가 변경된다.

credentials

인증 정보. 만약 Basic 인증 타입이 사용되었다면, credentials는 다음과 같이 만들어진다.

  • 사용자명과 비밀번호가 콜론을 이용하여 합쳐집니다(aladdin:opensesame).
  • 그 결과에 대한 문자열을 base64 로 인코딩합니다 (YWxhZGRpbjpvcGVuc2VzYW1l).

Base64 인코딩은 암호화나 해싱을 의미하지 않기 때문에, Basic 인증 타입을 쓰는 경우 HTTPS 접속을 권장한다.

Bearer와 jwt 중 무엇을 사용할까?


우선 해당 프로젝트는 jwt 토큰을 HTTP Authorization header에 담기까지의 의사결정은 끝난 상태다. 공부를 한 번 했으니 질문을 명확하게 바꿀 수 있을 것 같다.

Authorization header의 타입에 Bearerjwt 중 무엇을 넣을 것인가?

Bearer

RFC 6750

credential에 OAuth 2.0으로부터 획득한 access token을 넣는 타입이다.
OAuth는 Client가 리소스 소유자(사용자)를 대신하여 보호된 리소스에 접근할 수 있는 방법을 제공한다. 일반적으로 access token을 발급해주고 이를 통해 리소스 서버에 대신 접근할 수 있다.

jwt

jwt라는 타입은 존재하지 않는다. jwt (json web token)에 대해 명시적으로 타입이 정해지지 않아 jwt를 타입으로 사용하는 경우가 있는 것 같다.

정리

bearer 타입의 credentials에 들어가는 bearer token은 아래와 같은 정의를 가진다.

A security token with the property that any party in possession of the token (a "bearer") can use the token in any way that any other party in possession of it can. Using a bearer token does not require a bearer to prove possession of cryptographic key material(proof-of-possession).
(토큰을 소유한 모든 당사자("보유자")가 토큰을 소유한 다른 당사자가 할 수 있는 방식으로 토큰을 사용할 수 있는 속성이 있는 보안 토큰이다. 보유자 토큰을 사용하는 경우 보유자가 암호화 키 자료(소유 증명)의 소유를 증명할 필요가 없다.)

이 정의에 따르자면, bearer token으로 jwt를 사용하는 것은 크게 문제가 되지는 않을 것 같다. 명시적으로 문서에 적혀있지는 않지만 대부분의 개발자들이 bearer token으로 jwt를 사용하는 것을 많이 봐왔다. 팀원과의 합의를 통해 결정할 사항으로 마치겠다.

Reference

Authorization
HTTP Authentication
HTTP Authentication(EN)
백엔드가 이정도는 해줘야 함 - 5. 사용자 인증 방식 결정
Best HTTP Authorization header type for JWT

profile
Developer ( Migrating from https://hyex.github.io/ )

0개의 댓글