안녕세계

[SK고용디딤돌] Node.js (9/10) - 7주차 본문

[SK고용디딤돌] Node.js (9/10) - 7주차

Junhong Kim 2016. 8. 17. 18:05
728x90
반응형

HTTP => stateless 인데, 이를 stateful하게 만드는 기술은 cookie 와 session

1) HTTP 상태유지 전략

2) 저장의 위치가 다를 뿐 (하나는 서버(session), 하나는 클라이언트(cookie))


클라이언트가 요청하면 req, res 객체가가 생긴다. (한 사이클은 req, res는 응답하면 사라진다)

다음 요청들어오면 req, res가 만들어진다.

요청이 들어 올때마다 req, res 새롭게 만들어진다.


세션은 서버측의 session table에 내부적으로 구성이되고 여기에 session id 라는 것이 존재하고 이에 대해서 객체를 담아둬서 쓸 수 있도록 하는 정보이다. 이 객체를 참조하기위한 것을 session이라고 한다. 이 session을 관리를 해주고 request 요청할 때마다 session 정보를 같이 접근할 수있도록 해준다.


- session이라는 정보를 request객체를 통해서 접근할 수 있다.


- 로그인이 됬다 안됬다를 session 객체에 담아두면 된다. 가장 쉽게할 수 있는 방법은 is logged in


- 세션을 쓰고 passport 라는 frame work를 가져다 씀 이것은 인증을 담당하는 역할할 때 쓴다.


- local 인증 (아이디 + 패스워드)


- 서버는 80%가 돈 (안전성, 보안성, 성능좋음, 서버는 돈에 비례한다 슬픔..)


- OAuth 인증 서비스 provider가 있다. 조금씩 다르지만 OAuth Protocol을 따른다. 인증서비스를 시스템에 붙여서 쓰는게 중요하다.



401 오류 status code로 defualt로 보냄 -> 다 체크할 꺼임



[ 참고: https://www.npmjs.com/package/passport-local ]


[ 참고: http://passportjs.org/docs/configure ]



1) passport.serializeUser() 세션에 저장하기 위해 사용하는 함수

2) passport.deserializeUser() 세션에 저정되어 있는 user 객체를 복원하는 함수



[ passport 사용하려면 필요한 것 ]

1) passport.user strategy 객체를 만든다

2) local에서의 주의 :  username 하고 password가 기본 임. 첫번째 인자로 변경해야함

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function(email, password, done) { }

3) passport.serializeUser()

4) passport.deseriailizeUser()


로그인을해야 하는 모든 경로에는 passport.authenticate('local') 필요하다

router.post('/local/login', passport.authenticate('local'), function(req, res, next) {





[ PASSPORT-local 동작원리 ]


우리는 express라고 하는 프레이음 워크를 사용 -> 우리는 이걸 로딩

미들웨어로 express-session이라고 하는 놈이 올라온다 ( 세션테이블을 유지할 수 있도록 하는 기능을갖고있다)

이를 기반으로 PAssportjs라고하는 프레임웤를 사용한다.


passport framework는 express-session을 이용해서 추가적인기능 수행하게한다.

가장중요한거 ㄴ이걸 기반으로 passport를이용하ㅣ여 localstrategy를적용

이전략에 의해서 로그인도하고 인증도하는 과정을한다.


최초로 post/ auth /lcoal / login 요청을 보넀을때

서버측에서는 res , req 객체가 만들어진다


req 객체에는 email , password 라는 내용을 body로 보낸다

req 객체 body에 email과 password가 존재


localstrategy는 기본적으로 username과 password를 받게 되있다.

옵션으로 usernameField , passwordField로 바꿀 수 있다. 

usernameField: 'email' , passwordField: 'password' 를이용하여 이메일과 패스워드 끌어온다.


staregey는 이것을 이용하여 DB에 저장되어있는 내요을 가져다가 user 객체를 만든다.

이 정보를 이용해서 user라는 객체를 만드ㅏ.


Findcustomer , FindByEmail 등.. 이 때 가질 수 있는 상태 정보는 null일수도 있고 null 이 아닐수도 있음.

null 이면 존재하지 않는다라는 것, user의 password하고 비교하여 ok 가되면 req에 연결시켜준다.


또한 passport는 기본적으로 serializeUser 함수와 deserializeUser 두개의 함수를 갖는다.

seriailizeUser에는 id가 넘어가고 deserializeUser는 복원을 하는것임


passport는 기본적으로 하나의 세션에 user의 id를 저장해둔다.

이를 가지고 db 꺼내올 수 있다. 그러면 deserialize가 복원해준다.


이것이 바로 passport 동작원리이다.


다음에 새로운 요청이 들어오면 로그인이 되어 있으니까. req에는 req.user가 붙는다.

passport가 준비되어있기에. passport가 선행한다. 모든 요청은 passport를 통과하도록 되어있다.





[ PASSPORT-Facebook 동작원리 ]


express 기반에 express session에 passportjs facebookstrategy를 사용

passportjs에는 authenticate()가 있는데 여기에는 local을 전달하면 local이 사용하는것, 우리는 strategy가 2개가 존재하는 것이다.

local이 전달되면 -> local strategy, facebook이 전달되면 -> facebook strategy 사용.


요청이 facebook으로 가면 facebook은 로그인 화면을 보여준다. 화면에서 로그인한다.

로그인하면 facebook으로 갔다가. 로그인이 응답이 되는데 callbackurl을 이용해서 /auth/facebook/callback 으로 accesstoken/ profile 을 넘겨준다.

GET /auth/facebook






https://github.com/senchalabs/connect

http://passportjs.org/

728x90
반응형
Comments