개발팀장이 되면서 겪게된 점들 1

이미지
                                                         <팀원을 모집하기 위해 고군분투하는 모습이다. > 첫 한달  개발팀장을 맡다 2021년 5월 , 기존에 있던 CTO분이 휴직(개인사)을 하게 되면서    개발에 대한 모든 권한을 내게 일임하였다.   개발에 대한 모든 의사결정을 전부 내게 맡긴 것으로 ,   어느 정도 규모가 있는 회사의 의사결정권한을 갖게 된 것은 그만큼 내게 큰 신뢰가 있었음을   알수 있게해주는 대목이었다. 그러나 전혀 예측하지 않았던 상황이기에 준비가 되어있지 않았던만큼 처음에는 삐걱거렸다. 가장 첫번째로 어려움을 겪었던 것은 업무의 배분이었다.   관리자가 되니까 해야할일은 업무를 만들고 또 그것을 팀원들에게 분배하고 잘 되고있는지 취합하고 관리감독을 하는것이었다.   군 시절 장교로 복무하면서 겪어봤던 일이긴 했지만, 군복무 당시에도 그닥 잘 하지는 않았던 것 같다.   그럼에도 어쨌든 전반적인 시스템을 이해하고 있었고, 어떻게 구현해야할지에 대해서는 어느정도 경험이 쌓여있었기때문에 큰 문제가 없을 줄 알았다.   실무자로 일을 할 때에도 항상 업무를 받아서 하지는 않았다. 스스로 돌이켜보건대, 나는 주어진 업무가 없으면 스스로 만들어서 제안하고 기획하여 업무를 진행했다.  조그마한 스타트업이었던 첫 회사에서부터  내가 할일은 내가 만들어서 곧 잘했다. 어떤 큰 방향만 정해져있다면 그건 큰 어려움은 아니었다. 나에게 일은 항상 있었다.   매니저가되면서 달라진게있다면 내가 할일만 만드는 것은 아니라는 점이다 . 남이 할 일도 만들어줘야했다.  다행히 팀원들에 대한 면담을 실시한 결과,(팀원을 맡게되자마자 했던 부분)   마이크로 매니징을 원하지는 않았기때문에 큰 그림을 그리는 정도만 준비하면 됐었다.   문제는 내 실무를 동시에 진행하면서 팀원들의 업무 방향도 설정해야했기때문에 시간이 배로 들게 되었다는 점이다. 물론 두배로 일하지는 않았다. 대신에 내 실무시간을 줄였고

JWT (JSON WEB TOKEN) / passport 와 연동해서 typescript + express에서 구현해보기!!!



블로그 이전했습니다~

링크(
https://steemit.com/@cicada0014

로그인을 구현하는데 있어서 크게 세션과 쿠키 방식이 있다고 한다.

세션도 크게보면 쿠키의 일종이며, 서버의 메모리를 쓴다는 점이 특징이다.

쿠키보다 세션이 보안적인 측면에서 더 좋다고 생각해서 코딩을 하고 있었는데,

서버를 업데이트하고 배포를 할때마다 서버가 재시작되는 점이 있었다.

그렇게 되니 서버의 세션이 자동으로 종료되는 점이 있었다. (실제 사용자가 있다면 큰 불편함이 발생)

물론 세션을 쓰면서도 서버의 재부팅과 관계없이 유지하는 방법이 있겠지만

회사 대표님께서 말씀해주신 JWT (JSON WEB TOKEN) 방식을 사용해보았다.

JWT 에 대한 자세한 설명은 다른 블로그에서 자세히 해주고 있으니 참고하기 바란다



실제로 typescript  + express 환경에서 어떻게 구현할 수 있는지 초점을 맞출 것이며,

로그인에 많이 쓰이고 있는 passport js도 곁들일 생각이다.

요즘에는 자체 로그인 구현을 잘 하지 않는 편이니까.

가장 대중적인 플랫폼인 페이스북과 연동해본다.(Facebook Login API 문서가 잘 되어있다)

프로젝트를 만들며 시작 하자

해당 리포지토리는 다음 깃헙주소로 클론하실수 있습니다 .


https://github.com/cicada0014/jwt-practice.git


일단 inversify를 이용해서 컨테이너를 사용한 express 앱을 구현한다 

inversify+express 서버 구축의 자세한 내용은 이곳을 눌러 확인하자 

위 프로젝트와 더불어 추가해줄 명령어는 다음과 같다


npm i -S passport passport-facebook jsonwebtoken @types/jsonwebtoken @types/passport @types/passport-facebook

이제 모듈들이 다 준비가 되었고, 링크에 있는 대로 진행했다면 다음과 같은 파일들이 생성되어 있어야 한다. 
app.ts , controller.ts, model.ts

추가적으로 우리는 JWT 를 통해 인증 서비스를 만들것이므로 auth.ts를 추가한다. 

하나하나 설명하자면, 
constructor( @inject(Model.name) private model: Model) {
};
이 생성자는 컨테이너로부터 model을 의존 주입받는다. 실제 서비스에서는 데이터베이스에 회원의 정보가 있을 것이고 우리는 페이스북으로부터 받은 유저 정보와 비교해서 우리의 회원인지 비교할 수 있다. 

다음은 model.ts 의 일부 메소드이다. 



실제 데이터베이스와 연동하게되면 Promise 객체를 반환하게 된다. 페이스북으로부터 받은 정보와 회원 데이터베이스 정보가 동일하다면 회원 정보를 반환하게 할 것이다. 





실제 토큰을 생성하는 메소드이다. 
파라미터로 페이스북의 프로필정보를 받고, 그 정보를 토대로 토큰을 생성한다. 







init 메소드는 어떤 플랫폼을 쓸것인지와 실제 우리가 가동시킬 어플리케이션을 파라미터로 받는다. 
페이스북이 맞다면 패스포트의 페이스북 strategy를 사용한다. 
옵션값으로는 자신의 페이스북 앱의 아이디와 시크릿정보 그리고 인증결과를 받을 callback url을 등록해야 한다. 

이 passport를 쓸때 위에서 보았던 model 의 getAuthWithFaceBook() 를 사용한다. 
인증으로부터 성공하면 profile 정보를 얻을 수 있다. 
데이터베이스에 해당 정보가 있다면 row 가 1 인 배열값을 얻을 수 가 있을 것이다. 
만약 배열의 길이가 0 이라면 해당 유저가 없는 것이며 
2 이상이라면 유저가 중복된 것으로 판단할 수 있다. 


init 메소드 중 일부인데 사용자가 auth/facebook 으로 요청을 보내면 패스포트전략에 따라 페이스북 앱으로 인증을 요청한다.
페이스북 앱쪽에서 인증절차를 거치고 결과를 auth/facebook/callback url로 되돌려주며
페이스북 인증절차가 성공적이라면 토큰을 사용자에게 보내준다
res에 header 값을 설정해준다. 'Set-Cookie' 헤더 정보를 만들어주면 된다 .
잘 요청이 되었다면 사용자는 토큰이 잘 생성되었다는 메세지를 받을 것이다.

app.get('/auth/facebook', passport.authenticate(authProvider, { session: false }));
app.get(
'/auth/facebook/callback',
passport.authenticate(authProvider, {
failureRedirect: '/'
}),
(req: any, res, next) => {
// passport
let token = req.user.token
// res.setHeader('Set-Cookie', `token=${token};Max-Age=21474836;Path=/;Secure;HttpOnly`)
res.setHeader('Set-Cookie', `token=${token};Max-Age=21474836;Path=/;HttpOnly`)
res.send("토큰이 잘 생성되었음")
}
);



로그인 구현을 위해서 모든 요청에 대해서 토큰 인증절차를 진행한다. 
req 에 decoded 정보를 심어줄 것이다. 

위 내용을 마무리했다면  app container에 등록한다. 




app.ts



container에 등록을 했으면 컨테이너로부터 Auth 객체를 가져와서 init 시킨다. 




여기서 check url을 통해서 실제로 decoded 된 토큰값이 나오는지 확인해볼 수 있다. 

tsc ; node ./build/app.js

를 실행하면 서버가 가동된다 . 

http://localhost:3000/check 로 접속해본다.





와 같이 뜬다.

아직 토큰이 생성되지 않았기 때문이다 .

http:// localhost:3000/auth/facebook 으로 접속을 하면 페이스북으로 인증절차를 요청하게 될 것이고
인증이 성공했다면 토큰을 생성했다는 메세지를 보내오는 것으로 짰다.
토큰이 생성되었다면 chrome 개발자 도구 > Applicaition 탭에서 쿠키를 확인해볼 수 있다.





다시 http://localhost:3000/check 으로 이동해보면 decoding된 토큰 정보를 확인할 수 있다.


해당 리포지토리는 다음 깃헙주소로 클론하실수 있습니다 .

https://github.com/cicada0014/jwt-practice.git

댓글

댓글 쓰기

이 블로그의 인기 게시물

iframe 보안 문제 우회 및 해결법 1

iframe 보안 문제 우회 및 해결법 2

개발팀장이 되면서 겪게된 점들 1