OAuth2.0 인가 프레임워크는 앱(Client)이 사용자(User) 대신하여 사용자의 자원(Resource Server)에 대한 제한된 엑세스를 얻기 위해 승인 상호 작용을 함으로써 앱이 자체적으로 액세스 권한을 얻도록한다.
그전에는 Client가 User의 id,pasword 를 직접 받아서 resource server에게 요청을 하였다.
보안에 취약하고 , resource server의 모든 서비스를 사용가능하게되고 , 앱(Client)를 믿을 만한가?
Resource Owner (User) = 자원의 주인 , 접근권한을 부여하는 사람이다.
Resource Sever = 타 앱에서 접근하는 사용자의 자원이 포함된 서버 , 엑세스 토큰을 수락 및 검증할 수 있어야 하며 권한 체계에 따라 요청을 승인함
Authroization Server = Client 가 User 계정에 대한 동의 및 접근을 요청 할때 User가 승인해주면 access token을 client에게 주는 서버
Client = 앱
resource server에서 access token 을 검증할떄도 있고 위와같이 Authorization server에게 다시 물어보는 경우도 존재한다.
keycloak을 통한실습
1. client , user 생성
2. http://localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=code&client_id=oauth2-client-app&scope=openid profile email&redirect_uri=http://localhost:8081
으로 authoriztion_code 요청
3. 8081이 현재 기동이 안되어 있으니 에러페이지 발생 , code만 받아옴
4. code를 가지고 http://localhost:8080/realms/oauth2/protocol/openid-connect/token
으로 access_token 요청
5. http://localhost:8080/realms/oauth2/protocol/openid-connect/userinfo
access_token으로 사용자 정보 요청
clients Settings 에서 LoginSetting에서 Consent를켜줘야 code요청시 user가 로그인후에 어떤 resource를 인가할 것인지 물어보는 페이지가 나옴
Oauth2 Client Types
기밀 클라이언트 (Confidential Clients) = client secret 의 기밀성을 유지할 수 있는 클라이언트 = 웹 앱(java, net ,nodejs) 이 그러하다. 이미 컴파일되어 있으므로 안에 들어있는 client secret 을 알기 힘듬
공개 클라이언트 (Public Clients) = 임베디드 장치에서 실행 되는 앱 , 브라우저에서 실행되는 앱 등 개발자 콘솔 툴이나 도구를 이용하여 client secert이 추출이 가능하다.
서버측이 아닌 리소스 소유자가 사용하는 장치에서 실행되는 클라이언트는 공개클라이언트로 간주됨
front channel에서 token 토큰 교환 + client secret 교환을 하면 위험하다. 위에서 언급 했듯이 여러 툴들로 확인 할 수 있기 떄문이다.
backchannel 은 위에 keycloak 에서 실습했듯이 client_id 로만 전달해서 Authorization_code를 받고
server에 존재하는 client secret과 받은code를 함께 다시 Authorization server에게 acces token을 요청한다.
Oauth2 Token Types
Access Token = 클라이언트에서 사용자의 보호된 리소스에 접근하기 위해 사용하는 일종의 자격증명으로서 역할을 하며 리소스 소유자(User) 가 클라이언트에게 부여한 권한 부여의 표현이다.
2가지 Type을 가지는데
Identifier Type = 유의미한 정보가 포함디지 않은 그저 식별자임, Auth server에게 항상 검증을 받아야함
Self-contained Type = JWT처럼 스스로 정보를 지닌다. Auth Server에게 검증 받을 필요가 없음
Refresh Token = Access Token이 만료된 후 새 엑세스 토큰을 얻기 위해 클라이언트
응용 프로그램에서 사용하는 자격증명
리소스서버에게 가지 않고 Authorization Server의 endpoint 에만 전달된다.
ID Token = openID Connect 에서 사용됨
Authorization_code = 클라이언트가 액세스 토큰과 교환할 임시 코드.
'WEB > Security' 카테고리의 다른 글
OAuth 2.0 Open ID Connect + OAuth2.0 Client (0) | 2022.11.18 |
---|---|
OAuth 2.0 권한부여 유형 (0) | 2022.11.17 |
Spring Security Fundamentals (0) | 2022.11.16 |
앱 설명 (0) | 2022.06.08 |
Lesson 33,34 - Integration testing for Spring Security implementations - Part 1,2 (0) | 2022.05.22 |