프로젝트 매니지먼트란 무엇인가에 대한 고민 프로젝트 관리라는건 결국 방해요소와 그에 대한 대처를 위한 상세한 고민인 것 같다. 단순히 개발에서 부딪히는 문제들을 포함해 팀원들간 의견 차이가 생겼을 때 어떻게 해결할 것인가에 대한 사전합의까지 참 많은 것을 포함하는 것 같다. 심지어 우리처럼 프로젝트 규모가 커지면 그만큼 하드하게 관리했어야 했다. 우리는 ...
ORM과 JPA란? ORM: Object-relational mapping (객체 관계 매핑) 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. ORM 프레임워크가 중간에서 매핑해준다. JPA: Java Persistence API ORM을 사용해 오브젝트와 RDB 사이에 존재하는 개념과 접근을 객체지향적으로 다루...
Spring security의 configure에 추가할 점. JWT를 쓰려면 Spring Security에서 기본적으로 지원하는 Session 설정을 해제해야 한다. 또한 API 서버로 사용할거기때문에 CSRF 보안도 필요없어서 해제한다. 비인증시 로그인 페이지로 이동하는 것도 나는 React를 이용한 Single Page App에서 스프링으로 요청만...
백기선의 스프링 부트 개념과 활용 백기선의 스프링 부트 개념과 활용 강의에 짧게 소개되어 있는 스프링 시큐리티 부분을 보고 스프링 부트는 스프링 스큐리티를 얼마나 도와주나? 사실 spring security는 WebSecurityConfigureAdapter를 그대로 사용하고 있다. Springboot가 기본적으로 제공하는 부분을 쓰고 있는 것. 그나...
Bearer Authentication란? 먼저 설명을 보자면.. API에 접속하기 위해서는 access token을 API 서버에 제출해서 인증을 해야 합니다. 이 때 사용하는 인증 방법이 Bearer Authentication 입니다. 이 방법은 OAuth를 위해서 고안된 방법이고, RFC 6750에 표준명세서가 있습니다. 그리고 아래는 구글 디벨...
보통의 예제들은 UserDetailsService에서 회원 DB로 직접 loadByUsername같은 메소드를 이용해 access하여 확인하는 작업을 매 request마다 수행한다. 나는 이 작업이 stateless라는 JWT의 기본 컨셉과 맞지 않는다고 생각했는데, 매번 토큰에 담겨있는 정보에 대해 의심해 DB에 접근할거면 차라리 다른 방법을 쓰는게 나을...
깃헙 주소 https://github.com/tlatldms/boot-security-jwt-redis Spring Security에서 @Secured 사용하기 @Secured annotation으로 간편하게 Role별로 설정하려면 Security Config file에 옵션을 추가해주어야 한다. @EnableGlobalMethodSecurity(ecu...
Post request에 header 붙이기 axios를 사용한 post request에서 header가 자꾸 request body로 들어가는 문제점이 있었다. 형식에 딱 맞춰야 하는 것 같은데 풀어서 쓰니까 계속 안됐다. 그냥 headers 따로, data 따로
우리 프로젝트 MSA 아키텍처 심시은20200123104504_1.png API Gateway > API 게이트웨이는 클라이언트 앱과 마이크로 서비스 사이에 위치합니다. 클라이언트에서 서비스로 요청을 라우팅하는 역방향 프록시로 사용됩니다. 또한 인증, SSL 종료 및 캐시와 같은 추가 교차 편집 기능을 제공할 수 있습니다. 사용자의 API 게이트웨이 ...
*https://spring.io/guides/gs/gateway 따라가기 스프링부트 버전 2.1.0으로 설정 원래 2.2.7인가 더 높은거였는데 netty 에러가 계속 걸려서 찾아보니 2.1.0 버전으로 하래서 일단 설정을 바꿔서 진행한다. RouteLocatorBuilder RouteLocatorBuilder 는 predicates와 fileter...
인증 서버와 Gateway의 역할 배분 우선 JWT만을 고려해서 인증 서버와 Gateway의 역할을 나누었다. 크게 보면 결국 토큰 발행은 인증 서버가, parsing&validation은 Gateway가 하게 된다. 지금 당장은 인증 서버가 하는 일이 적어보이긴 한데 후에 Oauth2를 추가했을 때 resource 서버(Google과 같은 third p...
기본 단일 인증 서버에 작성했던 filter와 parser들이 역할 분배가 불분명하고 서로 맞물려서 중복되는 등 더러워서 참고만 하고 새로 깔끔하게 작성해보기로 했다. JWT Parser를 만들기 위한 준비 먼저 파싱과 검사를 위한 util 클래스를 만들 것이다.
로그인 한 번으로 여러 서비스를 이용하는 것. Google 아이디 가지고 여러 서비스를 사용하는 것이 대표적인 예시인데 Oauth2와 아주 깊게 연관되어 있는 듯 하다. SSO라고 하면 '하나의 로그인으로 여러 서비스 이용하기'라는 컨셉 자체이고 Oauth는 그것을 실
먼저 라우팅을 담당할 RouteLocator를 최상위의 Application.java 파일에 써준다.RouteLocatorBuilder 는 predicates와 fileters들을 사용자의 routes에 추가해 request/response를 커스터마이징하는 등 조건에
예상된 에러 안에 들어오면 성공이든 실패든 httpStatus는 200 OKerrorCode는 모든 요청에 대한 응답에 json값중 하나로 넣을 값성공 시 errorCode는 10, frontend에서 10인지 먼저 체크하기를 기대@RestControllerAdvice
유저 회원가입 요청유저가 입력한 회원정보 redis에 저장이메일 전송username과 username + salt를 SHA512 해싱한 인증 토큰이 포함된 인증 url을 이메일로 전송.redis에 토큰 저장하면서 만료 기간도 정함유저가 URL 클릭담당 컨트롤러에서 해당
서버개발캠프를 시작한 지 벌써 한 달이다. 짧다면 짧은 시간이지만 한 달 이상 과제 걱정이나 취업 걱정 없이 코딩에만 몰입해 본 적은 처음이었다. 처음에는 뭔가 대단한 것을 우수수 배워서 캠프가 끝나면 갑자기 내가 슈퍼 개발자가 되어 있는건가? 싶었는데 한 달쯤 되니
그냥 socket이 세션을 하나씩 관리해야 한다면, stomp를 사용하면 pub/sub 형태의 발행자/구독자들 형태로 관리할 수 있다. 우리 프로젝트의 경우 bts column에 보여줄 트윗은 모든 사용자에게 동일하기 때문에 하나의 발행자만 있으면 된다. 채팅에서 많이
앞서 우리 프로젝트는 클라이언트가 모든 요청에 JWT를 붙여 보내고 Gateway 차원에서 파싱해 이후의 기능 서버들 단에서는 자유롭게 통신을 주고받는 것으로 정했었다. 그런데 WebSocket의 경우 헤더의 토큰을 검사하던 HTTP 프로토콜과는 완전히 달라 인증을 어
http→websocket upgrade를 위한 handshake http 요청에는 custom header를 달 수 없다. Authorization header를 달 수가 없다는 것이다. 특히 API Gateway를 사용하는 경우에 문제가 된다. 처음에는 upgrad
등록된 Bean을 가져다가 사용하고 싶을 때 @Autowired로 편하게 사용하고는 한다. WebSocketConfig 에서 endpoint에 HandshakeInterceptor를 추가해 endpoint 접근하는 url의 query parameter에서 토큰을 캐치해