yoon-chaejin / learn-spring-security

Spring Security, OAuth 2.0 을 학습하고, 이를 기반으로 회원/인증/인가를 처리하는 모듈 학습
0 stars 0 forks source link

Goal 2. OAuth 2.0 을 구성하는 각각의 요소가 무엇인지 #2

Open yoon-chaejin opened 1 year ago

yoon-chaejin commented 1 year ago
yoon-chaejin commented 1 year ago

Role (역할)

규모에 따라 Resource Server 와 Authorization Server 를 한 곳에서 처리하는 경우가 있을 수 있음

yoon-chaejin commented 1 year ago

인가 방식 (Authorization Grant Type)

yoon-chaejin commented 1 year ago

Authorization Code 방식으로 Web Server Apps 에서 사용 시 작업 순서

  1. ClientAuthorization Server에 등록
    • Authorization Server 에서 인가 후 되돌아갈 Client 의 URL을 Redirect URL 로 등록
    • 등록하면 Client ID 와 Secret 이 발급됨
  2. Resource OwnerClient에서 어떤 작업을 하던 중, ClientResource Server의 Resource 를 필요로 하는 상황이 발생
  3. ClientResource OwnerAuthorization Server 쪽으로 Redirect 시키고, Authorization ServerResource Owner에게 승인할지 여부를 물어봄 (Authorization Prompt)
    • Client 는 Redirect 하면서 response_type, client_id, redirect_uri, scope, state 를 보냄
    • response_type : code 로 기입. Authorization code 방식으로 요청함을 명시 client_id : client application 을 식별할 수 있도록 redirect_uri : 인가 후 Authorization Server 가 사용자를 redirect 할 Client 의 URI scope : 접근하고자 하는 자원의 범위 state : client 쪽에서 확인해야 하는 데이터
  4. Resource Owner가 승인하면, Authorization Server는 1단계에서 등록한 Callback URL 에 인증 방식에 맞춰 필요한 정보를 전달
    • code : Authorization Code 방식에서 해당 인가코드값 state : 앞서 전달 받은 state 값
  5. ClientResource Owner를 통해 Authorization Server 으로부터 전달받은 정보를 가지고 Authorization Server 으로부터 Access Token 을 발급받음
    • Authorization Server 로 요청 grant_type : authorization_code code : 전달받은 인가 코드값 redirect_uri : 앞서 주고받은 redirect_uri 와 동일 client_id : Application 등록 시 받은 ID client_secret : Application 등록 시 받은 Secret
    • Authorization Server에서 access_token 과 유효기간을 반환
  6. Client는 발급받은 Access Token 을 가지고 Resource Server 로 데이터 요청

cf. 만약 발급받은 Access Token 이 만료된 경우, Client는 Refresh Token 을 가지고 Authorization Server로부터 다시 Access Token 을 발급받을 수 있음 (5단계를 다시 진행한 것)

yoon-chaejin commented 1 year ago

Authorization Code 방식으로 Single-Page Apps 에서 사용 시 작업 순서 cf. Single-Page App 은 브라우저에서만 동작하는 어플리케이션으로, 정보 탈취의 위험이 있기 때문에 기존 프로세스와 동일하나 client secret 을 사용하지 않고, 인가코드와 추가적으로 PKCE 등을 사용함

  1. ClientAuthorization Server에 등록
    • Authorization Server 에서 인가 후 되돌아갈 Client 의 URL을 Redirect URL 로 등록
    • 등록하면 Client ID 와 Secret 이 발급됨
  2. Resource OwnerClient에서 어떤 작업을 하던 중, ClientResource Server의 Resource 를 필요로 하는 상황이 발생
  3. ClientResource OwnerAuthorization Server 쪽으로 Redirect 시키고, Authorization ServerResource Owner에게 승인할지 여부를 물어봄 (Authorization Prompt)
    • Client 는 Redirect 하면서 response_type, client_id, redirect_uri, scope, state 를 전달함
    • 추가적으로 code_challenge, code_challenge_method 를 전달 code verifier : 무작위 문자열 (43~128 개의 문자 사이) code_challenge : code_verifier 를 base64 SHA256 인코딩한 결과 code_challenge_method : S256, 인코딩 시 사용한 해시 함수를 의미
  4. Resource Owner가 승인하면, Authorization Server는 1단계에서 등록한 Callback URL 에 인증 방식에 맞춰 필요한 정보를 전달
    • code : Authorization Code 방식에서 해당 인가코드값 state : 앞서 전달 받은 state 값
  5. ClientResource Owner를 통해 Authorization Server 으로부터 전달받은 정보를 가지고 Authorization Server 으로부터 Access Token 을 발급받음
    • Authorization Server 로 요청 grant_type : authorization_code code : 전달받은 인가 코드값 redirect_uri : 앞서 주고받은 redirect_uri 와 동일 client_id : Application 등록 시 받은 ID code_verifier : client_secret을 대신하여 처음에 생성한 무작위 문자열
    • Authorization Server는 code_verifier를 code_challenge_method로 해시한 다음 code_challenge 와 비교하여 일치하는 경우에만 access_token 과 유효기간을 반환
  6. Client는 발급받은 Access Token 을 가지고 Resource Server 로 데이터 요청

cf. 인가코드를 탈취하더라도 code_verifier 가 없이는 access_token을 발급받지 못함

yoon-chaejin commented 1 year ago

Authorization Code 방식으로 Mobile App 에서 사용 시 작업 순서

  1. ClientAuthorization Server에 등록
    • Authorization Server 에서 인가 후 되돌아갈 Client 의 URL을 Redirect URL 로 등록
    • 등록하면 Client ID 와 Secret 이 발급됨
  2. Resource OwnerClient에서 어떤 작업을 하던 중, ClientResource Server의 Resource 를 필요로 하는 상황이 발생
  3. ClientResource OwnerAuthorization Server 쪽으로 Redirect 시키고, Authorization ServerResource Owner에게 승인할지 여부를 물어봄 (Authorization Prompt)
    • 인가 기능은 native app 또는 mobile web page 로 이동 이 때, native app 은 별도의 URI 스키마를 등록해서 해당 protocol이 호출되면 특정 앱이 실행되도록 할 수 있음 (ex. 페이스북 - fbauth2://)
    • Client 는 Redirect 하면서 response_type, client_id, redirect_uri, scope, state 를 전달함 redirect_uri 는 인가 후 앱이 실행될 수 있도록 별도의 스키마로 등록
    • 추가적으로 code_challenge, code_challenge_method 를 전달 code verifier : 무작위 문자열 (43~128 개의 문자 사이) code_challenge : code_verifier 를 base64 SHA256 인코딩한 결과 code_challenge_method : S256, 인코딩 시 사용한 해시 함수를 의미
  4. Resource Owner가 승인하면, Authorization Server는 1단계에서 등록한 Callback URL 에 인증 방식에 맞춰 필요한 정보를 전달
    • code : Authorization Code 방식에서 해당 인가코드값 state : 앞서 전달 받은 state 값
  5. ClientResource Owner를 통해 Authorization Server 으로부터 전달받은 정보를 가지고 Authorization Server 으로부터 Access Token 을 발급받음
    • Authorization Server 로 요청 grant_type : authorization_code code : 전달받은 인가 코드값 redirect_uri : 앞서 주고받은 redirect_uri 와 동일 client_id : Application 등록 시 받은 ID code_verifier : client_secret을 대신하여 처음에 생성한 무작위 문자열
    • Authorization Server는 code_verifier를 code_challenge_method로 해시한 다음 code_challenge 와 비교하여 일치하는 경우에만 access_token 과 유효기간을 반환
  6. Client는 발급받은 Access Token 을 가지고 Resource Server 로 데이터 요청

cf. 인가 서버가 웹만 지원하는 경우, 내장 웹뷰가 아닌 별도의 브라우저를 사용해서 해당 페이지를 호출해야 함. 내장 웹뷰는 사용자가 실제 인가 서비스를 사용하는지, 피싱 사이트를 사용하는지에 대해 보장할 수 없음

Q. 위 검증은 앱 등록 시에 앱 스토어에서 진행하나?

yoon-chaejin commented 1 year ago

Resource Owner Password Credentials 방식

Client Credentials 방식