[Andorid] UMC Study - 6주차

Sio·2021년 11월 24일

[Android] UMC Study

목록 보기
1/5
post-thumbnail

1. OAuth란?

외부 서비스에서도 인증을 가능하게 하고 그 서비스의 API를 이용하게 해주는 것, 이것을 OAuth라고 한다.

위와 같이 구글, 페이스북 등 외부 소셜 계정 기반으로 간편하게 회원가입 및 로그인 할 수 있고 연동 된 외부 어플리케이션 기능들을 간편하게 사용할 수 있음! 이럴 때 사용되는 프로토콜이 OAuth이다.

OAuth 인증프로세스

예시 - Payco

출처: https://developers.payco.com/guide/development/start

인증 예시

authorization code 요청

GET
https://alpha-id.payco.com/oauth2.0/authorize?
    client_id={client_id}&
    redirect_uri=http://nhnent.dooray.com/auth/signin/process/payco?nextUrl=%2F&
    response_type=code&
    serviceProviderCode=DOORAY&
    termsYN=Y&
    state={random_string}

access-token 요청

POST
https://alpha-id.payco.com/oauth2.0/token

grant_type=authorization_code&
code=NyP8aIFKIS6r8tm2&
client_id={client_id}&
client_secret={client_secret}&
state={random_string}

응답예제

{
"access_token_secret" :  "32321vveerrer2fv",
"state" :  null,
"expires_in" :  "11111",
"token_type" :  "Bearer",
"access_token" :  "AAAA4NV74n+ns623iceBu343424C4cMZ0A5T5pGjwfMF5b/Yj+LyDBqK8+/jvVTIKHbzM47wFw8qUf0fTCw4+/ko+hSgAGClMLykvaDJ7/0B/OxlM99999AqkvAw4niLVho14Izga2c5IksQOjTTv5L8keM4yTplN50xzGzYJpV1vmj3NGWtPKHaJL3fLVa41hvZmxOw00edQeOYAw/vhLW7iQDuJjpTciWgmgEUd9if7EL+tqIJmE6fRSH42b4aNOX5XgiaEr6hUDisUoHG5kqOd",
"refresh_token" :  "AAAAb7F2pdU0FZuxHreJD12wefvber/LIsbLGHdW85lVuJ3OaNDguDnGx5+FZeZaIbBTDRBcaneT9WlrDNORX8eyVf5bgL6RrENn5tKhjdjQlmsXxH1wCJDUa2J2QtQOHRTxAg="
}

2. Cookie란?

클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일을 말한다.

  • 쿠키는 Key-Value 형식의 문자열이다.

Cookie & Session 기반 인증

HTTP/1.1 200
Set-Cookie: JSESSIONID=FDB5E30BF20045E8A9AAFC788383680C;
  • 서버는 클라이언트의 로그인 요청에 대한 응답을 작성할 때, 인증 정보는 서버에 저장하고 클라이언트 식별자인 JSESSIONID를 쿠키에 담는다.

  • 이후 클라이언트는 요청을 보낼 때마다, JSESSIONID 쿠키를 함께 보낸다.

  • 서버는 JSESSIONID 유효성을 판별해 클라이언트를 식별한다.

3. JWT란?

JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다. JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별한다.

  • JWT는 .을 구분자로 나누어지는 세 가지 문자열의 조합이다. 실제 디코딩된 JWT는 다음과 같은 구조를 지닌다.

Header

{
	"alg": "HS256",
    "typ": "JWT"
}
  • Header의 alg과 typ는 각각 정보를 암호화할 해싱 알고리즘 및 토큰의 타입을 지정한다.

Payload

{
	"sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
}
  • Payload는 토큰에 담을 정보를 지니고 있다.
  • 주로 클라이언트의 고유 ID 값 및 유효 기간 등이 포함되는 영역이다.
  • key-value 형식으로 이루어진 한 쌍의 정보를 Claim이라고 칭한다.

Signiture

  • Signature는 인코딩된 Header와 Payload를 더한 뒤 비밀키로 해싱하여 생성한다.
  • Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.
  • 따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다.

인증과정

  • 클라이언트 로그인 요청이 들어오면, 서버는 검증 후 클라이언트 고유 ID 등의 정보를 Payload에 담는다.
  • 암호화할 비밀키를 사용해 Access Token(JWT)을 발급한다.
  • 클라이언트는 전달받은 토큰을 저장해두고, 서버에 요청할 때 마다 토큰을 요청 헤더 Authorization에 포함시켜 함께 전달한다.
  • 서버는 토큰의 Signature를 비밀키로 복호화한 다음, 위변조 여부 및 유효 기간 등을 확인한다.
  • 유효한 토큰이라면 요청에 응답합니다.
profile
나는 시오

0개의 댓글