sitelink1  
sitelink2  
sitelink3  
sitelink4  
extra_vars5  
extra_vars6  

OAuth2.0 강좌를 들으면서 Keycloak 을 활용하는 내용이 나와서 정리하였다. (keycloak은 처음인지라)

keycloak 설치는 다음의 게시글들을 참고하면 된다.

강좌에서는 최초 keycloak 에 접속해서 authorization code 를 받은후 해당 코드와 다른 파라미터를 포함해서 다시 재요청해야만 token 을 받아오는 형태로 테스트를 진행하였다. (Authentication Standard flow)

첫번째 요청의 code 와 두번째 요청의 token 이 정상적으로 넘어오는지 확인하려면 redirect_uri 의 서버에서 keycloak 이 전달해주는 파라미터를 확인해야 하므로 다음과 같은 서블릿을 작성하여 파라미터 값을 출력해보았다.

 

[redirect_uri 로 지정한 서블릿]

public class KeyCloakServlet extends HttpServlet {

    

    public void init() {;}

 

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        doGet(req, res);

    }

 

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html");

        PrintWriter out = res.getWriter();

        // request parameter 로깅

        String pName = null;

        Enumeration<String> enums = req.getParameterNames();

        while (enums.hasMoreElements()) {

            pName = enums.nextElement().toString();

            out.println("<p>(param) " + pName + " - " + req.getParameter(pName)+"</p>");

        }

        out.close();

    }

}

 

위와 같이 준비해서 바로 테스트를 시도했는데 역시나 한번에 성공하지는 못하더라... ㅎㅎ ('unknown_error' 응답메세지를 받았다)

아마도 강좌가 만들어진 시점이 22년도여서 keycloak 의 버전이 구버전이어서인지 재요청시 올바른 코드를 넣었음에도 keycloak 이 에러 메세지를 응답해준게 아닌가... 의심했는데

(강좌의 keycloak 버전 : 19.0.1, 내가 진행한 keycloak 버전 : 21.0.2)

 

'unknown_error' 에 대해 keycloak 의 콘솔 로그를 보니 다음과 같이 나온다.

ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-127) Uncaught server error: java.lang.NullPointerException: Cannot invoke "javax.ws.rs.core.MediaType.isCompatible(javax.ws.rs.core.MediaType)" because "mt" is null

request 의 header 값중 Content-Type 이 없기 때문이라는데 그래서 value 를 application/x-www-form-urlencoded 로 지정하고 다시 Send를 날리면 이번엔 invalid_request 라는 error 가 응답된다.

그래서 다시 찬찬히 영상을 살펴보니 postman 으로 token 을 request 할때 method type 이 GET 이 아닌 POST 임을 알게되었다. (code 요청은 GET 이고 token 요청은 POST 이다)

POST Method 이기 때문에 postman 에서 파라미터를 입력하는 부분이 Params 가 아니라 Body 였다. (굳이 Content-Type 을 지정할 필요가 없어지고 body 에 파라미터 입력만으로 그렇게 성공한다...)

이제 지금까지 실행한 테스트 절차를 다음과 같이 정리한다.

 

[Authorization Code Flow TEST]

  1. keycloak 에 admin 으로 로그인하여 초기화면으로 진입한다.
  2. 좌측의 realm 목록 콤보를 열어 "Create Realm" 버튼을 클릭한다.
  3. Realm name 을 "oauth2" 로 입력하고 Create 한다.
  4. 생성한 Realm 을 선택후 Manage/Clients 로 이동한다.
  5. Create client 버튼을 클릭하고 Client ID 를 'oauth2-client-app' 로 입력하고 Next 를 누른다. (Name 도 ID와 동일하게 한다)
  6. Client authentication 을 On 으로 한다.
  7. Authorization 을 On 으로 한다.
  8. Standard flow, Direct access grants, Service accounts roles 등을 체크한다.
  9. Login settings 에서는 딱히 건드릴게 없다. 그냥 Save 버튼을 클릭한다.
  10. Manage/Users 로 이동한다.
  11. 'Add user' 를 클릭한다.
  12. Username 에 'user' 를 입력하고 Create 한다.
  13. 생성된 user 를 클릭한다.
  14. Valid redirect URIs 항목에서 Add valid redirect URIs 버튼을 누르고 code 를 받아서 처리할 redirect uri 를 입력한다.
  15. Credentials탭으로 이동한다.
  16. 'Set password' 버튼을 눌러 password 를 '1234' 로 입력한다. (로그인 편하게 쉬운걸로)
  17. keycloak 에서의 설정은 대충 마무리했다. 이제 postman 으로 이동한다.
  18. postman 에서 new collection 한다. (name : 'OAuth2.0 용어이해')
  19. 생성한 collection 에서 Add request 한다. (name : roles1)
  20. roles1 request 의 method 는 GET 이다.
  21. roles1 의 주소 입력란에 다음과 같이 keycloak 의 경로를 입력한다.
    https://[my keycloak domain]/realms/oauth2/protocol/openid-connect/auth
  22. Params탭에서 다음과 같이 파라미터들을 입력한다.
    - response_type : code
    - client_id : oauth2-client-app
    - scope : profile email
    - redirect_uri : https://[my domain]/redirect
  23. roles1의 주소란에 작성된 url 을 클립보드로 copy한다.
  24. copy한 url 을 브라우저에서 open 한다.
  25. 로그인페이지가 뜨면 keycloak 에서 생성한 user 와 암호를 입력하여 로그인한다.
  26. 응답페이지가 로드되면 화면상에 code값이 보인다. ("code -" 뒤의 값을 copy한다, code값은 주소란에도 있다)
  27. postman 에서 새로운 request 를 생성한다. (name : roles2)
  28. roles2 request 의 method 는 POST 이다.
  29. roles2 의 주소 입력란에 다음과 같이 keycloak 의 경로를 입력한다.
    https://[my keycloak domain]/realms/oauth2/protocol/openid-connect/token
  30. Body탭에서 'x-www-form-urlencoded' 를 선택하고 다음과 같이 파라미터들을 입력한다.
    - grant_type : authorization_code
    - client_id : oauth2-client-app
    - client_secret : keycloak 의 client 정보에서 Credentials 에 보면 Client secret 값을 확인 가능하다.
    - scope : profile email
    - redirect_uri : https://[my domain]/redirect
    - code : 브라우저에서 roles1 주소 호출하면서 응답으로 전달받은 code 값을 입력해 넣는다.
  31. 'Send' 버튼을 누르면 응답메세지에 'access_token' 이 보인다.

 

그렇게 삽질해서 성공한 실습 내용을 정리해보니 내용이 좀 지저분하길래

혹시나해서 네이버를 검색해보니 해당 강좌를 착실히 수강한 어느 청년의 맛깔스런 실습 포스팅을 찾을 수 있었다. --> OAuth 2.0 개요

문서 자체를 퍼올수는 없어서 이미지로 캡춰하고 실습 절차를 참고하고자 한다. (최근에 포스팅된 내용이어서인지 강좌에서의 실습 내용과 조금 다른 부분이 있다)

1장, 2장의 내용은 프롤로그에 해당되는 내용이어서 과감히 생략하고 실질적인 내용이 나오는 3장부터 캡춰했다. 

 

2024-02-02 오후 9-17-35.png

 

 

문서 내용중에 나오는 스크린샷들을 보다보면 노안때문인지 캡춰한 이미지의 글씨가 너무 작아서 흐릿하거나 침침해 보이는 그림들이 있다.

그래서 원본 문서에서 이미지들만 따로 저장해서 밑에다 크게 나열해 놓았다.

내용의 순서에 따라 이미지를 보려면 원본 문서를 읽어보기를 권한다. (위 캡춰 이미지를 클릭하면 원본 문서로 이동)

 

 

 

000.png

 

001.png

 

002.png

 

003.png

 

004.png

 

005.png

 

006.png

 

007.png

 

008.png

 

009.png

 

010.png

 

011.png

 

012.png

 

013.png

 

014.png

 

015.png

 

 

 

 

 

 

 

 

 

 

번호 제목 sitelink1 글쓴이 날짜 조회 수
공지 [계속 추가중] Keycloak 용어 및 설정 옵션 정의   황제낙엽 2024.02.02 5
74 Client ID, Client Secret (Credential) 에 대하여   황제낙엽 2024.03.11 2
73 OAuth 2.0 의 등장, 구성 요소, 인증 과정 file https://blog.naver.com/dsz08082/223024950520  황제낙엽 2024.03.11 3
72 Customizing the Login Page for Keycloak (Keycloak 로그인 페이지 사용자 정의) file https://www.baeldung.com/keycloak-custom-login-page  황제낙엽 2024.02.04 30
71 Access & Refresh token file https://letsmakemyselfprogrammer.tistory...sh%20token  황제낙엽 2024.02.03 2
70 OAuth 2.0 Client Types 별 Flow (인증 프로세스) file   황제낙엽 2024.02.02 2
» [스프링 시큐리티 OAuth2] KeyCloak 실습 (Postman, Servlet) file   황제낙엽 2024.02.02 12
68 docker keycloak 에 ssl 적용 결과 후기   황제낙엽 2024.02.01 31
67 docker keycloak 에 ssl 적용하기 위한 학습용 포스팅 모음   황제낙엽 2024.01.31 12
66 Keycloak 설치 관련 레퍼런스들 (with docker) https://www.keycloak.org/downloads  황제낙엽 2024.01.22 4
65 docker 를 이용하여 keycloak 실행 환경을 구축하는 포스팅 모음 (docker compose 포함)   황제낙엽 2024.01.22 10
64 KeyCloak 을 활용하여 사용자 인증을 처리하는 과정에 대한 포스팅 모음   황제낙엽 2024.01.20 3
63 [POST/2020.11.10] KeyCloak의 REST API 이용해서 JWT 발급과 검증 file https://oingdaddy.tistory.com/198  황제낙엽 2024.01.20 1
62 SAML roles 에 대하여   황제낙엽 2024.01.20 2
61 무료 Authorization Server 솔루션   황제낙엽 2024.01.18 3
60 Keycloak 에 대하여   황제낙엽 2024.01.18 3
59 OAuth2 구글(Google), Github, 카카오(Kakao), 네이버(Naver) 로그인 API 목록 https://choiseokwon.tistory.com/389  황제낙엽 2023.12.17 5
58 Spring Authorization Server 관련 포스트 목록과 인프런 강의   황제낙엽 2023.12.07 2
57 [POST/2023.05.22] OAuth 2.1 Authorization Server (Spring Security) 구축 후기 file https://tech.kakaopay.com/post/spring-oa...-practice/  황제낙엽 2023.12.03 3
56 OAuth 와 JWT 내용 정리 (개념 정의 및 적용 전략) file https://seungwoolog.tistory.com/95  황제낙엽 2023.12.03 3