10 λΆ„ μ†Œμš”

1. JCA & JCE

1-1. μ†Œκ°œ 및 ꡬ쑰

βœ“ JCA (Java Cryptography Architecture) & JCE (Java Cryptography Extention) μ†Œκ°œ

  • μžλ°”λŠ” JCA & JCE ν”„λ ˆμž„μ›Œν¬ λ₯Ό 톡해 자체적인 λ³΄μ•ˆ κ΄€λ ¨ κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  있으며 μ „μžμ„œλͺ…(Digital Signature), λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈ(Message Digest, hashs), μΈμ¦μ„œμ™€ μΈμ¦μ„œ μœ νš¨μ„± 검사(Certificate Validation), ν‚€ 생성 및 관리 그리고 λ³΄μ•ˆ 랜덀 수(Secure Random Number) 생성 λ“± ν˜„λŒ€ 정보 톡신 μ•”ν˜Έ 기술 μ€‘μ—μ„œ ν•„μˆ˜μ μΈ 것은 λͺ¨λ‘ μ œκ³΅ν•˜κ³  μžˆλ‹€
  • JCA & JCE ν”„λ ˆμž„μ›Œν¬λŠ” ν”„λ‘œλ°”μ΄λ” λ³΄μ•ˆ ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΄μ•ˆκ³Ό κ΄€λ ¨ν•œ λ‹€μ–‘ν•œ APIλ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€
  • ν”„λ‘œλ°”μ΄λ”λŠ” java.security.Provider 클래슀의 κ΅¬ν˜„μ²΄λ‘œ λ³΄μ•ˆ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„μ²΄ λͺ©λ‘μ„ ν¬ν•¨ν•˜κ³  있고 이λ₯Ό 톡해 λ³΄μ•ˆ μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ νŠΉμ • μ•Œκ³ λ¦¬μ¦˜μ˜ μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•΄μ§€λ©΄, JCA & JCE ν”„λ ˆμž„μ›Œν¬λŠ” ν”„λ‘œλ°”μ΄λ” μ €μž₯μ†Œμ—μ„œ ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ˜ μ ν•©ν•œ κ΅¬ν˜„μ²΄ 클래슀λ₯Ό μ°Ύμ•„ 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ”λ° ν”„λ‘œλ°”μ΄λ”λ₯Ό 직접 μ§€μ •ν•  μˆ˜λ„ μžˆλ‹€

βœ“ MessageDigest

  • λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈμ˜ λͺ©μ μ€ 원본 파일이 κ·ΈλŒ€λ‘œμΈμ§€ νŒŒμ•…ν•˜λŠ” 무결성 검사이닀.
  • λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈ μ•Œκ³ λ¦¬μ¦˜μ€ μž…λ ₯ κ°’μœΌλ‘œ μ „λ‹¬λœ λ‹€μ–‘ν•œ 길이의 원본 값을 κ³ μ • 길이 ν•΄μ‹œ κ°’μœΌλ‘œ 좜λ ₯ν•œλ‹€.
  • 이 μ•Œκ³ λ¦¬μ¦˜μ€ 단방ν–₯이기 λ•Œλ¬Έμ— ν•΄μ‹œ κ°’μ—μ„œ 거꾸둜 원본 값을 λ„μΆœν•  수 μ—†λ‹€.
  • κ°‘κ³Ό μ„μ˜ ꡐ신 μƒν™©μ—μ„œ 갑은 μ„μ—κ²Œ μ „λ‹¬ν•˜κ³ μž ν•˜λŠ” 원본과 κ·Έ μ›λ³Έμ˜ λ©”μ‹œμ§€ ν•΄μ‹œ κ°’ 그리고 λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈ μ•Œκ³ λ¦¬μ¦˜μ„ 보낸닀.
  • 을은 갑이 μ „λ‹¬ν•œ μ•Œκ³ λ¦¬μ¦˜κ³Ό 원본을 κ°€μ§€κ³  λ©”μ‹œμ§€ ν•΄μ‹œ 값을 κ³„μ‚°ν•œλ‹€.
  • 을이 κ³„μ‚°ν•œ λ©”μ‹œμ§€ ν•΄μ‹œ κ°’κ³Ό 갑이 μ „λ‹¬ν•œ λ©”μ‹œμ§€ ν•΄μ‹œ 값이 μΌμΉ˜ν•˜λ©΄, 갑이 μ „λ‹¬ν•œ 원본이 λ„€νŠΈμ›Œν¬λ₯Ό 톡해 μ„μ—κ²Œ μ˜€κΈ°κΉŒμ§€ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λŠ” 것을 확인할 수 μžˆλ‹€.

βœ“ Signature

  • SignatureλŠ” μ΄ˆκΈ°ν™” μ‹œ μ œκ³΅λ°›μ€ ν‚€λ₯Ό μ‚¬μš©ν•΄μ„œ 데이터λ₯Ό μ„œλͺ…ν•˜κ³  μ „μž μ„œλͺ…μ˜ μœ νš¨μ„±μ„ 검증 ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

  • μ„œλͺ…
    • Signature κ°μ²΄λŠ” 개인 ν‚€λ‘œ μ„œλͺ… ν•˜κΈ° μœ„ν•΄ μ΄ˆκΈ°ν™”λ˜κ³  μ„œλͺ…ν•  원본 데이터가 μ œκ³΅λœλ‹€.
    • Signature 의 sign() 은 개인 ν‚€λ‘œ 원본 데이터λ₯Ό μ„œλͺ… ν•˜λ©΄ ν•΄μ‹œλœ 데이터λ₯Ό μ•”ν˜Έν™”ν•œ Signature Bytes λ₯Ό λ°˜ν™˜ν•œλ‹€
  • 검증
    • 검증이 ν•„μš”ν•œ 경우 검증을 μœ„ν•΄ Signature객체λ₯Ό 생성 및 μ΄ˆκΈ°ν™”ν•˜κ³  κ°œμΈν‚€μ™€ μŒμ„ μ΄λ£¨λŠ” ν•΄λ‹Ή 곡개 ν‚€λ₯Ό μ œκ³΅ν•œλ‹€.
    • 원본 데이터와 Signature Bytes κ°€ 검증 Signature 객체에 μ „λ‹¬λ˜κ³  verify() λ₯Ό μ‹€ν–‰ν•˜λ©΄ κ³΅κ°œν‚€λ‘œ Signature Bytes 의 ν•΄μ‹œλ°μ΄ν„°λ₯Ό μΆ”μΆœν•˜κ³  원본데이터λ₯Ό ν•΄μ‹œν•œ κ°’κ³Ό λΉ„κ΅ν•΄μ„œ μΌμΉ˜ν•˜λ©΄ Signature 객체가 성곡을 λ³΄κ³ ν•œλ‹€.

  • μ„œλͺ…은 λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈμ™€ λΉ„λŒ€μΉ­ν‚€ μ•”ν˜Έν™”κ°€ κ²°ν•©ν•œ ν˜•νƒœλ‘œμ„œ β€œSHA256WithRSA” 처럼 λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈ μ•Œκ³ λ¦¬μ¦˜μΈ β€œSHA256”을 μ‚¬μš©ν•˜μ—¬ μ΄ˆκΈ°μ— λŒ€κ·œλͺ¨ 데이터λ₯Ό 보닀 κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ κ³ μ •κΈΈμ΄μ˜ ν˜•μ‹μœΌλ‘œ β€œμ••μΆ•β€ν•œ λ‹€μŒ λΉ„λŒ€μΉ­ν‚€ μ•”ν˜Έν™”μΈ β€œRSA” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ³ μ •κΈΈμ΄μ˜ 32λ°”μ΄νŠΈ λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈμ— μ„œλͺ…ν•œλ‹€

βœ“ JCA & JCE ꡬ쑰

  • Cipher
    • μ•”ν˜Έν™” 및 λ³΅ν˜Έν™”μ— μ‚¬μš©λ˜λŠ” μ•”ν˜Έν™” μ•”ν˜Έμ˜ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
    • μ•”ν˜Έν™”λŠ” 일반 ν…μŠ€νŠΈμ™€ ν‚€ λ₯Ό 가져와 μ•”ν˜Έν™”λœ 데이터λ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž„.
    • λ³΅ν˜Έν™”λŠ” μ•”ν˜Έν™”λœ 데이터와 ν‚€λ₯Ό κ°€μ Έμ™€μ„œ 일반 ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” μ—­ 과정이닀.

    • Cipher 객체 μΈμŠ€ν„΄μŠ€ν™”ν•˜κΈ°
      • μΈμŠ€ν„΄μŠ€ 생성 μ‹œ λ³€ν™˜μ„ μ§€μ •ν•˜λŠ”λ° λ³€ν™˜μ€ [μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜/ν”Όλ“œλ°± λͺ¨λ“œ/νŒ¨λ”©] or [μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜] 으둜 μ§€μ •ν•œλ‹€
        • Cipher c1 = Cipher.getInstance(β€œRSA/ECB/OAEPWithSHA1AndMGF1Padding”);
        • Cipher c1 = Cipher.getInstance(β€œRSA”);

    • Cipher μ΄ˆκΈ°ν™”ν•˜κΈ°
      • Cipher 객체λ₯Ό μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•΄μ„œ Cipher의 μž‘λ™ λͺ¨λ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” opmode 와 Key λ˜λŠ” 증λͺ…μ„œ(Certificate) λ₯Ό 인자둜 μ „λ‹¬ν•˜κ³  init() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€
      • opmode
        • ENCRYPT_MODE: cipher 객체λ₯Ό μ•”ν˜Έν™” λͺ¨λ“œλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
        • DECRYPT_MODE: cipher 객체λ₯Ό λ³΅ν˜Έν™” λͺ¨λ“œλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
      • Cipher cipher = Cipher.getInstance(β€œRSA”);
      • cipher.init(Cipher.ENCRYPT_MODE, PrivateKey);

1-2. λŒ€μΉ­ν‚€ & λΉ„λŒ€μΉ­ν‚€

βœ“ λŒ€μΉ­ν‚€ μ•”ν˜Έ(symmetric-key algorithm)

  • μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μ˜ ν•œ μ’…λ₯˜λ‘œ, μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”μ— 같은 μ•”ν˜Έ ν‚€λ₯Ό μ“°λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ˜λ―Έν•œλ‹€.
  • λŒ€μΉ­ ν‚€ μ•”ν˜Έμ—μ„œλŠ” μ•”ν˜Έν™”λ₯Ό ν•˜λŠ” μΈ‘κ³Ό λ³΅ν˜Έν™”λ₯Ό ν•˜λŠ” 츑이 같은 μ•”ν˜Έ ν‚€λ₯Ό κ³΅μœ ν•΄μ•Ό ν•œλ‹€.
  • λΉ„λŒ€μΉ­ ν‚€ μ•”ν˜Έμ—μ„œ 곡개 킀와 λΉ„λ°€ ν‚€λ₯Ό λ³„λ„λ‘œ κ°€μ§€λŠ” 것과 κ΅¬λ³„λ˜λ©° λŒ€λΆ€λΆ„μ˜ λŒ€μΉ­ ν‚€ μ•”ν˜ΈλŠ” λΉ„λŒ€μΉ­ ν‚€ μ•”ν˜Έμ™€ λΉ„κ΅ν•˜μ—¬ 계산 속도가 λΉ λ₯΄λ‹€λŠ” μž₯점을 κ°€μ§„λ‹€.

  • MAC(Message Authentication Code)
    • λ©”μ‹œμ§€ 인증 μ½”λ“œλŠ” 데이터가 λ³€μ‘°(μˆ˜μ •, μ‚­μ œ, μ‚½μž… λ“±) λ˜μ—ˆλŠ”μ§€λ₯Ό 검증할 수 μžˆλ„λ‘ 데이터에 λ§λΆ™μ΄λŠ” μ½”λ“œ
    • ν•΄μ‹œ 값을 μƒμ„±ν•œλ‹€λŠ” μ μ—μ„œ λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈμ™€ λΉ„μŠ·ν•˜μ§€λ§Œ, μ΄ˆκΈ°ν™” μ‹œ λΉ„λ°€ν‚€(SecretKey, λŒ€μΉ­ν‚€)λ₯Ό μš”κ΅¬ν•œλ‹€λŠ” μ μ—μ„œ λ‹€λ₯΄λ‹€.
    • λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈλŠ” 받은 츑이 λˆ„κ΅¬λ“  무결성 검사가 κ°€λŠ₯ν•˜μ§€λ§Œ, MAC은 였직 λ™μΌν•œ λΉ„λ°€ ν‚€λ₯Ό κ°€μ§„ μͺ½μ—μ„œλ§Œ 전달받은 λ©”μ‹œμ§€μ˜ 무결성을 검사 ν•  수 μžˆλ‹€.
    • μ•”ν˜Έν™” ν•΄μ‹œ ν•¨μˆ˜(MD5, SHA256 λ“±)λ₯Ό 기반으둜 ν•˜λŠ” MAC이 잘 μ•Œλ €μ§„ HMAC이닀.
    • HMAC은 λ©”μ‹œμ§€ λ‹€μ΄μ œμŠ€νŠΈ μ•Œκ³ λ¦¬μ¦˜κ³Ό 곡유된 λΉ„λ°€ ν‚€μ˜ μ‘°ν•©μœΌλ‘œ κ°€λŠ₯ν•˜λ©° λ°μ΄ν„°μ˜ 무결성과 κΈ°λ°€μ„±, 솑.μˆ˜μ‹ μžκ°„ 인증을 λ³΄μ¦ν•˜κΈ° μœ„ν•œ μ•”ν˜Έν™” 기법이닀

βœ“ λΉ„ λŒ€μΉ­ν‚€ μ•”ν˜Έ (asymmetric-key algorithm)

  • μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μ˜ ν•œ μ’…λ₯˜λ‘œ, μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”μ— λ‹€λ₯Έ μ•”ν˜Έ ν‚€λ₯Ό μ“°λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ˜λ―Έν•œλ‹€.
  • 외뢀에 μ ˆλŒ€ λ…ΈμΆœλ˜μ–΄μ„œλŠ” μ•ˆλ˜λŠ” κ°œμΈν‚€(Private key)와 곡개적으둜 κ°œλ°©λ˜μ–΄ μžˆλŠ” κ³΅κ°œν‚€(Private key)λ₯Ό 쌍으둜 이룬 ν˜•νƒœμ΄λ‹€
    • A의 κ³΅κ°œν‚€λ₯Ό μ΄μš©ν•˜μ—¬ μ•”ν˜Έν™”λœ λ°μ΄ν„°λŠ” A의 κ°œμΈν‚€λ‘œλ§Œ λ³΅ν˜Έν™”κ°€ κ°€λŠ₯ν•˜λ‹€.
    • A의 κ°œμΈν‚€λ₯Ό μ΄μš©ν•˜μ—¬ μ•”ν˜Έν™”λœ λ°μ΄ν„°λŠ” A의 κ³΅κ°œν‚€λ‘œλ§Œ λ³΅ν˜Έν™”κ°€ κ°€λŠ₯ν•˜λ‹€.
  • λΉ„λŒ€μΉ­ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ 두가지 μ•”ν˜Έν•™μ  문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€
    1. 데이터 λ³΄μ•ˆ : μ†‘μ‹ μž κ³΅κ°œν‚€λ‘œ μ•”ν˜Έν™” -> μ†‘μ‹ μž κ°œμΈν‚€λ‘œ λ³΅ν˜Έν™”λ₯Ό 톡해 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ 전솑할 수 μžˆλŠ” λ³΄μ•ˆ 관점
    2. 인증 : μ†‘μ‹ μž κ°œμΈν‚€λ‘œ μ•”ν˜Έν™” -> μ†‘μ‹ μž κ³΅κ°œν‚€λ‘œ λ³΅ν˜Έν™”λ₯Ό 톡해 λ©”μ‹œμ§€λ₯Ό 인증(뢀인방지)ν•˜λŠ” 것이 λͺ©μ 

  • RSA (Ron Rivest, Adi Shamir, Leonard Adleman μ„Έ μ‚¬λžŒμ˜ 성을 λ”°μ„œ RSA 라고 이름이 뢙은 μ•”ν˜Έ 방식)
    • ν˜„μž¬ SSL/TLS에 κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” κ³΅κ°œν‚€ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 전세계 λŒ€λΆ€λΆ„μ˜ 인터넷 λ±…ν‚Ή(λŒ€ν•œλ―Όκ΅­ 포함)이 이 RSA-2048 μ•”ν˜Έν™”λ₯Ό μ‚¬μš©ν•œλ‹€.

βœ“ Key 생성 λͺ¨λΈ

  • Key
    • JCAμ—μ„œ μ§€μ›ν•˜λŠ” λͺ¨λ“  μ’…λ₯˜μ˜ 킀에 λŒ€ν•œ μ΅œμƒμœ„ μΈν„°νŽ˜μ΄μŠ€
    • Key μΈν„°νŽ˜μ΄μŠ€λŠ” getAlgorithm(), getEncoded(), getFormat() 의 μ„Έ κ°€μ§€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€
      • getAlgorithm() : ν‚€ μ•Œκ³ λ¦¬μ¦˜μ€ 보톡 λŒ€μΉ­ν‚€ μ•”ν˜Έ 방식(AES,DSA λ“±) λ˜λŠ” λΉ„λŒ€μΉ­ν‚€ μ—°μ‚° μ•Œκ³ λ¦¬μ¦˜(RSA)이닀.
      • getEncoded() : κΈ°λ³Έ μΈμ½”λ”©λœ ν˜•μ‹μ˜ ν‚€λ₯Ό λ°˜ν™˜
      • getFormat() : 이 ν‚€μ˜ κΈ°λ³Έ 인코딩 ν˜•μ‹μ˜ 이름을 λ°˜ν™˜(ν‘œμ€€ν˜•μ‹μΈ X509 λ˜λŠ” PKCS8)
  • KeyPair
    • ν‚€ 쌍(곡개 킀와 개인 ν‚€)을 λ³΄κ΄€ν•˜κ³  μ ‘κ·Όν•  수 μžˆλŠ” κΈ°λŠ₯만 μ œκ³΅ν•œλ‹€
  • KeyPairGenerator
    • 곡개 및 개인 ν‚€ μŒμ„ μƒμ„±ν•˜λŠ” 데 μ™„μ „νžˆ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•œλ‹€
  • KeyFactory
    • μ–΄λ–€ ν‚€ 데이터 객체λ₯Ό λ‹€λ₯Έ νƒ€μž…μ˜ ν‚€ 데이터 객체둜 μ „ν™˜ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€

βœ“ Key 계측 ꡬ쑰

2. JWT (JSON Web Token)

2-1. μ†Œκ°œ 및 νŠΉμ§•

βœ“ JOSE (JSON Object Signing and Encryption)

  • JSON λ°μ΄ν„°μ˜ 컨텐츠λ₯Ό μ•”ν˜Έν™” λ˜λŠ” μ„œλͺ…μ˜ ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ IETFμ—μ„œ ν‘œμ€€ν™” ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 기술 μ„ΈνŠΈ
  • κΈ°μˆ μ—λŠ” λ‹€μŒ 사양이 ν¬ν•¨λœλ‹€
    1. JWT (JSON Web Token, RFC7519)
      • ν΄λ ˆμž„ 기반 λ³΄μ•ˆ 값을 λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μœΌλ‘œ 두 λ‹Ήμ‚¬μž 간에 μ•ˆμ „ν•˜κ²Œ μ „λ‹¬λ˜λŠ” ν΄λ ˆμž„μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•œ κ°œλ°©ν˜• ν‘œμ€€
      • JWTλŠ” 인증, κΆŒν•œ λΆ€μ—¬ 및 정보 κ΅ν™˜μ— μ‚¬μš©λœλ‹€
      • JWS λ˜λŠ” JWE λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λœλ‹€
    2. JWS (JSON WEB SIGNITURE, RFC 7515)
      • JSON을 μ‚¬μš©ν•˜μ—¬ λ””μ§€ν„Έ μ„œλͺ… λ˜λŠ” MAC으둜 λ³΄μ•ˆλœ μ½˜ν…μΈ λ₯Ό ν‘œν˜„ν•˜λŠ” 방법
    3. JWE (JSON WEB ENCRYPTION, RFC 7516)
      • JSON을 μ‚¬μš©ν•˜μ—¬ μ˜λ„ν•œ μˆ˜μ‹ μžλ§Œ 읽을 수 μžˆλ„λ‘ μ•”ν˜Έν™”λœ 데이터(토큰)λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν˜•μ‹
    4. JWK (JSON WEB KEY, RFC 7517)
      • HMAC μ΄λ‚˜ 타원 곑선 λ˜λŠ” RSA μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 곡개 ν‚€ μ„ΈνŠΈλ₯Ό JSON 객체둜 λ‚˜νƒ€λ‚΄λŠ” JSON ꡬ쑰
    5. JWA (JSON WEB ALGORITHM, RFC 7518)
      • JWS, JWK 및 JWE에 ν•„μš”ν•œ μ•Œκ³ λ¦¬μ¦˜ λͺ©λ‘μœΌλ‘œ JWS 헀더 및 JWS νŽ˜μ΄λ‘œλ“œμ˜ λ‚΄μš©μ„ μ„œλͺ…ν•˜λŠ” 데 μ‚¬μš©λœλ‹€

βœ“ JWS ꡬ쑰

  • JOSE Header
    • 일반적으둜 JWT인 토큰 μœ ν˜•κ³Ό HMAC SHA256 λ˜λŠ” RSA 와 같은 μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜μ˜ 두 λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λœλ‹€
    • Base64Url 둜 μΈμ½”λ”©λ˜μ–΄ JSON μ›Ή ν† ν°μ˜ 첫 번째 뢀뢄을 ν˜•μ„±ν•œλ‹€
  • Payload (JWT Claim Set)
    • 토큰에 포함할 λ‚΄μš©μΈ ν΄λ ˆμž„μ„ ν¬ν•¨ν•˜λŠ” νŽ˜μ΄λ‘œλ“œλ‘œμ„œ ν‘œμ€€ ν•„λ“œμΈ 7개의 등둝 ν΄λ ˆμž„ 이름(Registered Claim Names) 및 μ‚¬μš©μž μ§€μ • ν΄λ ˆμž„ λ“±μœΌλ‘œ κ΅¬μ„±ν•œλ‹€
    • Base64Url 둜 μΈμ½”λ”©λ˜μ–΄ JSON μ›Ή ν† ν°μ˜ 두 번째 뢀뢄을 ν˜•μ„±ν•œλ‹€
  • Signiture
    • μ„œλͺ…은 Base64url 인코딩을 μ΄μš©ν•˜μ—¬ 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό μΈμ½”λ”©ν•˜κ³  이 λ‘˜μ„ 점(.) κ΅¬λΆ„μžλ‘œ ν•¨κ»˜ μ—°κ²°μ‹œν‚΄μœΌλ‘œμ¨ κ³„μ‚°λ˜μ–΄ 토큰을 μ•ˆμ „ν•˜κ²Œ ν™•μΈν•œλ‹€.

βœ“ Claims

  • κ°œλ…
    • ν΄λ ˆμž„(claim) 은 μ£Όμž₯ν•˜κ³ μž ν•˜λŠ” 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμœΌλ‘œ 이 정보λ₯Ό λͺ¨λ‘ κ°€μ§€κ³  μžˆλŠ” λ°”λ”” 뢀뢄을 Claim Set 이라고 λΆ€λ₯Έλ‹€.
    • Claim Set은 ν‚€ 뢀뢄인 Claim Nameκ³Ό κ°’ 뢀뢄인 Claim Value의 μ—¬λŸ¬ 쌍으둜 이루어져 μžˆλ‹€.
    • JWT μ—λŠ” μ—¬λŸ¬κ°œμ˜ ν΄λ ˆμž„λ“€μ„ 넣을 수 μžˆλ‹€

βœ“ JWT

βœ“ 데이터 무결성과 취약점

  1. Payload 의 ν΄λ ˆμž„ 값을 λ³€μ‘°ν•˜μ—¬ 토큰을 μƒμ„±ν•œ ν›„ μ „λ‹¬ν•˜λ”λΌλ„ μ„œλͺ…μ—μ„œ ν•΄μ‹œλœ κ°’κ³Ό λ³€μ‘°λœ κ°’μ˜ ν•΄μ‹œλœ 값이 μ„œλ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 검증이 μ‹€νŒ¨ν•˜μ—¬ λ°μ΄ν„°μ˜ μ•ˆμ „μ„±μ„ 보μž₯ν•œλ‹€
  2. SecretKey λ₯Ό νƒˆμ·¨λ‹Ήν–ˆμ„ κ²½μš°μ—λŠ” μ€‘μš”ν•œ 정보가 λ„λ‚œλ‹Ήν•  수 μžˆλŠ” 취약점이 λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— SecretKey λ₯Ό 주기적으둜 λ³€κ²½ν•˜λ„λ‘ ν•˜λŠ” key rotation( key rolling) 정책이 ν•„μš”ν•  수 μžˆλ‹€

2-2. JWK 이해

βœ“ JWK κ°œλ…

  • μ•”ν˜Έν™” ν‚€λ₯Ό μ €μž₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ μΈκ°€μ„œλ²„μ—μ„œ λ°œν–‰ν•˜λŠ” JWT ν† ν°μ˜ μ•”ν˜Έν™” 및 μ„œλͺ…에 ν•„μš”ν•œ μ•”ν˜Έν™” ν‚€μ˜ λ‹€μ–‘ν•œ 정보λ₯Ό 담은 JSON 객체 ν‘œμ€€μ΄λ‹€
  • JwkSetUri 정보λ₯Ό μ„€μ •ν•˜λ©΄ μΈκ°€μ„œλ²„λ‘œλΆ€ν„° JWK ν˜•νƒœμ˜ 정보λ₯Ό λ‹€μš΄λ‘œλ“œν•  수 있고 JWT λ₯Ό 검증할 수 μžˆλ‹€.

βœ“ JWK ꡬ쑰

βœ“ JWK ν™•μž₯

  • μžλ°” ν‘œμ€€ λ³΄μ•ˆ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ€μΉ­ν‚€, λΉ„λŒ€μΉ­ν‚€ λ°©μ‹μ˜ JWT 의 μ•”ν˜Έν™” 및 μ „μžμ„œλͺ…, 이후 검증을 μœ„ν•œ ν‚€ 생성, λ³€ν™˜ 등을 μ§€μ›ν•œλ‹€
  • κ΅¬ν˜„μ²΄λ‘œμ„œ RSAKey, OctetSequenceKey, ECKey, OctetKeyPair κ°€ μžˆλ‹€

βœ“ JWKGenerator

  • μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ 방식에 따라 JWK 의 κ΅¬ν˜„μ²΄κ°€ 있고 각 κ΅¬ν˜„μ²΄λ₯Ό νŽΈλ¦¬ν•˜κ²Œ 생성할 수 μžˆλŠ” μ œλ„ˆλ ˆμ΄ν„° ν΄λž˜μŠ€μ΄λ‹€
    • RSAKeyGenerator – λΉ„λŒ€μΉ­ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ ν‚€λ₯Ό ν¬ν•¨ν•˜λŠ” JWK 생성기
    • OctetSequenceKeyGenerator - λŒ€μΉ­ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ ν‚€λ₯Ό ν¬ν•¨ν•˜λŠ” JWK 생성기
    • EcKeyGenerator - 타원곑선 μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ ν‚€ ν¬ν•¨ν•˜λŠ” JWK 생성기

3. OAuth2 MAC & RSA 검증

3-1. κΈ°λ³Έ ν™˜κ²½ 및 곡톡 클래슀 ꡬ성

βœ“ 토큰 검증 방법

  • 토큰 검증에 λŒ€ν•œ λ‹€μ–‘ν•œ μΌ€μ΄μŠ€μ˜ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ 토큰 λ°œν–‰ 및 검증을 μ§„ν–‰ν•˜λ„λ‘ ν•œλ‹€.
    β‘  μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ 방식에 따라 직접 λ°œν–‰ν•œ JWT 토큰을 λŒ€μƒμœΌλ‘œ 검증을 μ§„ν–‰ν•œλ‹€
    β‘‘ 인가 μ„œλ²„μ—μ„œ λ°œν–‰ν•œ Access Token 을 λŒ€μƒμœΌλ‘œ 검증을 μ§„ν–‰ν•œλ‹€

    βœ“ JwtDecoder λΉˆμ€ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ 및 νŠΉμ •ν•œ 쑰건에 따라 각 μƒμ„±λ˜λ©° 디코딩이 μ§„ν–‰λ˜λ©΄ μ£Όμ–΄μ§„ μ•Œκ³ λ¦¬μ¦˜μ— μ˜ν•΄ κ²€μ¦ν•˜κ²Œ λœλ‹€

βœ“ 토큰 검증 ν…ŒμŠ€νŠΈ

  1. MAC 방식에 μ˜ν•œ 검증 ν…ŒμŠ€νŠΈ
    β‘  자체 토큰 λ°œν–‰ 및 검증
    β‘‘ SecretKey 섀정에 μ˜ν•œ 검증
  2. RSA 방식에 μ˜ν•œ 검증 ν…ŒμŠ€νŠΈ
    β‘  자체 토큰 λ°œν–‰ 및 검증
    β‘‘ JwtDecoder 에 μ˜ν•œ 검증
    β‘’ KeyStore νˆ΄μ— μ˜ν•œ 검증
    β‘£ JwkSetUri 섀정에 μ˜ν•œ 검증

βœ“ νŒ¨ν‚€μ§€ ꡬ성

  • io.oauth2.resourceserver.configs – μ„€μ •ν΄λž˜μŠ€
  • Io.oauth2.resourceserver.filter.authentication – 인증필터(토큰 λ°œν–‰ λ‹΄λ‹Ή)
  • Io.oauth2.resourceserver.filter.authorization – 인가필터(토큰 검증 λ‹΄λ‹Ή)
  • Io.oauth2.resourceserver.signature – 토큰 μ„œλͺ… 및 λ°œν–‰
  • Io.oauth2.resourceserver.controller – 컨트둀러
  • io.oauth2.resourceserver.dto – μš”μ²­ νŒŒλΌλ―Έν„° 객체
  • io.oauth2.resourceserver.init – μ΄ˆκΈ°ν™” μž‘μ—…

βœ“ κΈ°λ³Έ 클래슀 생성

  • OAuth2ResourceServer – λ¦¬μ†ŒμŠ€ μ„œλ²„ μ„€μ •ν΄λž˜μŠ€
  • IndexController – 컨트둀러

βœ“ ν™˜κ²½μ„€μ •

  • application.yml

βœ“ μ˜μ‘΄μ„± μΆ”κ°€

  • gradle

βœ“ SignatureConfig

  • μ„œλͺ…κ³Ό 검증, MAC 및 RSA μ•”ν˜Έν™” JWK λ“±μ˜ λΉˆλ“€μ„ μƒμ„±ν•˜λŠ” μ„€μ • 클래슀

βœ“ JwtAuthenticationFilter

  • μΈκ°€μ„œλ²„λ₯Ό λŒ€μ‹ ν•˜μ—¬ 토큰을 λ°œν–‰ν•˜λŠ” μ»€μŠ€ν…€ ν•„ν„°λ‘œμ„œ UsernamePasswordAuthenticationFilter λ₯Ό μƒμ†ν•œλ‹€
  • POST /login μš”μ²­μ— λŒ€ν•΄ 인증 처리λ₯Ό λ‹΄λ‹Ήν•œλ‹€
  • 인증에 μ„±κ³΅ν•˜κ²Œ 되면 SecuritySigner λ₯Ό ν˜ΈμΆœν•΄μ„œ JWT 토큰을 μƒμ„±ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ‘λ‹΅ν•œλ‹€
  • MAC κ³Ό RSA 의 μ„œλͺ… 및 인증에 κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” ν•„ν„°

βœ“ SecuritySigner

  • MAC 및 RSA μ•”ν˜Έν™” 방식에 따라 토큰을 λ°œν–‰ν•˜λŠ” 좔상 클래슀

3-2. MAC 검증 κΈ°λŠ₯ κ΅¬ν˜„

3-2-1. JwtAuthorizationMacFilter 에 μ˜ν•œ 검증

βœ“ OAuth2ResourceServer

@Bean //λ¦¬μ†ŒμŠ€ μ„œλ²„ μ„€μ • ν΄λž˜μŠ€λ‘œμ„œ MAC 인증 및 인가 처리 섀정을 ν•œλ‹€
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  http.csrf().disable();
  http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

  http.authorizeRequests((requests) -> requests.antMatchers("/login","/").permitAll().anyRequest().authenticated());
  http.userDetailsService(getUserDetailsService());
  http.addFilterBefore(jwtAuthenticationFilter(macSecuritySigner, octetSequenceKey), UsernamePasswordAuthenticationFilter.class);
  http.addFilterBefore(jwtAuthorizationMacFilter(octetSequenceKey), UsernamePasswordAuthenticationFilter.class);

  return http.build();
}

βœ“ JwtAuthorizationMacFilter

  • Bearer 토큰을 MAC μ•Œκ³ λ¦¬μ¦˜μ— μ˜ν•΄ κ²€μ¦ν•˜λ©° 검증 μ„±κ³΅μ‹œ 인증 및 인가λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•„ν„°

βœ“ MacSecuritySinger

  • SecuritySigner 을 μƒμ†λ°›μœΌλ©° MAC 기반 μ„œλͺ… 및 토큰을 λ°œν–‰ν•˜λŠ” 클래슀

3-2-2. JwtDecoder 에 μ˜ν•œ 검증

βœ“ JwtDecoderConfig

  • SecretKey 기반 JwtDecoder 생성
  • λŒ€μΉ­ν‚€ λ°©μ‹μœΌλ‘œ μƒμ„±λœ 토큰을 κ²€μ¦ν•˜κΈ° μœ„ν•΄ JWK λ₯Ό μƒμ†ν•œ OctetSequenceKey 둜 SecretKey 기반 JwtDecoder λ₯Ό μƒμ„±ν•œλ‹€
@Bean
@ConditionalOnProperty(prefix = "spring.security.oauth2.resourceserver.jwt", name = "jws-algorithms", havingValue = "HS256", matchIfMissing = false)
public JwtDecoder jwtDecoderBySecretKeyValue(OctetSequenceKey octetSequenceKey,OAuth2ResourceServerProperties properties) {
  return NimbusJwtDecoder.withSecretKey(octetSequenceKey.toSecretKey())
        .macAlgorithm(MacAlgorithm.from(properties.getJwt().getJwsAlgorithms().get(0)))
        .build();
}

βœ“ application.yml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jws-algorithms: HS256

3-3. RSA 검증 κΈ°λŠ₯ κ΅¬ν˜„

3-3-1. JwtAuthorizationRsaFilter 에 μ˜ν•œ 검증

βœ“ OAuth2ResourceServer

@Bean //λ¦¬μ†ŒμŠ€ μ„œλ²„ μ„€μ • ν΄λž˜μŠ€λ‘œμ„œ MAC 인증 및 인가 처리 섀정을 ν•œλ‹€
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  http.csrf().disable();
  http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

  http.authorizeRequests((requests) -> requests.antMatchers("/").permitAll().anyRequest().authenticated());
  http.userDetailsService(getUserDetailsService());
  http.addFilterBefore(jwtAuthenticationFilter(rsaSecuritySigner, rsaKey), UsernamePasswordAuthenticationFilter.class);
  http.addFilterBefore(jwtAuthorizationRsaFilter(rsaKey), UsernamePasswordAuthenticationFilter.class);

  return http.build();
}

βœ“ JwtAuthorizationRsaFilter

  • Bearer 토큰을 RSA μ•Œκ³ λ¦¬μ¦˜μ— μ˜ν•΄ κ²€μ¦ν•˜λ©° 검증 μ„±κ³΅μ‹œ 인증 및 인가λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•„ν„°

βœ“ RsaSecuritySinger

  • SecuritySigner 을 μƒμ†λ°›μœΌλ©° RSA 기반 μ„œλͺ… 및 토큰을 λ°œν–‰ν•˜λŠ” 클래슀

3-3-2. JwtDecoder 에 μ˜ν•œ 검증

βœ“ JwtDecoderConfig

  • PublicKey 기반 JwtDecoder 생성
  • λΉ„λŒ€μΉ­ν‚€ λ°©μ‹μœΌλ‘œ μƒμ„±λœ 토큰을 κ²€μ¦ν•˜κΈ° μœ„ν•΄ JWK λ₯Ό μƒμ†ν•œ RSAKey 둜 PublicKey 기반 JwtDecoder λ₯Ό μƒμ„±ν•œλ‹€
@Bean
@ConditionalOnProperty(prefix = "spring.security.oauth2.resourceserver.jwt", name = "jws-algorithms", havingValue = "RS512", matchIfMissing = false)
public JwtDecoder jwtDecoderByPublicKeyValue(RSAKey rsaKey, OAuth2ResourceServerProperties properties) throws JOSEException {
  return NimbusJwtDecoder.withPublicKey(rsaKey.toRSAPublicKey())
        .signatureAlgorithm(SignatureAlgorithm.from(properties.getJwt().getJwsAlgorithms().get(0)))
        .build();
}

βœ“ application.yml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jws-algorithms: RS512

3-3-3. KeyStore 에 μ˜ν•œ 검증

βœ“ KeyStore 클래슀

  • Java λŠ” KeyStore λΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μ•”ν˜Έν™”/λ³΅ν˜Έν™” 및 μ „μž μ„œλͺ…에 μ‚¬μš©λ˜λŠ” Private Key, Public Key 와 Certificate λ₯Ό μΆ”μƒν™”ν•˜μ—¬ μ œκ³΅ν•˜κ³  μžˆλ‹€
  • KeyStore μ—λŠ” SecretKey, Private Key, Public Key, Certificate 와 같은 λ³΄μ•ˆ νŒŒμΌλ“€μ΄ μ €μž₯되며 KeyStore λŠ” 파일 μ‹œμŠ€ν…œμ— μ €μž₯ν•˜κ³  μ•”ν˜Έλ‘œ λ³΄ν˜Έν•  수 μžˆλ‹€
  • KeyStore λŠ” keytool μ‚¬μš©ν•΄μ„œ 생성할 수 있으며 κΈ°λ³Έ νƒ€μž…μ€ jks 이닀

βœ“ keytool

  • keytool 은 μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹°λ‘œ KeyStore 기반으둜 μΈμ¦μ„œμ™€ ν‚€λ₯Ό 관리할 수 있으며 JDK 에 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.
    • C:\Program Files\Java\jdk-11.0.11\bin\keytool.exe
  • Keystore 생성 ν›„ PrivateKey, PublicKey, Certificate 생성
    • Private key 생성 : keytool -genkeypair -alias apiKey -keyalg RSA -keypass β€œpass1234” -keystore apiKey.jks -storepass β€œpass1234”
    • Certificate 생성 : keytool -export -alias apiKey -keystore apiKey.jks -rfc -file trustServer.cer
    • Public key 생성 : keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks

βœ“ μˆœμ„œ

  1. KeyStore 의 객체λ₯Ό μ–»λŠ”λ‹€
    • keytool 을 톡해 얻은 apiKey.jks νŒŒμΌμ„ μ½μ–΄μ˜€λ©΄ 킀와 μΈμ¦μ„œλ₯Ό κ°€μ Έ 올 수 있으며 μ—¬κΈ°μ—λŠ” κ°œμΈν‚€μ™€ μΈμ¦μ„œ, κ³΅κ°œν‚€ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€
      • KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()) // κΈ°λ³Έ νƒ€μž…μ€ .jks( java key store)
      • keystore.load(new FileInputStream(β€œ/certs/apiKey.jks)”, keystorepassword.toCharArray()); // κΈ°μ‘΄ ν‚€ μ €μž₯μ†Œλ₯Ό load ν•œλ‹€
  2. 개인 ν‚€λ₯Ό μ–»λŠ”λ‹€
    • PrivateKey key = (PrivateKey) keystore.getKey(alias, β€œtest1234”.toCharArray());
  3. μΈμ¦μ„œλ₯Ό μ–»λŠ”λ‹€
    • Certificate certificate = keystore.getCertificate(alias);
  4. μΈμ¦μ„œλ‘œλΆ€ν„° 곡개 ν‚€λ₯Ό μ–»κ³  Base64 둜 μΈμ½”λ”©ν•œ λ‹€μŒ λ¬Έμžμ—΄μ„ λ³€ν™˜ν•œλ‹€
    • PublicKey publicKey = certificate.getPublicKey();
    • String publicStr = java.util.Base64.getMimeEncoder().encodeToString(publicKey.getEncoded());
  5. μΈμ½”λ”©λœ 곡개 ν‚€ λ¬Έμžμ—΄μ„ txt 파일둜 μ €μž₯ν•œλ‹€
    • OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(β€œ/certs/publicKey.txt”), Charset.defaultCharset());
    • writer.write(publicStr);
    • writer.close();

βœ“ JwtDecoderConfig

@Bean
@Conditional(KeyValueCondition.class)
JwtDecoder jwtDecoderByPublicKeyValue() throws Exception {
  RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(getKeySpec(this.properties.readPublicKey())));
  NimbusJwtDecoder jwtDecoder = 
      NimbusJwtDecoder.withPublicKey(publicKey).signatureAlgorithm(SignatureAlgorithm.from(this.properties.getJwsAlgorithm())).build();
  jwtDecoder.setJwtValidator(getValidators(JwtValidators::createDefault));

  return jwtDecoder;
}

βœ“ OAuth2ResourceServer

  • λ¦¬μ†ŒμŠ€ μ„œλ²„ μ„€μ • ν΄λž˜μŠ€λ‘œμ„œ KeyStore μ—μ„œ μΆ”μΆœν•œ PublicKey 에 μ˜ν•΄ RSA 인증 및 인가 처리 섀정을 ν•œλ‹€

βœ“ RsaPublicKeySecuritySigner

  • SecuritySigner 을 μƒμ†λ°›μœΌλ©° RSA μ•”ν˜Έν™” λ°©μ‹μ˜ μ„œλͺ… 및 토큰 λ°œν–‰

βœ“ RsaKeyExtractor

  • apiKey.jks 둜 λΆ€ν„° PrivateKey 와 PublicKey λ₯Ό μΆ”μΆœν•˜κ³  νŒŒμΌμ— μ €μž₯ν•˜λŠ” 클래슀

3-3-4. JwkSetUri 에 μ˜ν•œ 검증

βœ“ SecurityJwkSetUriResourceServerConfig

@Bean
@ConditionalOnProperty(name = "spring.security.oauth2.resourceserver.jwt.jwk-set-uri")
JwtDecoder jwtDecoderByJwkKeySetUri() {
  NimbusJwtDecoder nimbusJwtDecoder = 
  NimbusJwtDecoder.withJwkSetUri(this.properties.getJwkSetUri()).jwsAlgorithm(SignatureAlgorithm.from(this.properties.getJwsAlgorithm())).build();
  String issuerUri = this.properties.getIssuerUri();
  Supplier<OAuth2TokenValidator<Jwt>> defaultValidator = (issuerUri != null) ? () -> JwtValidators.createDefaultWithIssuer(issuerUri) : JwtValidators::createDefault;
  nimbusJwtDecoder.setJwtValidator(getValidators(defaultValidator));

  return nimbusJwtDecoder;
}

βœ“ OAuth2ResourceServer

  • λ¦¬μ†ŒμŠ€ μ„œλ²„ μ„€μ • ν΄λž˜μŠ€λ‘œμ„œ μΈκ°€μ„œλ²„ μ—”λ“œν¬μΈνŠΈμΈ JwkSetUri 방식에 μ˜ν•œ RSA 인증 및 인가 처리 섀정을 ν•œλ‹€

4. Authentication / @AuthenticationPrincipal

βœ“ Authentication

  • λ¦¬μ†ŒμŠ€ μ„œλ²„μ—μ„œ 토큰 검증이 이루어지면 ν† ν°μœΌλ‘œ λΆ€ν„° 정보λ₯Ό μΆ”μΆœν•΄μ„œ 인증객체λ₯Ό κ΅¬μ„±ν•˜κ²Œ λœλ‹€
  • μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°μ˜ μžμ›μ— λŒ€ν•œ 접근은 인증객체의 인증 μœ λ¬΄μ™€ κΆŒν•œμ •λ³΄μ— 따라 κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— 인증객체λ₯Ό 생성해야 ν•œλ‹€
  • 인증 κ°μ²΄λŠ” JwtAuthenticationToken νƒ€μž…μœΌλ‘œ μƒμ„±λ˜κ³  SecurityContext 에 μ €μž₯ν•œλ‹€

βœ“ Jwt

  • JwtDecoder λŠ” 검증이 μ„±κ³΅ν•˜λ©΄ ν† ν°μ˜ ν΄λ ˆμž„μœΌλ‘œλΆ€ν„° 정보λ₯Ό μΆ”μΆœν•΄μ„œ μ΅œμ’… Jwt 객체λ₯Ό λ°˜ν™˜ν•œλ‹€
  • Jwt κ°μ²΄λŠ” JwtAuthenticationToken 의 principal 속성에 μ €μž₯λœλ‹€

βœ“ @AuthenticationPrincipal

  • JwtAuthenticationToken 의 principal 에 μ €μž₯λ˜μ–΄ μžˆλŠ” Jwt 객체λ₯Ό λ°”λ‘œ μ°Έμ‘°ν•  수 μžˆλ‹€

5. BearerTokenAuthenticationFilter

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°