JavaScript์—์„œ ES ๋ž€?

ECMASCRIPT์˜ ์•ฝ์–ด๋ฅผ ๋œปํ•˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€, ๊ทœ๊ฒฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ์–ด์ด๋‹ค.

 

๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด์„œ

๋น„์˜๋ฆฌ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ธ ECMA ์ธํ„ฐ๋„ค์…”๋„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์š”์ฒญํ•˜์˜€๋‹ค.

 

ES5 ๋Š” 2009๋…„๋„์— HTML5์™€ ํ•จ๊ป˜ ์ถœ์—ฐํ•œ ํ‘œ์ค€ ์‚ฌ์–‘์ด๋ฉฐ,

ES6๋Š” 2015๋…„์— ๋ฒ„์ „์—…์„ํ•˜์—ฌ ์ถœ์‹œํ•œ ๋ฒ„์ „์ด๋‹ค. 

ES6 ์ดํ›„๋กœ๋„ ๋งค๋…„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๊ณ  ์žˆ๊ณ , ์ดํ›„๋ฅผ '๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์•„๋ž˜์—๋Š” ES6์— ํฌํ•จ๋œ

let, const ํ‚ค์›Œ๋“œ /  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ / ํด๋ž˜์Šค / ๋ชจ๋“ˆ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

 

 


 

 

let, const ํ‚ค์›Œ๋“œ

ES5

ES5์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ๋ฒ•์€ var๊ฐ€ ์œ ์ผํ•˜๋‹ค.

 

var :  ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ 

 

๋‹จ์ : 

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ์ง€์› → ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋‚จ๋ฐœ

varํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ → ์•”๋ฌต์  ์ „์—ญ๋ณ€์ˆ˜ ์–‘์‚ฐ

๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ ๋ณ€์ˆ˜๊ฐ’์˜ ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…  → ์„ ์–ธํ•˜๊ธฐ ์ด์ „์— ์ฐธ์กฐ

 

 

ES6

 var ํ‚ค์›Œ๋“œ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ์œ„ํ•ด

let๊ณผ const ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค. 

 

const : ์ƒ์ˆ˜(๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’, ์žฌํ• ๋‹น x)

let : ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๊ฐ’

 

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ์ง€์—ญ๋ณ€์ˆ˜{ } ์—์„œ ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋กœ๋‚ด์—์„œ๋งŒ ์œ ํšจ

๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ๊ธˆ์ง€ →  ์ค‘๋ณต ์„ ์–ธ์‹œ, ๋ฌธ๋ฒ•์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

ํ˜ธ์ด์ŠคํŒ… ๋ณ€์ˆ˜ ์„ ์–ธ ์ด์ „์—๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. 

 

๋ณ€์ˆ˜ ์„ ์–ธ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ const๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , 

let์€ ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์›จ ํ•œ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

์ „์—ญ ๋ณ€์ˆ˜ (Global scope)
์ „์—ญ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๋ฉฐ, ์–ด๋””์—์„œ๋“ ์ง€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ง€์—ญ ๋ณ€์ˆ˜ (Local scope of Function-level scope)
์ง€์—ญ(ํ•จ์ˆ˜) ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๋ฉฐ, ๊ทธ ์ง€์—ญ๊ณผ ๊ทธ์ง€์—ญ์˜ ํ•˜๋ถ€์ง€์—ญ์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ (Function-level scope) 
ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจ, ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. 
์ฆ‰, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜ / ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ  ๋ณ€์ˆ˜

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ (Block-level scope)
๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก(ํ•จ์ˆ˜ if๋ฌธ, for๋ฌธ, while๋ฌธ, try/catch ๋ฌธ ๋“ฑ)๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ถˆ๋ก ๋‚ด์—์„œ๋งŒ ์œ ํšจ, 
์ฝ”๋“œ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ๋Š” 

 

 

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow function)์˜ ์„ ์–ธ

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” functionํ‚ค์›Œ๋“œ ๋Œ€์‹  (=>)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง€์ • ๋ฐฉ๋ฒ•
    () => { ... } // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
     x => { ... } // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•œ ๊ฐœ์ธ ๊ฒฝ์šฐ, ์†Œ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
(x, y) => { ... } // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ, ์†Œ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

 

ES5๋ณด๋‹ค  ES6์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ข€๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„๋œ๋‹ค.

// ES5
var pow = function (x) { return x * x; };
console.log(pow(10)); // 100

// ES6
const pow = x => x * x;
console.log(pow(10)); // 100

๊ธฐ์กด์˜ ํ•จ์ˆ˜์™€ this ๋ฐ”์ธ๋”ฉ์ด ๋‹ค๋ฅด๋ฉฐ,

Lexical this๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค.

(์ด ๋ถ€๋ถ„์€ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ๊ฐ™๋‹ค.)

 

 

 

ํด๋ž˜์Šค(Class)

ES5

์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…, ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

// ES5
var Person = (function () {
  // Constructor
  function Person(name) {
    this._name = name;
  }

  // public method
  Person.prototype.sayHi = function () {
    console.log('Hi! ' + this._name);
  };

  // return constructor
  return Person;
}());

var me = new Person('Lee');
me.sayHi(); // Hi! Lee.

console.log(me instanceof Person); // true

 

 

ES6

๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ๋‹จ์ˆœ๋ช…๋ฃŒํ•œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์œผ๋กœ Classํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

 

// ํด๋ž˜์Šค ์„ ์–ธ๋ฌธ
class Person {
  // constructor(์ƒ์„ฑ์ž)
  constructor(name) {
    this._name = name;
  }

  sayHi() {
    console.log(`Hi! ${this._name}`);
  }
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const me = new Person('Lee');
me.sayHi(); // Hi! Lee

console.log(me instanceof Person); // true

(๋””ํ…Œ์ผํ•œ ๋‚ด์šฉ์€ ์ถ”๊ฐ€ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ• ๊ฒƒ๊ฐ™๋‹ค.)

 

 

 

๋ชจ๋“ˆ (Module)

๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„์  ์š”์†Œ๋กœ์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋งํ•œ๋‹ค. 

๋ชจ๋“ˆ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์บก์Šํ™”ํ•˜๊ณ  ๊ณต๊ฐœ๊ฐ€ ํ•„์š”ํ•œ API๋งŒ์„ ์™ธ๋ถ€์— ๋…ธ์ถœํ•œ๋‹ค.

 

๋ชจ๋“ˆ์€ ํŒŒ์ผ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. 

 

script ํƒœ๊ทธ์— type="module" ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“ˆ๋กœ์„œ ๋™์ž‘ํ•œ๋‹ค. 

ES6 ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋Š” ๋ชจ๋“ˆ์ž„์„ ๋ช…ํ™•ํ•˜๊ธฐ ์œ„ํ•ด mjs๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค.

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

 

๋ชจ๋“ˆ์€ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค. 

๋ชจ๋“ˆ ๋‚ด์—์„œ var ํ‚ค์›๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋”์ด์ƒ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ

window ๊ฐ์ฒด ํ”„๋กœํผ๋””๋„ ์•„๋‹ˆ๋‹ค.

// foo.mjs
var x = 'foo';

console.log(x); // foo
// ๋ณ€์ˆ˜ x๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค.
console.log(window.x); // undefined
// bar.mjs
// ๋ณ€์ˆ˜ x๋Š” foo.mjs์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ x์™€ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ด๋‹ค.
var x = 'bar';

console.log(x); // bar
// ๋ณ€์ˆ˜ x๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค.
console.log(window.x); // undefined
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="foo.mjs"></script>
  <script type="module" src="bar.mjs"></script>
</body>
</html>

 

 

Export: ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.

// lib.mjs
const pi = Math.PI;

function square(x) {
  return x * x;
}

class Person {
  constructor(name) {
    this.name = name;
  }
}

// ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ณต๊ฐœ
export { pi, square, Person };

 

 

Import: ๋ชจ๋“ˆ์—์„œ ๊ณต๊ฐœํ•œ (export)ํ•œ ๋Œ€์ƒ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด import ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜์˜ import 3๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

// app.mjs
// ๊ฐ™์€ ํด๋” ๋‚ด์˜ lib.mjs ๋ชจ๋“ˆ์„ ๋กœ๋“œ.
// lib.mjs ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž๋กœ importํ•œ๋‹ค.
// ES6 ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
import { pi, square, Person } from './lib.mjs';                      // import ์ฒซ๋ฒˆ์งธ ๋ฐฉ์‹
import * as lib from './lib.mjs';                                    // import ๋‘๋ฒˆ์งธ ๋ฐฉ์‹
import { pi as PI, square as sq, Person as P } from './lib.mjs';     // import ์„ธ๋ฒˆ์งธ ๋ฐฉ์‹

console.log(pi);         // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }

 

 

<์ฐธ๊ณ ์šฉ>

lib.mjs / app.mjs / html ์—์„œ import์™€ export ๋™์ž‘ ์‚ฌ์šฉ๋ฐฉ๋ฒ• 

// lib.mjs
export default x => x * x;
// app.mjs
// ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
// ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋Š” .mjs๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.
import square from './lib.mjs';

console.log(square(10)); // 100
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="./lib.js"></script>
  <script type="module" src="./app.js"></script>
</body>
</html>

 

 

'์˜ค๋Š˜์˜ ๊ณ„์ ˆ, ์˜ค๋Š˜์˜ ๋…ธ๋ž˜' ๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ

JWT๋ฐฉ์‹์œผ๋กœ ๋กœ๊ทธ์ธ+ํšŒ์›๊ฐ€์ž…์„  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ณด์•˜์ง€๋งŒ, 

JWT์™€ ์นœํ•ด์ง€์ง€ ์•Š์•„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•ด๋ณด์•˜๋‹ค.

 


JWT ๋Š” ๋ฌด์—‡์ผ๊นŒ?

JWT๋Š” JSON Web Token์˜ ์•ฝ์ž๋กœ ์ „์ž ์„œ๋ช… ๋œ URL-safe (URL๋กœ ์ด์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ž ๋งŒ ๊ตฌ์„ฑ๋œ)์˜ JSON์ž…๋‹ˆ๋‹ค.

 

 

JWS (Jason Web Signature) : JSON์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ URL-safe ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ

JWE (Jason Web Encryption) : JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•

*URL Safe : URL์— ํฌํ•จ ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

 

 

 

JWT ํ† ํฐ ๊ตฌ์„ฑ

JWT ํ† ํฐ ๊ตฌ์„ฑ์€ ํ—ค์–ด(header) + ํŽ˜์ด๋กœ๋“œ(payload) + ์„œ๋ช…(Signature)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ,

๊ฐ ๋ถ€๋ถ„์€  Base64๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด ํ‘œํ˜„๋œ๋‹ค. 

 

ํ—ค์–ด(header) : ํ† ํฐ์˜ ์œ ํ˜• (JWT) +  HMAC, HS256(SHA256) ๋˜๋Š” RSA์™€ ๊ฐ™์€ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํŽ˜์ด๋กœ๋“œ(payload) : ํ† ํฐ์— ๋‹ด์„ (name/value)๋ฅผ ํ•œ์Œ์œผ๋กœ ์ด๋ฃฌ ํด๋ ˆ์ž„(claim)์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. 
                                   ํด๋ ˆ์ž„ ์ •๋ณด๋Š” ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„, ๊ณต๊ฐœ ํด๋ ˆ์ž„, ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์„œ๋ช…(Signature) : secret key๋ฅผ ํฌํ•จํ•˜์—ฌ ์•”ํ˜ธํ™” ๋˜์–ด์žˆ๋‹ค.

 

 

JWT Process 

- ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š์•„, ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค.

- ๋กœ๊ทธ์•„์›ƒ ์‹œ, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์ €์žฅ๋œ JWT ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

 

 

 JWT์˜ ์ ์šฉ

  • ํšŒ์›์ธ์ฆ : JWT์˜ ๊ฐ€์žฅ ํ”ํ•œ ๋ฐฉ๋ฒ• 
  • ์ •๋ณด๊ต๋ฅ˜ : ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œ ์•ˆ์ •์„ฑ์žˆ๊ฒŒ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.  
                    ์ •๋ณด๊ฐ€ ์„œ๋ช…๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณด๋‚ธ์ด๊ฐ€ ๋ฐ”๋€Œ์ง„ ์•Š์•˜๋Š”์ง€ ๋„์ค‘์— ์กฐ์ž‘๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

JWT ์žฅ์   

  • ์‚ฌ์šฉ์ž ์ธ์ฆ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋Š” ํ† ํฐ ์ž์ฒด์— ํฌํ•จ๋˜์–ด ๋ณ„๋„ ์ธ์ฆ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค.
  • ๋””๋ฒ„๊น… ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • ํŠธ๋ž˜ํ”ฝ ๋ถ€๋‹ด์ด ๋‚ฎ๋‹ค.    
  • ๋…๋ฆฝ์ ์ธ JWT

 

JWT ๋‹จ์  

  • ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ• ์ˆ˜๋ก ํ† ํฐ์ด ์ปค์ ธ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. 
  • JWT๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„ ์ œ์–ด๊ฐ€ ์–ด๋ ต๋‹ค. 
  • ์ž„์˜๋กœ ํ† ํฐ์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์–ด 'ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„'์„ ๊ผญ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • Payload ๋Š” ์•”ํ˜ธํ™” ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—
  • JWE๋ฅผ ์•”ํ˜ธํ™” ํ•˜๊ฑฐ๋‚˜ Payload์— ์ค‘์š”ํ•œ ๋ฐ์ž‰ํ„ฐ๋ฅผ ๋„ฃ์ง€ ๋ง์•„์•ผํ•œ๋‹ค.

 

 

 

 

opennaru blog, 'JWT(JSON Web Token) ์ดํ•ด์™€ ํ™œ์šฉ' ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

ํ”„๋กœ์ ํŠธ: ์˜ค๋Š˜์˜ ๊ณ„์ ˆ ์˜ค๋Š˜์˜ ๋…ธ๋ž˜

์„ค๋ช…: ๊ณ„์ ˆ๊ฐ์„ ๋ณด๋‹ค ๊ฐ๊ฐ์ ์œผ๋กœ ๋Š๋‚„ ์ˆ˜ ์žˆ๋„๋ก ๋ด„, ์—ฌ๋ฆ„, ๊ฐ€์„ ๊ฒจ์šธ์„ ๋งŒ๋ฝํ•  ์ˆ˜ ์žˆ๋Š”, ํ˜น์€ ์ง€๋‚˜๊ฐ„ ๊ณ„์ ˆ๋“ค์„ ๋– ์˜ค๋ฅด๊ฒŒ ํ•˜๋Š” ๋…ธ๋ž˜ ์ถ”์ฒœ ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. 

์ œ์ž‘: 2022. 03. 07 ~ 2022. 03. 11

 

http://sparta-jhh.shop

์‹œ์—ฐ ์˜์ƒ:  https://youtu.be/czaQvEnr6Ts

๊นƒํ—ˆ๋ธŒ:  https://github.com/tayyoon/week1

 


์ดˆ์•ˆ

๋กœ๊ทธ์ธํŽ˜์ด์ง€ (๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ„๋‹ค)

 

๋ฉ”์ธํŽ˜์ด์ง€


์‚ฌ์šฉ ๊ธฐ์ˆ 
  • Server: AWS EC2 (Ubuntu 18.04 LTS)
  • Framework: Flask (Python)
  • Database: MongoDB
  • front-end: HTML5, CSS3, Javascript, Jquery, bootstrap

ํ•ต์‹ฌ ๊ธฐ๋Šฅ
  • ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…
    • ์•„์ด๋”” ์ค‘๋ณตํ™•์ธ ๊ธฐ๋Šฅ
    • ํšŒ์›๊ฐ€์ž…์‹œ ์•„์ด๋”” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ๋ฉ”์ธํŽ˜์ด์ง€
    • ์นด๋“œ์ถœ๋ ฅ: URL, ๊ณ„์ ˆ, ์ฝ”๋ฉ˜ํŠธ ์ž…๋ ฅ์‹œ ์นด๋“œ์ถœ๋ ฅ
    • ์ฝ”๋ฉ˜ํŠธ์ˆ˜์ •: ์นด๋“œ ์„ ํƒ์‹œ ๋ชจ๋‹ฌํ™”๋ฉด์—์„œ ํƒ€์ดํ‹€, ์ฝ”๋ฉ˜ํŠธ ์ž…๋ ฅ์‹œ ํ•ด๋‹น์นด๋“œ ์ˆ˜์ •
    • ํšŒ์›๋งŒ ์ด์šฉ๊ฐ€๋Šฅ:  ๋กœ๊ทธ์ธํ•œ ์•„์ด๋””๋กœ ์—ฐ๊ฒฐ๋œ ๋‹‰๋„ค์ž„์œผ๋กœ ํ™•์ธ๊ฐ€๋Šฅ
    • ๋กœ๊ทธ์•„์›ƒ: ์ƒ๋‹จ์˜ 'logout' ์„ ํƒ์‹œ ๋กœ๊ทธ์•„์›ƒ

Trouble Shooting

โ–ถ ํŒŒ์ด์ฌ๊ณผ ๋„๋ฉ”์ธ ๊ตฌ๋™ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ ๋„๋ฉ”์ธ์ด์šฉ์‹œ ๋กœ๊ทธ์ธ์‹œ ๋ฉ”์ธํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์•˜์Œ

→  ํŒŒ์ด์ฌ ์ด์šฉ์‹œ, "decode(utf-8)' ์ฃผ์„์ฒ˜๋ฆฌ / ๋„๋ฉ”์ธ์ด์šฉ์‹œ,  "decode(utf-8)' ์ฃผ์„์ฒ˜๋ฆฌ ํ•ด์ œ๋กœ ํ•ด๊ฒฐ

 

โ–ถ ๋กœ๊ทธ์ธ์‹œ, ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ–ˆ์Œ.

→  login.html ์— <head>์™€<body> ์‚ฌ์ด์˜ <scirpt>๋ฅผ ๋„ฃ์Œ์œผ๋กœ์„œ ํ•ด๊ฒฐ

 

โ–ถ ๋ฉ”์ธํŽ˜์ด์ง€, ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ DB์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๋‹ค ๋ณด๋‹ˆ ์ฝ”๋ฉ˜ํŠธ/ํ•˜ํŠธ ์ˆ˜์ •์‹œ ์ฒซ ์นด๋“œ๋งŒ ์—ฐ๊ฒฐ์ด ๋˜์–ด ์ˆ˜์ •์ด ๋ถˆ๊ฐ€

→ ์ถ”ํ›„์— ๋ณด์™„์ด ํ•„์š”ํ•œ ๋ฌธ์ œ

+ Recent posts