로그인 전략

마지막 업데이트: 2022년 5월 3일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
독립된 세션 스토리지 - 각 서버와 연결된 독립된 저장소를 구성하는 것이다. 여러 대의 서버가 하나의 세션 저장소를 공유하기 때문에 데이터의 동기화를 위한 비용이 발생하지 않는다. 일반적으로 Redis와 같은 In-memory 저장소를 활용하며, 일반적인 관계형 데이터베이스 저장소도 사용할 수 있다.

로그인 전략 혼자서도 잘해요

[JavaScript] Node Express 에 Passport.js local전략 이용한 로그인 구현하기(1)

개인 프로젝트에서 카카오 로그인 기능을 구현하려다 보니

passport를 보통 이용한다는걸 알게 됐다.

근데 이게 쓰기 너무 복잡해. 서 정리해둔걸 티스토리에 올려 공유하려 한다.

강의들이 Passport.js를 알기 위해선 Express-Session-Auth를 알아야 하고,

Express-Session-Auth를 알기 위해선 Express, Cookie & Auth를 알아야 하고,

실제로 강의에서도 이전 강의 내용이 연장되기 때문에

들으려거든 통으로 듣는게 좋다. (강의링크 아래 참조)

WEB2 - Node.js - 생활코딩

수업소개 이 수업은 JavaScript를 이용해서 Node.js를 제어해 동적으로 HTML 코드를 생성하는 웹애플리케이션을 만드는 방법에 대한 수업입니다. 수업대상 예를들어 1억개의 페이지로 이루어진 웹사

해당 강의에서는 내가 사용하던 Node Express 프레임워크를 사용하지 않아서

프로젝트 하다가 로그인 구현부분을 넣는 경우는

아래에 안내하는대로 새 프로젝트를 만들어 본 뒤에 적용하는걸 추천 한다.

참고로 local 전략이기 때문에 카카오 로그인 같은 소셜 로그인 전략을 쓰기 위해서

passport 적용하는 거라면 추가적인 세팅이 더 필요하다.

다음 포스팅을 작성하게 된다면 아래에 링크를 추가하도록 하겠다.

프로젝트 생성

1. express-generator 설치

2. test_project라는 새 프로젝트 생성

create : test_project\
create : test_project\public\
create : test_project\public\javascripts\
create : test_project\public\images\
create : test_project\public\stylesheets\
create : test_project\public\stylesheets\style.css
create : test_project\routes\
create : test_project\routes\index.js
create : test_project\routes\users.js
create : test_project\views\
create : test_project\views\error.pug
create : test_project\views\index.pug
create : test_project\views\layout.pug
create : test_project\app.js
create : test_project\package.json
create : test_project\bin\
create : test_project\bin\www

change directory:
> cd test_project

install dependencies:
> npm install

run the app:
> SET DEBUG=test-project:* & npm start

PM2를 이용하여 구동

2. package.json 수정

package.json 을 수정해서 pm2 start 명령어가 아닌 npm start, stop 으로 서버를 켜고 끌 수 있다.
"scripts" 부분의 start, stop 부분에 pm2 start ./bin/www --watch, pm2 stop ./bin/www를 입력한다.
--watch 는 PM2가 실행된 프로젝트의 변경 사항을 감지하여 서버를 자동 리로드 하는 옵션이다.

서버 켜고 끄기 쉽다!

메인 페이지 생성

정말 간단하게 만든 로그인 페이지

최종적으로 만들게 될 로그인 화면 형태이다.

로그인 기능을 만들면서 아직 프론트 쪽 개발은 진행이 안 되어서

백엔드 서버에서 로그인요청하고 인증처리 해주도록 되어있다.

저 화면에서 pug 라는 템플릿 엔진을 사용했는데

문법이 너무 익숙하지가 않아서(T_T) 굉장히 귀찮았다는점

2. 로그인을 위한 쿠키와 세션을 추가한다.

express generator로 만들면서 cookie-parser 라는 쿠키 모듈은 이미 추가가 되어 있다.
app.js에
var cookieParser = require('cookie-parser');
app.use(cookieParser());
라는 구문을 볼 수 있을것이다.
express-session라는 세션 모듈을 설치하고 쿠키와 세션이 생성되는지 확인해보도록 하겠다.

Refresh Token과 Sliding Sessions를 활용한 JWT의 보안 전략

사용자의 상태를 유지하지 않는 stateless한 서비스를 운영할 때는 보안 이슈가 문제가 됩니다. 이를 해결하기 위한 보안 솔루션 중 하나가 JSON Web Token입니다.

이를 이용해서 보안 정책을 세우는 경우 토큰 관리에 여러 전략을 이용 할 수 있습니다. JWT가 로그인 전략 제공하는 기본적인 AccessToken 외에 RefreshToken을 도입한다거나 Sliding Sessions 전략을 활용할 수 있는데 이에 따라 그 장/단점이 달라집니다.

AccessToken 사용

사용자가 로그인을 할 때 클라이언트에게 AccessToken을 발급합니다. 서버는 AccessToken을 데이터베이스나 파일등에 저장 할 필요 없이 메모리상에서 미리 정의 된 비밀키를 이용해 비교하는 것 만으로 인증을 처리하기 때문에 추가적인 I/O 작업이 필요가 없습니다. 반면에 그런 이유로 서버는 특정 사용자의 접속을 강제로 만료시키기 어렵습니다. 일반적으로 클라이언트는 스스로의 저장 공간에서 토큰을 삭제하는 방법을 사용해 사용자의 접근을 막습니다.

짧은 만료 시간을 설정

JWT는 토큰의 만료 시간을 설정 할 수 있는데, 이를 30분 내의 짧은 기간으로 설정하는 경우에 대한 장/단점을 알아보겠습니다.

  • 기기나 AccessToken이 탈취되더라도 빠르게 만료됩니다.
  • 사용자는 자주 로그인을 해야 합니다. 한 사용자가 오랫동안 상주하는 서비스라면 서비스를 이용하는 도중에 갑자기 인증이 만료되어 로그인창이 뜨는 경우를 볼 수 있습니다.로그인 전략

긴 만료 시간을 설정

짧은 만료 시간을 설정했을 때의 단점을 상쇄하기 위해 2주에서 한달 정도로 만료 시간을 길게 주면 어떨까요? 당연하게도 위에서 살펴본 장, 단점과 정반대의 상황이 벌어집니다.

  • 사용자가 로그인을 자주 할 필요가 없습니다.
  • 기기나 AccessToken이 탈취되면 오랫동안 제약 없이 사용이 가능합니다.

Sliding Sessions 전략과 함께 AccessToken 사용

보안성과 편의성 모두를 잡을 수는 없을까를 고민하다가 나온 것이 Sliding Sessions 전략입니다. 이 로그인 전략 전략은 세션을 지속적으로 이용하는 유저에게 자동으로 만료 기한을 늘려주는 방법입니다.

구현 방법은 다양합니다만 주로 유효한 AccessToken을 가진 클라이언트의 요청에 대해 서버가 새로운 AccessToken을 발급해주는 방법을 사용합니다. 매 요청마다 새로운 토큰을 내려주는 것도 가능하지만, 글을 작성하다가 인증이 만료되는 참담한 경우를 막기 위해 글 작성을 시작할 때 발급해준다거나, 쇼핑몰에서 장바구니에 아이템을 담는 경우에 발급해주는 등의 전략을 사용하는 것도 괜찮은 방법입니다. 또 클라이언트가 토큰의 iat(토큰 발급 시간)속성을 참조해서 갱신 요청을 하는 방법도 있습니다.

이 방법을 활용하면 AccessToken만을 이용해 인증을 처리할 때 있었던 단점을 보완해 줄 수 있습니다.

  • 사용자가 로그인을 자주 할 필요가 없습니다.
  • 글을 작성하거나 결제를 하는 등의 세션 유지가 필요한 순간에 세션이 만료되는 문제를 방지 할 수 있습니다.
  • 접속이 주로 단발성으로 이루어지는 서비스의 경우 Sliding Sessions 전략의 효과가 로그인 전략 크지 않습니다.
  • 긴 만료 시간을 갖는 AccessToken을 사용하는 경우 로그인을 전혀 하지 않아도 되는 경우가 발생합니다.

AccessToken과 RefreshToken을 사용

사용자가 로그인을 할 때에 AccessToken과 함께 그에 비해 긴 만료 시간을 갖는 RefreshToken을 클라이언트에 함께 발급합니다. 주로 AccessToken은 30분 내외, RefreshToken은 2주에서 한달 정도의 만료 기간을 부여합니다.

클라이언트는 AccessToken이 만료되었다는 오류를 받으면 따로 저장해두었던 RefreshToken을 이용하여 AccessToken의 재발급을 요청합니다. 서버는 유효한 RefreshToken으로 요청이 들어오면 새로운 AccessToken을 발급하고, 만료된 RefreshToken으로 요청이 들어오면 오류를 반환해, 사용자에게 로그인을 요구합니다.

AccessToken은 서버에 따로 저장해 둘 필요가 없지만, RefreshToken의 경우 서버의 stroage에 따로 저장해서 이후 검증에 활용해야 합니다. 그러므로 RefreshToken을 이용한다는 것은 추가적인 I/O 작업이 필요하다는 의미이며, 이는 I/O 작업이 필요없는 빠른 인증 처리를 장점으로 내세우는 JWT의 스펙에 포함되지 않는 부가적인 기술입니다.

RefreshToken은 탈취되어서는 곤란하므로 클라이언트는 보안이 유지되는 공간에 이를 저장해두어야 합니다.

RefreshToken은 서버에서 따로 저장을 하고 있기 때문에 강제로 토큰을 만료시키는 것이 가능합니다.

  • 짧은 만료 기간을 사용 할 수 있기 때문에 AccessToken이 탈취되더라도 제한된 기간만 접근이 가능합니다.
  • 사용자가 로그인을 자주 할 필요가 없습니다.
  • RefreshToken에 로그인 전략 대한 만료를 강제로 설정 할 수 있습니다.
  • 클라이언트는 AccessToken의 만료에 대한 연장 요청을 구현해야 합니다.
  • 인증 만료 기간의 자동 연장이 불가능합니다.
  • 서버에 별도의 storage를 만들어야 합니다.

Sliding Sessions 전략과 함께 AccessToken과 RefreshToken을 사용

AccessToken의 Sliding Sessions 전략이 AccessToken 자체의 만료 기간을 늘려주었다면, 이 전략은 RefreshToken의 만료 기간을 늘려줍니다.

RefreshToken의 만료 기간이 늘어나기 때문에 AccessToken + Sliding Sessions 전략처럼 빈번하게 만료 기간 연장을 해줄 필요가 없고, 사용자의 유휴 허용 기간을 RefreshToken 기간에 근접하게 늘려줍니다.

반면 사용자가 접속을 뜸하게 하는 경우에도 RefreshToken의 만료 기간의 늘어나기 때문에, 핸드폰이 탈취되는 등의 경우에 지속적인 이용이 가능 할 수 있습니다. 이를 막는 방법으로 인증이 확실히 요구되는 경우 비밀번호를 한번 더 묻는다거나, 비밀번호 변경 등의 이벤트가 발생 할 때 강제로 RefreshToken을 만료시키는 처리를 해주는 것이 좋습니다.

  • RefreshToken의 만료 기간에 대한 제약을 받지 않습니다.
  • 글을 작성하거나 결제를 하는 등의 세션 유지가 필요한 순간에 세션이 만료되는 문제를 방지 할 수 있습니다.
  • 서버에서 강제로 RefreshToken을 만료하지 않는 한 지속적으로 사용이 가능합니다.
  • 인증이 추가로 요구되는 경우에 대한 보안 강화가 필요합니다.

일반적인 웹 서비스처럼 cookie등을 이용해 세션 관리를 하는 방식을 사용할 수 없는 stateless한 REST API등은 토큰 방식의 보안을 이용 할 수 밖에 없습니다. stateless하기 때문에 매 요청에 대한 인증을 거쳐야 하는데, 이는 데이터베이스 등으로부터 토큰을 얻어오는 추가적인 I/O 작업이 불가피하고 이는 성능의 하락으로 이어집니다. 이를 해결해주기 위한 솔루션이 바로 JWT입니다.

JWT는 이런 장점과 함께 위에서 살펴봤듯이 여러가지 문제점들이 존재합니다. 토큰의 탈취에 대한 취약성, 서버의 클라이언트 제어 불가, 빈번한 로그인 요청 등의 문제에 대한 해결 방법은 RefreshToken이나 Sliding Sessions 등의 전략을 도입하는 것입니다. 하지만 이러한 전략들 역시 추가적인 IO 작업을 위한 성능 감소나, 편의를 위해 보안이 취약해지는 상황등이 발생할 가능성이 있습니다.

서비스가 결제가 필요한 보안에 민감한 컨텐츠를 다루고 있다면 비밀번호 한번 더 입력하는 것이 크게 문제가 되지 않습니다. 반면, 게시물에 로그인 전략 글을 작성할때마다 비밀번호를 입력해야 한다면 사용자들은 매우 귀찮아 할 것입니다. 결국 모든 것을 얻을 수는 없습니다. 서비스마다 가진 고유한 특성을 고려해 보안 수준을 높일지, 사용자 편의성을 높일지를 결정해야 합니다.

Google Ads 에디터에서 입찰 전략 관리

Google Ads 에디터에서 다음과 같은 입찰 전략을 사용할 수 있습니다. 계정의 신규 또는 기존 캠페인에 입찰 전략을 사용할 수 있습니다.

  • 타겟 광고 투자수익(ROAS)
  • 타겟 CPA
  • 타겟 노출 점유율
  • 전환수 최대화
  • 전환 가치 극대화
  • 클릭수 최대화
  • 수동 CPC
  • 수동 CPM
  • 수동 CPV

계정의 캠페인에 포트폴리오 입찰 로그인 전략 전략을 적용할 수도 있습니다. 새 포트폴리오 입찰 전략은 편집기에서 만들 수 없습니다.

입찰 전략 보기 및 수정하기

계정의 기존 입찰 전략을 보려면 캠페인 탭의 두 항목 입찰 전략 유형 및 입찰 전략을 참조하세요.

계정에서 하나 이상의 항목에 대한 입찰 전략을 수정하는 방법은 다음과 같습니다.

  1. 캠페인 탭을 선택합니다.
  2. 데이터 보기에서 하나 이상의 캠페인을 선택합니다.
  3. 수정 패널에서 '입찰 전략' 섹션의 수정 링크를 클릭합니다.
  4. 적용할 입찰 전략을 선택합니다.
  5. 확인을 클릭합니다.

입찰 전략 일괄 가져오기

CSV 가져오기 또는 캠페인의 '여러 항목 변경' 도구를 사용하여 여러 입찰 전략을 업데이트하려면 추가하거나 업데이트할 항목 목록에 '입찰 전략 유형' 및 '입찰 전략' 열을 포함하세요.

입찰 전략 정보가 포함된 캠페인 가져오기의 예는 다음과 같습니다.

수동 CPV를 사용하는 캠페인

가져오기에 입찰 전략을 포함할 경우 주의해야 할 사항은 다음과 같습니다.

  • 포트폴리오 입찰 전략을 적용하려면 '입찰 전략 이름' 항목을 사용합니다. 이 항목에 값이 있으면 Google Ads 에디터에서 '입찰 전략 유형' 항목을 무시합니다.
  • 표준 입찰 전략을 사용하려면 '입찰 전략 유형' 항목을 사용합니다. 예를 들어 '타겟 CPA'를 입력하여 표준 타겟 CPA 입찰 전략을 사용할 수 있습니다.
  • 입찰 전략 항목의 포트폴리오 입찰 전략은 대소문자를 구분합니다. 예를 들어 Google Ads 공유 라이브러리에 'My 로그인 전략 Bid Strategy'라는 이름의 입찰 전략이 있는 경우 Google Ads 에디터에서 'my bid strategy'를 동일한 입찰 전략으로 인식하지 않습니다.

Google Ads 에디터 내에서 캠페인, 광고그룹, 키워드에 다양한 입찰 전략 조합을 적용할 수 있습니다. 하지만 Google Ads에서는 특정한 조합만 허용됩니다. Google Ads에서 허용되지 않는 입찰 전략을 게시하려고 하면 경고 메시지가 표시됩니다.

Session

사용자가 웹 브라우저를 통해 웹 서버에 요청을 보내면 웹 서버는 사용자의 웹 브라우저를 식별하기 위한 세션을 생성한다. 세션을 통해 사용자의 로그인 정보를 저장해, 사용자가 Cookie를 통해 session 정보를 보내면 사용자가 로그인한 상태임을 확인할 수 있다.

세션 관리 전략

웹 서버에 트래픽이 몰리게 될 경우 성능 저하를 막기 위해 서버를 Scale-Out할 수 있다. 이 경우 브라우저의 요청을 처리하는 웹 서버는 여러대가 되며 로드 밸런서가 사용자의 요청을 각 서버에 할당해 줄 수 있다. 이러한 상황에서 사용자의 로그인 정보를 일관되게 저장하고 빠르게 응답을 처리하기 위한 세션 관리 전략이 필요하다.

Sticky Session

웹 브라우저의 요청이 로드밸런서를 거치면서 매 번 다른 서버에게 할당될 수 있다. 이 경우 만약 웹 서버 별로 별도의 세션 저장소를 가지고 있다면 다른 웹 서버에 존재하는 웹 브라우저의 세션 정보가 무시될 수 있다.

이러한 문제점을 해결하기 위한 것이 Sticky Session이다. 웹 브라우저의 요청을 IP나 Cookie를 통해 식별해 특정 서버에서만 처리하게끔 하는 방식이다. 이 방식을 사용하게 되면, 사용자의 요청이 여러 서버에서 처리될 수 없으므로 사용자의 세션 정보가 일관되게 유지된다.

그러나 트래픽의 대부분이 특정 서버에 할당된 사용자들에게서 발생된다면, 로드 밸런싱이 균등하게 이루어지지 않는 상황이 되어 분산 서버의 이점을 활용할 수 없게 된다.

Session Clustering

여러 서버 간 독립된 세션 저장소를 사용함으로써 발생하는 단점을 해결하기 위해 Session Clustering을 사용할 수 있다. Session Clustering는 여러 서버들이 세션 저장소를 공유하는 것이다. Session clustering은 각 서버의 세션 저장소는 유지한 채로 동기화 시키는 방식과 독립된 세션 스토리지를 구성하는 두 가지 방식으로 나뉜다.

세션 저장소 복제 - 모든 서버 끼리 동일한 세션 저장소를 갖는 방식이다. 한 세션 저장소에서 발생한 변화는 다른 서버의 세션 저장소로 복제된다. 이 방식을 사용할 경우 한 세션 저장소에 오류가 발생하더라도 복구가 가능하다. 그러나 서버의 숫자 만큼 복제시키는데 발생하는 비용이 증가하기 때문에 Scale-Out이 많이 진행될수록 비효율적이 된다.

독립된 세션 스토리지 - 각 로그인 전략 서버와 연결된 독립된 저장소를 구성하는 것이다. 여러 대의 서버가 하나의 세션 저장소를 공유하기 때문에 데이터의 동기화를 위한 비용이 발생하지 않는다. 일반적으로 Redis와 같은 In-memory 저장소를 활용하며, 일반적인 관계형 데이터베이스 저장소도 사용할 수 있다.

Array ( [name] => 분류별도서 [url] => /chn/shop/lists [depth2] => Array ( [0] => Array ( [name] => 첫걸음 [url] => /chn/shop/lists?category=11 ) [1] => Array ( [name] => 회화 [url] => /chn/shop/lists?category=12 ) [2] => Array ( [name] => 新HSK [url] => /chn/shop/lists?category=13 ) [3] => Array ( [name] => 그 외 수험서 [url] => /chn/shop/lists?category=14 ) [4] => Array ( [name] => 어린이 중국어 [url] => /chn/shop/lists?category=15 ) [5] => Array ( [name] => 어법/작문/쓰기 [url] => /chn/shop/lists?category=16 ) [6] => Array ( [name] => 독해/시사/통번역 [url] => /chn/shop/lists?category=17 ) [7] => Array ( [name] => 로그인 전략 어휘/표현/청취 [url] => /chn/shop/lists?category=18 ) [8] => Array ( [name] => 비즈니스/무역/관광 [url] => /chn/shop/lists?category=19 ) [9] => Array ( [name] => 기타/단행본 [url] => /chn/shop/lists?category=20 ) [10] => Array ( [name] => 교양도서 [url] => /chn/shop/lists?category=72 ) ) ) [50] => Array ( [name] => 추천도서 [url] => /chn/shop/recommend ) [60] => Array ( [name] => 동영상강의도서 [url] => /chn/shop/video ) [70] => Array ( [name] => 자료실 [url] => /chn/board/lists/data ) [80] => Array ( [name] => 공지사항 [url] => /chn/board/lists/notice [depth2] => Array ( [10] => Array ( [name] => 공지사항 [url] => /chn/board/lists/notice ) [20] => Array ( [name] => 1:1문의 [url] => /chn/board/lists/qna ) [30] => Array ( [name] => MP3 [url] => /chn/board/lists/mp3 ) [40] => Array ( [name] => 자료실 [url] => /chn/board/lists/data ) [50] => Array ( [name] => FAQ [url] => /chn/board/lists/faq ) ) ) ) -->

외국어 하면 가장 먼저 떠오르는 이름
시사북스가 되겠습니다.

회원 로그인 (MEMBER LOGIN)

ID/PASSWORD 아이디나 비밀번호가 기억나지 않으세요?
로그인 오류 문의: [email protected]


0 개 댓글

답장을 남겨주세요