일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 비동기
- clean code
- load balancing
- oauth2
- JWT
- 스프링 부트
- 스프링부트
- Producer
- g1
- java
- 클린코드
- gdg
- assertj
- jvm
- spring boot
- 시큐리티
- Refactoring
- RabbitMQ
- apache
- GC
- 스프링
- Security
- tomcat
- 리팩토링
- JPA
- 권한
- Spring
- 페이징
- OAuth
- 페이스북
Archives
- Today
- Total
허원철의 개발 블로그
OAuth ...? JWT...! 본문
이번글은 OAuth 부터 JWT 까지의 전반적인 내용에 대한 간략한 글입니다.
2007년 10월
OAuth1.0
- 세션 고정 공격(Session Fixation Attack) 보안 결점 발견됨
2009년 06월
OAuth1.0a
- User, Consumer, Service Provider
ex )
User : 트위터 사용자
Consumer : 트위터 단말 어플리케이션
Service Provider : 트위터 API 서비스
- 인증프로세스 : 로그인 요청 -> 인증 서버를 통해 인증 -> 인증 토큰 전달 -> 성공
※ 인증 토큰을 가짐으로서의 장점..?
1. Consumer 가 id/pw를 가지지 않아도 됨
2. 권한 제어 가능
3. 사용자가 인증서비스에서 권한 취소도 가능
4. 패스워드 변경 시에도 인증 토큰과는 무관(계속 유효한 토큰을 가짐)
2010년 04월
OAuth2.0
(2-legged, 3-legged 등)
- OAuth1.0a 와 동일한 개념인 인증 토큰을 사용
1. 장점
① 간단해졌다.
② 여러가지 인증 방법 지원
③ 대형 서비스로의 확장성 지원
④ 불려지는 용어 변경
- Resource Owner : 사용자
- Resource Server : API 서버
- Authorization Server : 인증 서버(API 서버와 같을 수 있음)
- Client : 써드파티 어플리케이션
2. Client 종류
- 2가지로 분류됨
① Confidential Client : 인증서(인증 토큰)를 안전하게 보관할 수 있는 경우
② Public Client :인증서(인증 토큰)를 안전하게 보관할 수 없는 경우(redirect_uri 이용)
3. 인증방식
- 시나리오 x Client = 4가지 경우 존재
- But, Authorization Code Grant와 Implicit Grant 이외에는 3-legged OAuth 방법 아니기 때문에 Open API 으로 거의 사용되지 않음
① Authorization Code Grant
- 웹 서버에서 API를 호출하는 등의 시나리오에서 Confidential Client가 사용하는 방식이다. 서버사이드 코드가 필요한 인증 방식이며 인증 과정에서 client_secret 이 필요하다.
로그인시에 페이지 URL에 response_type=code 라고 넘긴다.
- 웹 서버에서 API를 호출하는 등의 시나리오에서 Confidential Client가 사용하는 방식이다. 서버사이드 코드가 필요한 인증 방식이며 인증 과정에서 client_secret 이 필요하다.
로그인시에 페이지 URL에 response_type=code 라고 넘긴다.
② Implicit Grant
- token과 scope에 대한 스펙 등은 다르지만 OAuth 1.0a과 가장 비슷한 인증방식이다. Public Client인 브라우저 기반의 어플리케이션(Javascript application)이나 모바일 어플리케이션에서 이 방식을 사용하면 된다. Client 증명서를 사용할 필요가 없으며 실제로 OAuth 2.0에서 가장 많이 사용되는 방식이다.
- token과 scope에 대한 스펙 등은 다르지만 OAuth 1.0a과 가장 비슷한 인증방식이다. Public Client인 브라우저 기반의 어플리케이션(Javascript application)이나 모바일 어플리케이션에서 이 방식을 사용하면 된다. Client 증명서를 사용할 필요가 없으며 실제로 OAuth 2.0에서 가장 많이 사용되는 방식이다.
로그인시에 페이지 URL에 response_type=token 라고 넘긴다.
★ OAuth2.0은 기본적으로 Bearer 토큰(암호화하지 않은 그냥 토큰)을 주고받는 것으로 인증을 한다. HTTPS 에 의존.
★ Refresh Token - 토큰 만료기간을 짧게 해서 노출 위험을 줄임(access token 갱신)
4. 단점
① 클라이언트 구분 어려워짐
② ssh 에 의존
③ 토큰 관리를 해야함
④ 너무 많은 방식의 인증
2015년 03월
JWT (Json Web Token)
- OAuth 는 일반적인 스트링 형태. But, JWT는 JSON Claim 기반 방식
※ Claim 기반이란?
- 사용자의 추가 정보를 토큰에 담음
1. 장점
① 작은 데이터이다.
② 권한정보를 토큰이 가지고 있어 DB를 액세스할 필요 없다.
2. 구조
- 세가지 구분을 . 으로 나눔
① Header (헤더)
② Payload (유효 탑재량)
③ Signature (서명)
- JWT : {Header}.{Payload}.{Signature}
3. Header
- ex ) {"alg" : "HS256", "typ" : "JWT"}
- Header는 일반적으로 JWT인 토큰의 유형과 HMAC SHA256 또는 RSA와 같이 사용되는 해시 알고리즘으로 구성됩니다.
- Base64Url로 인코딩 됨
4. Payload
- ex ) { "sub": "1234567890", "name": "John Doe", "admin": true }
- Claims이 들어있는 엔티티와 추가 메타 데이터
- Base64Url로 인코딩 됨
5. Signature
- 인코딩된 Header, 인코딩된 Payload, 헤더에 지정된 알고리즘의 secret을 가지고 있어야 하고 서명을 해야한다.
참고
- OAuth2.0
- JWT
'authentication' 카테고리의 다른 글
auth0 JWT 활용하기 (417) | 2017.02.12 |
---|
Comments