대머리개발자

역할과 권한 In OAuth2.0 본문

개발이야기/개념

역할과 권한 In OAuth2.0

대머리개발자 2023. 1. 9. 15:26
728x90

인증서버를 구축했고

인증서버를 통해서 보호 받아야 하는 "리소스 서버"들에 대한 역할과 권한을 어떻게 설계를 해야 하는지에 대한 주저리!!

 

결론부터 작성하고 주저리 해보자.

 

역할과 권한은 개념적으로만 카테고리화 한다. 즉 1depth (역할) - 2depth(권한) 이렇게 생각하면 될 듯 한

 

실제 역할 & 권한에 대한 체크 로직은 동일한 구현체(hasAnyAuthorityName)를 호출 한다. 

결론 : 역할과 권한은 개발적으로 동일하다.!!

 

또한 JWT 처리 방식을 보니 scope와 scp을 Authorities로 받아서 권한 처리를 진행한다. 

### 클라이언트 DB Sepc.

CREATE TABLE IF NOT EXISTS `oauth_client_details`
(
    `client_id`               VARCHAR(256)  NOT NULL,
    `resource_ids`            VARCHAR(256)  NULL,
    `client_secret`           VARCHAR(256)  NULL,
    `scope`                   VARCHAR(256)  NULL,
    `authorized_grant_types`  VARCHAR(256)  NULL,
    `web_server_redirect_uri` VARCHAR(256)  NULL,
    `authorities`             VARCHAR(256)  NULL,
    `access_token_validity`   INT           NULL,
    `refresh_token_validity`  INT           NULL,
    `additional_information`  VARCHAR(4096) NULL,
    `autoapprove`             VARCHAR(256)  NULL,
    PRIMARY KEY (`client_id`)
);

DB 값으로 가지고 있는 authorities는 실상 쓰레기 값이다. 관련해서 찾아보니...

 

값을 가지고 있으면 뭐하니? 비지니스 로직에서 사용하지 않는데용!!! 화가 난다!!!!!

 

친절한 누군가가 설명을 잘 해 주셧다.

https://stackoverflow.com/questions/32092749/spring-oauth2-scope-vs-authoritiesroles

 

 

여긴 어디...?? 무엇을 하고 있는 거지??? 

시큐리티의 

스프링 시큐리티 : 인증과 허가를 지원해주는 프레임워크

Oauth2.0 :  Spec.(프로토콜)

 

Oauth2.0 Spec을 꾸역꾸역 시큐리티로 짜 맞춰 가는 과정에서 정리가 안 된 부분 같다.

잘 생각해 보면 Oauth 사이드에서는 역할과 권한이라는 용어를 쓰지 않았다.....ㅅㅂ

역할과 권한이라는 용어는 순전히 스프링 시큐리티에서 나오는 것이다.

 

결국  위에서 기술 검토한 내용은 단순 스프링 시큐리티에 대한 권한과 역할에 대한 부분인거다.

 

내가 하고자 하는 부분은 Oauth 관점에서는 scope만 설계 하면 되는 것이었다.

 

제휴사들과의 연계를 Oauth로 쉽게 인증하고 제휴사마다 호출 가능한 APIs를 목록을 일관성 있게 처리 해야 하는 것을 목표로 기술 검토 하고 있는데.. 도도리표..설계가 필요 없는 것을 찾아보고 있으니 ...하악하악.

 

그냥 api 명으로 각 제휴사에게 scope를 추가 해주면 그만이다....ㅅㅂㅂ

 

최근 Boot 3.0 기반으로 나오느 Oauth lib는  까보니... 깔끔해 졌다. 처음부터 잘하자. ㅠ 

딱 끝 !! authorized_scopes   혼돈이 오지 않는 단어 선택!!

CREATE TABLE oauth2_authorization (
    id varchar(100) NOT NULL,
    registered_client_id varchar(100) NOT NULL,
    principal_name varchar(200) NOT NULL,
    authorization_grant_type varchar(100) NOT NULL,
    authorized_scopes varchar(1000) DEFAULT NULL,
    attributes blob DEFAULT NULL,
    state varchar(500) DEFAULT NULL,
    authorization_code_value blob DEFAULT NULL,
    authorization_code_issued_at date DEFAULT NULL,
    authorization_code_expires_at date DEFAULT NULL,
    authorization_code_metadata blob DEFAULT NULL,
    access_token_value blob DEFAULT NULL,
    ...
    PRIMARY KEY (id)
);

 

Boot2.5 ↑

// 더 이상의 지원 X
/implementation group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.3.4.RELEASE' // spring oauth 2.0

Boot3.0은 JDK 17 이상을 써야 하는 관계로 일단 Pass

 implementation "org.springframework.security:spring-security-oauth2-authorization-server:1.0.0"

 

 

 

 

 

 

728x90

'개발이야기 > 개념' 카테고리의 다른 글

개발에선 "절대"는 없다.  (0) 2023.03.14
코딩컨벤션  (0) 2023.03.04
grpc.proto porting  (0) 2023.01.11
What the OAuth2.0  (1) 2023.01.05
크로스 도메인  (0) 2022.12.30