SpringSecurity MockMvc테스트시 발생

MockMvc 설정

//            val delegatingFilterProxy = DelegatingFilterProxy()
//            delegatingFilterProxy.init(MockFilterConfig(context.servletContext, BeanIds.SPRING_SECURITY_FILTER_CHAIN))
            this.mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
//                .apply<DefaultMockMvcBuilder>(springSecurity())
//                .addFilters<DefaultMockMvcBuilder>(delegatingFilterProxy)
                .addFilters<DefaultMockMvcBuilder>(CharacterEncodingFilter("UTF-8", true))
                .alwaysDo<DefaultMockMvcBuilder>(MockMvcResultHandlers.print())
                .build()

test 설정

@WithMockKeycloakAuth(~~~)
@WithUserDetails("user1")
@Test
fun test() {
}

상태? 문제?

  1. Header인증을 사용하는 경우 no header -> jwt같은건 직접 header에 넣어줘야한다
    그렇다면 @Withannotation을 사용하기 힘들다는 뜻
  2. controller에 parameter로 Authentication을 받는경우 null – null… 어떻게 하지?
    SecurityContextHolder, TestSecurityContextHolder엔 들어있다
    WithSecurityContextTestExecutionListener: TestExecutionListener은 동작된다.
    principal = TestSecurityContextHolder.getContext()
  3. ???또 뭐가 있었던가

IAM/SSO 관련기술

완제품

  • Keycloak
    https://github.com/keycloak/keycloak
  • Gluu
    https://gluu.org/docs/gluu-server/4.1/installation-guide/install-docker/
  • OpenAM, OpenDJ
    https://github.com/OpenIdentityPlatform/OpenAM
  • JOSSO
    http://www.josso.org/
    https://github.com/atricore/josso2
  • LemonLDAP
    https://lemonldap-ng.org/welcome/
    https://github.com/LemonLDAPNG/lemonldap-ng-docker
  • Shibbolet ldp
    https://wiki.shibboleth.net/confluence/display/DEV/Source+Code+Access
    https://github.com/Unicon/shibboleth-idp-dockerized
  • 389 Directory Server
  • GLAuth
  • RazDC
  • FreeIPA
    https://www.freeipa.org/page/Main_Page
  • https://github.com/jasny/SSO
  • https://github.com/heipei/nginx-sso
  • https://github.com/IdentityServer
  • https://github.com/freeipa/freeipa
  • https://github.com/wso2/product-is
  • https://github.com/authelia/authelia

라이브러리

  • CAS
  • https://github.com/spring-projects/spring-security-saml
  • https://github.com/spring-projects/spring-security-oauth
  • https://github.com/spring-projects/spring-security-kerberos
  • https://github.com/samitpal/simple-sso
  • https://github.com/go-oauth2/oauth2
  • Apache Shiro
  • https://github.com/jcasbin/shiro-casbin
  • pac4j
  • Apache CFX https://cxf.apache.org/
  • Apache Fortress
  • geronimo.apache.org
  • https://casbin.org/
  • https://github.com/casbin/jcasbin
  • https://github.com/casbin/casbin
  • https://github.com/OpenConext/Mujina
  • https://github.com/pac4j/spring-webmvc-pac4j
  • https://github.com/Neloop/jaclp

프로토콜

  • OAuth
  • JWT
  • SAML
  • Kerberos
  • Radius
    https://www.gnu.org/software/radius/
  • CAS
  • Session
  • BasicAuth
  • LDAP
  • OpenID

REF

  • https://www.getkisi.com/blog/authentication-protocols-overview
  • https://en.wikipedia.org/wiki/Authentication_protocol
  • https://www.geeksforgeeks.org/types-of-authentication-protocols
  • https://developer.okta.com/docs/concepts/saml

TEST 단계 – 개발 및 배포 단계별 테스트

뭐라고 해야할까 고민이 있었는데
테스트 전략 보다는 단계가 맞는 것 같다

서버 환경의 설정 종류

  • workstation – 개발머신에서의 구동환경
    • 로깅레벨 DEBUG, TRACE
  • server
    • 로깅레벨 INFO, WARN
    • 모니터링ON

git branch

  • devel
  • master

Phase

재구동시간 30분

  • dev – 자동으로 계속 배포되는 환경. 개발툴에서 빌드시 배포되는 툴도 많이 있고서도 배포가 가능해야한다고 보는데
    workstation, server
    근무시간 on
  • sit – 인티그레이션 테스트, 소스셋이 완성되면 자동으로 배포 및 연동테스트
    테스트시에 구축 후 구동 temporal
    workstation, server
  • uat – user acceptance testing 기획 및 프로덕트 관계자 사용성 테스트
    근무시간 on??
    server
  • stg – production 데이터를 복제해서 테스트, 이게 완벽하게 가능하려면 IaC 필수
    server
  • prd – 완전 개발환경
    server

source set

  • check – 수동 기능체크, 항목이 다 존재하는지 체크해야하는 부분.. 의존성, 설정파일 등
  • manual – 메인소스코드, 외부 API등은 유닛테스트에 포함시킬 수 없으니
  • unit test – mock, gradle unit-test, git commit, git merge devel CI
  • integration test – gradle integration-test, scenario test, testcontainer 이용, git merge devel CI
    이 단계는 develop

소스이외 관리코드

  • scenario test – testcontainer, git merge, helm 활용
  • load test – http dsl 활용, 시나리오와 유사
  • healthcheck – ping pong, curl, log
  • seed
    • init – DB schema,
    • dev – faker data
    • replica – prd -> stg 민감정보 제거

single module project

tree

multi module project

tree

REST API 주소구조

  • /board
    get – list
    post – write
    • /{id}
      get – read one
      put – modify one
      delete – remove one
    • /search
      post – search list -보통은 list에 포함
    • /batch
      get – read by ids
      post – write write write
      put – modify by ids? 일괄로 변경 할 일이…
      delete – remove by ids
route(Constants.URI_COMMENT_BASE) {
    get { }
    post { }
    route("/{id}") {
        get { }
        put { }
        delete { }
    }
    get("/search") { }
    route("/batch") {
        get { }
        put { }
        delete { }
    }
}

어떻게 할까 맨날 고민하는데 위는 표준구조로 잡아놓은 형태

rest가 되지 않는 경우는 과감히 포기

ex) 입금관련기능

  • /deposit/apply
  • /deposit/cancel
  • /deposit/confirm
  • /deposit/status

특정 도메인 영역이 있는 경우 rest API에 맞추기 힘들다

주소에 집착하지말자

  • /deposit/apply POST
  • /deposit/cancel POST
  • /deposit/confirm POST
  • /deposit/status GET

리액트 웹앱 제작 총론 2/e: 리액트와 리덕스를 이용한 웹앱 개발 가이드, 2019

그냥 간단하게 잘 나와있다

jquery, jsp, php, asp 등등 구닥다리 웹프론트 기술을 좀 알고 있고
angular, typesript, express 정도는 조금 만져본 상태의 지식수준에서
볼 때는 대충 넘기면서 한두시간 보면 되는 정도..
요약을 잘 해 놓으면 네다섯페이지도 안되는 분량

리엑트나 웹 프레임웤을 처음 접하는 사람이 볼 수 있을지는 모르겠다
난 이 책을 보기전에 리엑트로 된 어드민사이트를 며칠 살짝 만져보긴 한 상태라서 좀 더 쉬웠는지도 모르겠다.
아예 프로그래밍 초보자라면 따라하고나서 남는거 하나도 없을 듯 하고

React

생명주기 메서드

  • componentWillMount
  • componentDidMount
  • componentWillUnmount
  • componentWillUpdate
  • componentDidUpdate
  • shouldComponentUpdate
    • if ~~~ return true else false
      true면 업데이트, false면 무시
  • componentWillReceiveProps
  • componentDidCatch

동작

초기 렌더링

  • 기본 속성 설정
  • 기본 상태 설정
  • componentWillMount
  • render
  • componentDidMount

상태변경

  • shouldComponentUpdate
  • componentWillUpdate
  • render
  • componentDidUpdate

속성변경

  • componentWillReceiveProps
  • shouldComponentUpdate
  • componentWillUpdate
  • render
  • componentDidUpdate

언마운트

  • componentWillUnmount

scaffold

npm i -g create-react-app
create-react-app hellowork-app

Redux, HOC

Admin 개발 편하게 하려면

쓸만한 무료 어드민 툴종류

어드민 프레임워크

  • Vaadin
    • https://vaadin.com/
  • CUBA Platform – vaadin에 의존성 있는듯
    • https://www.cuba-platform.com/
    • https://github.com/cuba-platform/cuba

프레임웤 내부지원

  • RubyOnRails – ActiveAdmin
  • django – admin

템플릿

react template도 많고 등등..

교훈

관리자 사이트를 리엑트로 만들지 말라

– 소크라테스 AI

디자인도 하지말고

Cors – python flask on Dokku

파이썬 개 똥언어

서버가 오류나뒈지면서 에러메시지 처리도 제대로 안되고
코드 중간에 오류나면 오류는 처먹고 뒤져버린다

솔직히 연습용으로는 좋다. 구석구석 에러가 나니까 개발할 때 프로토콜은 잘 배울 수 있겠다
라이브러리도 죄다 쓰레기라 하나하나 손봐서 써야되고 커스텀도 불가능한 구조로 만들어진 경우가 많아 pip고 뭐고 그냥 복사붙여넣기 해서 수정해야 하는 경우가 많다

이런 심플함(좆도없음)이 파이썬의 장점이라고 하니까

이쓔상황

Dokku에서 돌리는 Flask 서버에서 Cors가 난다고 한다.
swagger에서는 괜찮은데 react 클라이언트에서만 발생

문제는 뭘까? 의심가는 부분은..

  1. flask cors가 쓰레기라 제대로 동작을 안한다
  2. nginx reverse proxy가 제대로 일을 못한다
  3. 클라이언트가 코딩을 제대로 못했다
  4. 리엑트는 원래 병신 쓰레기라 아무 오류나 나온다

1번체크

curl \
--verbose \
--request OPTIONS \
'https://dokku-api-server' \
--header 'Origin: http://localhost:3000' \
--header 'Access-Control-Request-Headers: Origin, Accept, Content-Type' \
--header 'Access-Control-Request-Method: GET'

2번체크

/home/dokku/api-server/nginx.conf

별 이상없어보인다

3번체크

실행…
서버 호출을 잘못하기는 했는데…
서버오류가 cors가 아닌데 cors라고 나오는게 문제고

4번체크

????

추가체크

서버로그를 보니 flask jwt인증부분을 손을 댔는데 여기서 오류가 난 모양…
헤더가 안 들어올 때 401을 내려줘야하는데 그러질 못하고 있다
서버에서 응답이 없으면 cors가 뜨나? http 프로토콜문제인지 리엑트가 원래 병신인지 잘 모르겠다.

리엑스에서 cors오류발생시 리엑트와 플라스크서버가 모두 병신일 수 있다는걸 기억하자

Web 개발 용도별 기술선택

간단하게 만들려면 js, python이 좋다??

로그인, 디비 정도만 딱 붙이고 추가기능이 전혀 없을 경우….

보안이나 벨리데이션 신경쓰지 않고 프로토타이핑을 하는 경우에 한해서는

js, py가 괜찮은 선택이다

완성된 프레임워크 Spring, RoR

조금 제대로된 뭔가를 만들려면 이런걸 쓸 수 밖에 없다.

python으로 뭐 하려면 멀티스레드 지원 때문에 엄청 불편하다

모든걸 편법으로 처리해야 하는데 Queue, multiprocess, Celery 등등.. 이것저것 하다보면

전혀 간단하지가 않다

메시지 기반 Akka 프레임워크

게시판 종류의 서비스 말고 좀 복잡한 서비스 만들 때 … 필요하다.
거래소, 쇼핑몰 등 실시간, 비동기성이 좀 필요한 경우

Storm, Flink, Kafka, Kafka Streams 정도는 써 봤는데

Flink, Storm은 지들이 알아서 분산형 데몬을 관리 해 줘야 할 것 같은데… 그런부분에서 상당히 기능이 부족하다. 디버깅도 힘들고…유닛테스트도 힘들다. 분산형 키값공유 aggregate가 될 줄 알았는데…. 안된다. kafka와 효율면에서 뛰어나지 않다. 별 수 없겟지.. scale out을 할 때 kafka보다 더 이상 효율적이기는 힘들 것 같기는 하다.

이런저런 이유로 복잡도를 털어내고 사용하려면
kafka streams를 docker 환경에서 배포하는게 더 괜찮은데…
메시지 처리나 시리얼라이저 등등 여러부분을 직접 관리 해 줘야하는게 문제다.
그럼에도 불구하고… 나쁘진 않다.
여러 언어 지원 안되는게 조금 약점..이라고 할 수도 있지만 잡언어 안쓰면 되지

elixir도 akka처럼 액터기반 프레임웤인데 언어가 생소하니 접근성이 떨어지고 만들어놔도 인력 구하기도 힘든 문제가…

Akka로 이런 부족함을 채울 수 있을지 모르겠다

-테스트 더 해서 추가-