프로그래머스 데브코스 웹 풀사이클 7주차 1일차

geun·2023년 12월 24일
0

데브코스

목록 보기
23/79
post-thumbnail

세션(Session)

인증과 인가

인증(Authentication) : 내가 누구인지 확인하는 행위이다.

쇼핑몰을 예로 들면, 장바구니, 상품 구매, 마이 페이지 등의 기능을 사용하기 위해 사용한다.

인가(Authorization) : 장치 및 사용자 엑세스 권한을 허용/거부하는 행위이다.

고객 페이지 / 관리자 페이지 등, 사람에 따라 접근할 수 있는 페이지를 다르게 하기 위해 사용한다.

쿠키 vs 세션 vs JWT

쿠키(Cookie) : 클라이언트 로컬에 저장되어 있으며 key와 value로 구성된 작은 데이터 파일이다.

장점 : 서버가 저장하지 않기 때문에 부담이 없다. (RESTful)
단점 : 보안이 취약하다.

세션(Session) : 세션의 단점인 보안이 취약하다는 점을 보안해서 나온 것이 세션이다.

장점 : 보안이 비교적 좋아졌다.
단점 : 서버가 저장을 하기 때문에 서버에 부담을 줄 수 있다.

JWT(Json Web Token) : 쿠키와 토큰의 단점을 보완해서 나온 것이 JWT(토큰) 이다.

JWT(Json Web Token)

JSON 형태의 데이터를 안전하게 전송하기 위한 웹 토큰이다.

토큰(Token)

클라이언트에서 인증 정보를 보관하는 방법으로, 권한을 확인하기 위한 수단이다.

장점

  • 보안이 강하다.(암호화가 되어있다.)
  • 서버가 상태를 저장하지 않는다.(Stateless하다 = HTTP 특징을 잘 따른다.)

구조

https://jwt.io/

Header(Algorithm & Token Type)

  • alg : 해싱 알고리즘을 지정한다.
  • typ : 토큰의 타입을 지정해준다.

ex)

{
  "typ": "JWT",
  "alg": "HS256"
}

Payload(Data)

정보를 담고 있으며, 크게 세가지로 나뉘어 진다.

  • 등록된(registered) 클레임 : 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임이다.
  • 공개(public) 클레임 : 공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓는다.
  • 비공개(private) 클레임 : 등록된 클레임도, 공개된 클레임도 아니며, 양 측간의 협의하에 사용하는 클레임들이다.

ex)

{
    "iss": "velopert.com",
    "exp": "1485270000000",
    "https://velopert.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "velopert"
}

Verify Signature

헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.
ex)

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Node.js에서 JWT 구현

npm i jsonwebtoken 으로 설치.

let jwt = require("jsonwebtoken");
let token = jwt.sign({ foo: "bar" }, "shhhhhhhh");

console.log(token);

출력
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE3MDM0MzcwMTZ9.qrtZfH9srREz9CtXFdV5ClSzSH-L7YiX76xxmZyKL4Y

Decode

오늘의 소감

크리스마스다!(강의가 있다...) 물론 약속은 없어서 크게 신경쓰이진 않지만 공휴일인데 강의가 있어서 아주 약간은 당황을 했다. 그래도 남는게 시간이고 놀아서 뭐할까 주말을 잘 쉬었으니 공부를 열심히 해야겠지라는 생각으로 열심히 공부해야겠다.

0개의 댓글