29. header.authorization, 예외처리(try-catch)

JSLEE·2024년 6월 3일

header.authorization

JWT를 발행하고 이를 Cookie에 JWT를 담아서 전달했을 때, JWT는 클라이언트의 웹브라우저의 쿠키에 남게 된다. 이 때, 클라이언트가 Cookie에 JWT를 담아서 또 다시 request할 경우에는 보안적으로 좋지 않게 된다. (쿠키를 탈취당한다거나, 웹브라우저의 쿠키데이터가 남아있다거나.)
따라서, 클라이언트는 request의 header에 authorization 이라는 key값에 JWT를 담아서 보내야 한다.

먼저 Postman을 이용해서 API를 요청하여 JWT를 발행받는다.

위처럼, 클라이언트의 Cookies에는 token이 추가된 것을 확인할 수 있다.
다음 request부터는 token의 Value 값을 복사해서 Headers의 Authorization 에 추가한다.

이렇게 JWT를 주고받는다면 보안을 더 강화시켜 API를 이용할 수 있다.

이에 따라, 백엔드에서는 req.cookies.token 대신, req.header.authorization 을 사용하여 JWT를 decode한다.

let token = req.headers["authorization"]
const id = jwt.verify(token, process.env.PRIVATE_KEY) ;  // payload

JWT를 발행할 때, expiresIn 옵션으로 유효시간을 제한한다.

const token = jwt.sign({id : 1}, process.env.PRIVATE_KEY, {expiresIn: '1h'});

위 코드에서는 1시간의 JWT의 유효시간이 지정되고, JWT가 만료된 이후에 JWT를 사용하게 되면
TokenExpiredError가 발생한다.
따라서, 이러한 오류들에 대해 예외처리를 해야한다.

이 때 사용하는 것이 try-catch구문이다.

try-catch

try-catch는 예기치 못한 에러를 처리하는 구문이다.
사용법은 간단하다.

try 영역에는 실행해볼 코드를 작성한다.
catch 영역에는 에러가 발생했을 때 작동할 코드를 작성한다.
finally 영역에는, 성공여부와 관계 없이 항상 작동할 코드를 작성한다.

try{
  console.log(name)
  console.log("try구문")
}catch(err){
  console.log(err)
  console.log("name이 정의되지 않았습니다.")
}finally{
  console.log("반드시 실행되는 구문입니다.")
}

위 코드를 살펴보면, name이라는 식별자가 정의되지 않았으므로 오류가 발생할 것이다.
즉, console.log(name) 에서 오류가 발생해서 그 즉시 catch 구문으로 이동한다.
이제 err에는 에러 객체가 전달되고, console.log(err), console.log("name이 정의되지 않았습니다.") 코드가 실행된다.
그리고 맨 마지막에는 finally 구문이 실행되어 console.log("반드시 실행되는 구문입니다.") 문장이 실행된다.
따라서, 다음과 같은 결과가 나타나게 된다.

ReferenceError: name is not defined
    at Object.<anonymous> 
    at Module._compile (node:internal/modules/cjs/loader:1369:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1427:10)
    at Module.load (node:internal/modules/cjs/loader:1206:32)
    at Module._load (node:internal/modules/cjs/loader:1022:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12)
    at node:internal/main/run_main_module:28:49
name이 정의되지 않았습니다.
반드시 실행되는 구문입니다.

그리고, 에러 객체는 우리가 직접 생성할 수도 있다.

let error = new Error("에러 객체")
let syntaxError = new SyntaxError("SyntaxError 발생")
let referencedError = new ReferenceError("ReferenceError 발생")

또한 throw 구문을 이용해서, 고의적으로 오류를 발생시킬 수도 있다.

throw new Error("에러 객체")

throw 구문을 try문에 적절히 사용하여, 원치않는 결과가 나올 때 try 구문의 작동을 중지하고 catch 구문으로 이동하도록 할 수 있다.


profile
공부한 내용들을 정리하기 위해 사용하는 블로그입니다.

0개의 댓글