테스트 환경
1. Front-end
- React, Swagger-UI
2. Back-end
- SpringBoot
- Spring Security Keycloak Adapter
3. Keyclaok
4. 인증방식
OIDC
Bearer, JWT
사용 프로세스
1. 아래 그림은 타 시스템에서의 프로세스를 정리한 그림입니다.
세부적인 프로세스
1. Front-end 에서 로그인 버튼 클릭 (Keycloak 과 연결 설정이 되어있어야 함)
2. Keycloak Login 페이지 호출 및 로드
3. 로그인 수행
4. 인증이 필요한 Back-end API 호출
- HTTP Header 에 Bearer 인증타입의 암호화된 토큰(JWT)을 포함하여 API 호출 수행
(즉, Credentials 을 헤더에 넣어서 전송)
- 위 Bearer 타입의 JWT 는 https://jwt.io/ 해당 사이트에서 디코딩하여 정보 확인 가능
5. Back-end
- 프로그램 실행 시 정의해둔 keycloak 정보 (keycloak server, realm, client 등의 정보) 를 이미 보유
- Keycloak 의 /auth/realms/{realm}/.well-known/openid-configuration API 에서 Keycloak OIDC 정보를 조회
- Keycloak 의 /auth/realms/{realm}/protocol/openid-connect/certs API 에서 secret key 를 조회
- Front-end 에서 받은 JWT 를 복호화하여 사용자 정보가 포함된 토큰을 복호화하고 이를 SecurityContextHolder 를 updating 한다.
대략적으로 이런 프로세스를 가지는 것을 확인하였습니다.
용어에 대한 부가 설명
1. 인증 방식의 종류
- 쿠키, 세션 방식
- 토큰 방식 (ft. JWT)
2. 토큰 기반 인증 타입
- Basic: ID 와 PW 를 Base64 로 인코딩한 값을 토큰으로 사용 (RFC 7617)
- Bearer: JWT 혹은 OAuth 에 대한 토큰을 사용한다. (RFC 6750)
- Digest: 서버에서 난수 데이터 문자열을 클라이언트에 보낸다. 클라이언트는 사용자 정보와 nonce 를 포함하는 해시값을 사용하여 응답한다. (RFC 7616)
- HOBA: 전자 서명 기반 인증 (RFC 7486)
- Mutual: 암호를 이용한 클라이언트-서버 상호 인증 (draft-ietf-httpauth-mutual)
- AWS4-HMAC-SHA256: AWS 전자 서명 기반 인증 (링크)
3. 토큰 기반 인증 (JWT)
- Header: 암호화 방식, 암호화 타입, key id 등
- Payload: IDP(ID Provider) 기준으로 클라이언트 정보, 토큰, 사용자의 메타데이터 등
- Signature: 토큰 검증을 위한 데이터 (헤더에서 지정한 알고리즘과 secret key, 서명으로 header 와 payload 를 담는다)
* 결과적으로 Encoded Header + "." + Encoded Payload + "." + Verify Signature 형태로 구성된다.
참고자료
https://github.com/ivangfr/springboot-react-keycloak
https://tansfil.tistory.com/58
https://yonghyunlee.gitlab.io/node/jwt/
'IT > 보안' 카테고리의 다른 글
표준 인증 프로토콜 SAML, OAuth, OIDC (0) | 2022.12.21 |
---|---|
웹 주요 보안 취약점 정리 (0) | 2021.07.07 |
Keycloak 리뷰(Spring-Security 연동, 테마, SPI, User Federation) (0) | 2021.05.27 |
암호화, 복호화, 해싱이란? (0) | 2021.05.11 |
대칭키, 공개키(Public key), 개인키(Private key) 란? (0) | 2021.05.09 |