이번에 정리해볼 내용은 Oauth 2.0과 JWT(Json Web Token)입니다.

Spring Boot를 사용하여 구현해볼 예정입니다.

여담으로 실무에서 Oauth 2.0을 먼저 접해보았습니다.

이전 회사에서는 주로 웹 서비스만 다루는 경우가 많아서 Session, Cookie를 사용하여 인증했고

이번 회사에서 일하면서 처음으로 접하게 되면서 공부를 하게 되었습니다.

공부한지는 이미 한참이 되었으나 그동안 하드 드라이브에  Github에 업로드만하고

정리를 못한 저장된 소스를 꺼내어 간단하게 이론

먼저 1부에서 정리한 후에 2부에서 Demo를 만들어보겠습니다.

 

1.Oauth 란?

Oauth는 사용자들이 비밀번호를 제공하지 않고

다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의

접근 권한을 부여할 수 있는 공통적인 수단으로써 사용되는 접근 위임을 위한 개방형 표준입니다.

예를 들면 네이버, 카카오, 구글 아이디로 로그인 같은 서비스를 생각해보면 됩니다.

Oauth 2.0 이 널리 쓰이고 있고 1.0 버전은 웹 이외에 애플리케이션 지원이 부족한 점과 Access Token의

만료가 없는 점 등 여러 가지 단점 때문에 개선된 2.0 버전을 사용하게 됐습니다.

 

2. Oauth 2.0 구조와 흐름

명칭 설명
Resource Owner 보호 자원에 접근을 부여할수 있는 개체
ex) 서비스 이용자
Resource Server 보호 자원에 API는 제공하는 서버
예) 로그인 
Authorization Server 자원 접근 권한을 위임 및 관리 서버
Client Resource Server에 보호 자원을 요청하고 관련 서비스를
제공하는 애플리케이션 
Access Token  자원 접근에 대한 권한을 나타내는 자격 증명
Refresh Token Access Token 만료 시 이를 갱신하기 위한 용도로 사용하는 자격 증명

 

3. Oauth 2.0 승인 방식 종류

명칭 설명
Authorization Code Grant Type 권한 부여 코드 승인 타입.
리소스 접근을 위한 아이디/패스워드를 Authorization
서버에 요청하여 받은 권한 코드를 활용하여 리소스에
대한 access token을 획득하는 방식.
Implicit Grant Type 암묵적 승인.
첫번째 타입과 흐름이 비슷합니다.
인증 후 redirect url 로 직접 access token을 전달받음.
Resource Owner Password Credentials Grant Type 리소스 소유자 암호자격 증명타입.
Resource Owner가 직접 Client에 아이디/패스워드 입력하여
Authorization 서버에 인증받고 access token을 얻는 획득하는 방식.
Client Credentials Grant Type 클라이언트 자격 증명 타입
access token을 얻기 위해 정해진 인증 key(secret)으로 요청.
일반적인 사용보다는 서버간 통신에 주로 사용.

 

3.1. Authorization Code Grant Type


3.2. Implicit Grant Type


3.3. Resource Owner Password Credentials Grant Type


3.4. Client Credentials Grant Type

 

4. JWT(JSON Web Token)

JWT는 일반적으로 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가를 위해 사용하는 토큰이다. 

URL 안전한 문자로 구성되고 HTTP Header, Body, URL 등에 위치할 수 있습니다.

헤더, 페이로드, 서명 세 부분을 점(.)으로 구분하는 구조입니다.

 

4.1 Header

JWT 검증에 필요한 정보를 가진 JSON 객체를 BASE64 URL-Safe 인코딩한 문자열.

JWT를 어떻게 검증하는지에 대한 내용을 담는다.

 

4.2 Payload

Payload 속성을 Claim Set이라고 부른다. Claim Set은 JWT 대한 생성자, 생성 일자 등 클라이언트와 서버 간

주고받기로 한 값들로 구성.

속성 설명
iss 토큰을 발급한 발급자(Issuer)
sub Claim의 주제로 토큰이 갖는 문맥을 의미
aud 이 토큰을 사용할 수신자
exp 토큰 만료시간
nbf Not Before의 의미로 이 시간 이전에는 토큰을 처리하지
않아야 함을 의미
iat 토큰이 발급된 시간(Issued At)
jti JWT ID로 토큰에 대한 식별자이다.

 

4.3 Signature

점(.)을 구분자로 헤더와 페이로드를 합친 문자열을 서명한 값. 

헤더에 정의된 알고리즘 값과 비밀 키를 이용해 생성하고 Base64 URL-Safe 인코딩한다.

 

JWT는 점(.)을 구분자로 해서 Header, Payload, Signature를 합친 것이다.

간단하게 샘플 JWT을 생성해보고 싶으시다면 아래 URL의 툴을 이용해서 한번 생성해보세요.

https://jwt.io/#debugger

 

5. 마치며

간략하게 이론적인 부분을 정리해보았습니다.

가장 정확한 것은 RFC 문서이지만 다른 자료들을 참고해서 요약정리해봤습니다.

2부에서는 Spring Boot 기반으로 직접 구현해볼 예정입니다.

잘못된 내용이나 문제가 될 소지가 있는 내용이 있으면 언제든지 연락 주세요.

 

※ 참고

https://datatracker.ietf.org/doc/html/rfc6749

https://tools.ietf.org/html/rfc7519
https://tools.ietf.org/html/rfc7515
https://tools.ietf.org/html/rfc7516

https://blog.naver.com/mds_datasecurity/222182943542

https://meetup.toast.com/posts/239

+ Recent posts