프로젝트를 진행하면서 로컬 로그인과 소셜 로그인을 구현해보았다. 소셜로그인은 oAuth2.0 방식을 사용해 구현했으나, 서버로부터 인증키(Access_token)을 받고, 서버로 토큰을 전달하는 방식 등이 메소드로 쉽게 구현되어 있어 어렵지 않게 구현할 수 있었다.
로컬 로그인을 구현함에 있어, Bearer를 사용하는가, jwt를 사용하는가에 대한 방향을 구체화하고자 이 글을 작성한다.
HTTP는 엑세스 제어와 인증을 위한 프레임워크를 제공한다. 서버에서 클라이언트 요청을 첼린지 하고, 클라이언트가 인증 정보를 제공하는데 사용될 수 있다.
WWW-Authenticate
응답 헤더와 함께 401(Unauthorized)응답을 보낸다.WWW-Authenticate
: 인증 타입에 대한 정보를 제공하는 HTTP HeaderAuthorization
요청 헤더에 인증정보(Credentials)를 포함해 재요청을 보낸다. HTTPAuthorization
request header. Server의 사용자 에이전트임을 증명하는 자격(Credentials)을 포함해, 서버에서 WWW-Authenticate
응답 헤더와 함께 401(Unauthorized) 응답을 보낸 뒤 추가한다.
Authorization: <type> <credentials>
인증타입(인증 scheme라고도 불림). 보통 타입은 Basic이며, type에 따라 credentials가 변경된다.
인증정보. 만약 Basic 인증타입이 사용되었다면, credentials는 다음과 같이 만들어진다.
사용자가 로그인을 했을때, 서버는 그 사용자를 나타내는 특별한 값을 만들어서 전달해 권한을 부여하고, 사용자는 나중에 Authorizatin 헤더로 그 인증 데이터를 보내준다
'사용자를 나타내는 값'을 어떻게 만들어낼 지는 표준이 결정해준다 표준을 따르지 않는다면, 인증 스키마에 대한 의사결정을 진행해야 한다.
표준 상 Authorization 헤더의 값에는 RFC에 의해 표준화된 인증 스키마를 사용할 수 있게 되어 있다.
credential에 oAuth2.0으로부터 획득한 access_token을 넣는 타입이다. oAuth는 Client가 리소스 소유자(사용자)를 대신해 보호된 리소스에 접근할 수 있는 방법을 제공한다.
일반적으로 access_token을 발급해주고, 이를 통해 리소스 서버에 대신 접근할 수 있다.
jwt라는 타입은 존재하지 않는다. jwt(json web token)에 대해 명시적으로 타입이 정해지지 않아 jwt를 타입으로 사용하는 경우가 있다(고 추정)
위 Bearer 정의를 따르면, bearer token으로 jwt를 사용하는 것은 크게 문제가 되지 않는다.
보호된 리소스에 대한 접근 권한을 부여하기 위해 제시하는 유일한 작업이 토큰을 전달하는 것 이라는 관점에서 볼때 이 토큰을 bearer token이라고 부를 수 있다. 따라서 JWT를 사용하는 인증 방식도 사실상 bearer라는 문맥에서 벗어나지 않으며, 단지 bearer token을 생성하지 않기 위해 OAuth2.0 관련 사양을 사용하지 않는 것일 뿐, Authorization 헤더를 사용하고, 디지털 방식으로 서명(sign)된 토큰을 사용한다면, JWT를 사용하는 것은 큰 문제가 되지 않는다.