** π PART 4.1 μΈμ (Session) κ°μ²΄μ λ©λͺ¨λ¦¬ λ¬Έμ μ ν΄λ¬μ€ν°λ§ μ λ΅ **
βλ‘κ·ΈμΈ μνλ₯Ό μ μ§νλ©΄μλ μλ² λ©λͺ¨λ¦¬λ₯Ό μμ νκ² μ°λ λ²β
π’ 1λ¨κ³. μΈμ (Session)μ΄ λμΌ?
π¬ μΈμ μ΄λ μ¬μ©μκ° μΉμ¬μ΄νΈμ λ€μ΄μμ λ,
μλ²κ° κ·Έ μ¬μ©μλ₯Ό κΈ°μ΅νκΈ° μν΄ λ§λ€μ΄μ£Όλ μ μ₯ 곡κ°μ΄μΌ.
β μμλ‘ μ½κ² μ€λͺ :
- νκΈΈλμ΄ λ‘κ·ΈμΈνμ΄ β μλ²λ βνκΈΈλ λ‘κ·ΈμΈ μ 보βλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯
- νκΈΈλμ΄ λ€μ νμ΄μ§λ‘ μ΄λν΄λ β λ‘κ·ΈμΈ μνλ₯Ό κΈ°μ΅νκ³ μμ΄!
- μ΄ μ μ₯곡κ°μ΄ λ°λ‘ π μΈμ (Session)
β μ½λ μμ
HttpSession session = request.getSession();
session.setAttribute("loginId", "hong123");
β μ¬μ©μμ λ‘κ·ΈμΈ μ 보λ₯Ό μΈμ μ μ μ₯νλ μ½λ
π§ μΈμ μ μλ² λ©λͺ¨λ¦¬μ μ μ₯λ¨!
νλͺ© | μ€λͺ |
---|---|
μ μ₯ μμΉ | WAS (Tomcat λ±) λ©λͺ¨λ¦¬ |
κ΄λ¦¬ λμ | μ¬μ©μλ³ λ°μ΄ν° (λ‘κ·ΈμΈ , μ₯λ°κ΅¬λ λ±) |
μμ μμ | λΈλΌμ°μ μ’
λ£ or μκ° μ΄κ³Ό or session.invalidate() |
π₯ 2λ¨κ³. μΈμ μ λ©λͺ¨λ¦¬ λ¬Έμ (μ€μ μ€λ¬΄ μ΄μ)
β λ¬Έμ μν©: μΈμ μ΄ λ무 λ§μΌλ©΄?
- μ¬μ©μκ° λ§μμ§λ©΄ β μ¬μ©μ μλ§νΌ μΈμ κ°μ²΄λ λ©λͺ¨λ¦¬μ μμ±λ¨
-
λ‘κ·ΈμΈλ§ ν΄λκ³ μ¬μ΄νΈ μ λ«λ μ¬λ λ§μ
β μΈμ μ΄ κ³μ μ΄μ μμ β λ©λͺ¨λ¦¬ κ³μ μ°¨μ§ν¨
- μ¬νλ©΄ μλ²κ° λλ €μ§κ±°λ λ€μ΄λ¨ π±
π¦ μΈμ λ©λͺ¨λ¦¬ νλ¦
[μ¬μ©μ μ μ] β Session κ°μ²΄ μμ±
β setAttribute("loginId", "hong123");
β μλ² λ©λͺ¨λ¦¬μ λ‘κ·ΈμΈ μ 보 μ μ₯λ¨
β μ무 νλ μμ΄ 30λΆ μ§λ¨ β μΈμ
μμ (GC λμ)
β μΈμ μ μ§ μκ° (Session Timeout)
νλͺ© | μ€λͺ |
---|---|
κΈ°λ³Έ μκ° | 30λΆ (μλ² μ€μ μ λ°λΌ λ€λ¦) |
μ€μ λ°©λ² | web.xml λλ μ½λμμ μ€μ κ°λ₯ |
μ€μ μμ | Β |
<!-- web.xml -->
<session-config>
<session-timeout>15</session-timeout> <!-- λΆ λ¨μ -->
</session-config>
β μΈμ λ©λͺ¨λ¦¬ λμ λ°©μ§ μ λ΅
μ λ΅ | μ€λͺ |
---|---|
μλ λ§λ£ μκ° μ€μ | 10~30λΆ μΆμ² |
μλ μ’ λ£ | session.invalidate() λ‘ μ§μ μ’
λ£ |
μΈμ μ΅μν | ν° λ°μ΄ν°λ₯Ό μΈμ μ λ£μ§ μκΈ° (μ΄λ―Έμ§, λͺ©λ‘ λ±μ DBμ 보κ΄) |
μ μ μΊμ λμ λ‘컬 μΈμ μ¬μ© | μλ²μ λΆνμν κ³΅μ© κ°μ²΄ λ³΄κ΄ κΈμ§ |
β μ€λ¬΄μμ λ§μ΄ ν°μ§λ μ€μ
session.setAttribute("productList", hugeList); // β λ©λͺ¨λ¦¬ ν°μ§ μλ μμ
β λλ κ°μ²΄λ DBλ μΊμμ μ μ₯νκ³ , μΈμ μλ IDλ§ μ μ₯νμΈμ!
π 3λ¨κ³. λκ·λͺ¨ μ¬μ©μ λλΉ: μΈμ ν΄λ¬μ€ν°λ§ μ λ΅
π§© μ ν΄λ¬μ€ν°λ§μ΄ νμν΄?
π¬ μΉμ¬μ΄νΈμ μ μν μ¬μ©μκ° 10λ§ λͺ μ΄λΌλ©΄β¦?
μλ² νλλ‘λ κ°λΉ λΆκ°! κ·Έλμ μ¬λ¬ λμ μλ²λ₯Ό λ¬Άμ΄μ μ²λ¦¬νλλ°,
μ΄λ μλ²λΌλ¦¬ μΈμ μ 곡μ ν΄μΌ λ‘κ·ΈμΈ μ λ³΄κ° μ μ§λ¨.
β μΈμ ν΄λ¬μ€ν°λ§ ꡬ쑰
[μ¬μ©μ λ‘κ·ΈμΈ]
β μλ² Aμ μ μ β μΈμ
μμ±
[λ€μ μμ²μ μλ² Bλ‘ κ°μ λ]
β Bλ λ‘κ·ΈμΈ μνλ₯Ό μμμΌ ν¨!
β Aμ Bκ° μΈμ
μ 보λ₯Ό 곡μ ν΄μΌ ν¨ β μ΄κ²μ΄ "μΈμ
ν΄λ¬μ€ν°λ§"
β λνμ μΈ μΈμ ν΄λ¬μ€ν°λ§ λ°©μ
λ°©μ | μ€λͺ | νΉμ§ |
---|---|---|
Sticky Session | ν μ¬μ©μλ 무쑰건 κ°μ μλ²λ‘ μ μ§ | ꡬν μ¬μ, λΆν λΆκ· ν λ°μ |
Session Replication | λͺ¨λ μλ²κ° μΈμ μ 볡μ ν΄ κ³΅μ | μ λ’°λ λμ, λ€νΈμν¬ λΆν β |
External Session Storage | Redis, DB λ± μΈλΆ μ μ₯μμ μΈμ μ μ₯ | μ±λ₯/νμ₯μ± μ°μ, κ°μ₯ μΆμ² |
βοΈ ν΄λΌμ°λ/λκΈ°μ μμ μ°λ λ°©μ
λλΆλΆ Redis + Spring Session ꡬ쑰 μ¬μ©
β μλ² μμ λλ‘ νμ₯ν΄λ μΈμ 곡μ OK
β GC λΆλ΄λ μ€κ³ , νμ₯μ± μ΅κ³ !
π― 4λ¨κ³. λ©΄μ ν¬μΈνΈ μ 리
μ§λ¬Έ | λͺ¨λ² λ΅λ³ μμ½ |
---|---|
μΈμ μ μ΄λμ μ μ₯λλμ? | WAS μλ² λ©λͺ¨λ¦¬μ μ μ₯λ©λλ€ |
μΈμ μ΄ λ§μμ§λ©΄ μ΄λ€ λ¬Έμ κ° μκΈ°λμ? | λ©λͺ¨λ¦¬ λΆμ‘±, GC λΆλ΄, μλ² λλ €μ§ |
μΈμ νμμμμ μ΄λ»κ² μ€μ νλμ? | web.xml λλ session.setMaxInactiveInterval() |
λκ·λͺ¨ μμ€ν μμ μΈμ 곡μ λ μ΄λ»κ² νλμ? | μΈμ ν΄λ¬μ€ν°λ§ (Replication, External Store) |
μΈμ μ GCλ‘ μ 리νλ €λ©΄ μ΄λ»κ² ν΄μΌ νλμ? | νμμμ λλ invalidate() νΈμΆ, μ°Έμ‘° μ κ±° νμ |
β λ§λ¬΄λ¦¬ μμ½ν
νλͺ© | μ€λͺ | λ©λͺ¨λ¦¬ μν₯ |
---|---|---|
Session | μ¬μ©μλ³ λ°μ΄ν° μ μ₯μ | μ¬μ©μ μ λ§μΌλ©΄ λ©λͺ¨λ¦¬ νμ¦ |
Timeout μ€μ | μλ μμ κ°λ₯ | μ€μ μ΄ μ§§μμλ‘ μμ |
ν΄λ¬μ€ν°λ§ | μλ² κ° μΈμ 곡μ | νμ₯μ± β, 볡μ‘λ β |
External μ μ₯μ | Redis, DBλ‘ μΈμ μ΄λ | λ©λͺ¨λ¦¬ β, μλ β |
β PART 4.2 μλ΅ μΊμ(Cache-Control)μ μλ² λ©λͺ¨λ¦¬ μ μ½
βλΈλΌμ°μ μ μλ²κ° λλνκ² μΊμλ₯Ό μ¨μ λΉ λ₯΄κ² 보μ¬μ£Όλ λ² + λ©λͺ¨λ¦¬λ μλΌκΈ°β
π’ 1λ¨κ³. μΊμ(Cache)λ λμΌ?
π¬ μΊμλ μμ£Ό μ°λ λ°μ΄ν°λ₯Ό 미리 μ μ₯ν΄λλ μ μ₯μμΌ.
μΉμμλ βλΈλΌμ°μ β λλ βνλ‘μ μλ²βκ°
μ΄μ κ²°κ³Όλ₯Ό μ μ₯ν΄λκ³ , λκ°μ μμ²μ΄ μ€λ©΄ μλ‘ μ λΆλ¬μ€λ κΈ°μ μ΄μΌ!
β μμ
[μ²μ μμ²]
β μλ²μμ μ΄λ―Έμ§ μ μ‘ (logo.png)
[λ€μ μμ²]
β λΈλΌμ°μ κ° "μ΄? μ μ λ°μ κ±°λ κ°λ€!" β μ μ₯λ κ±Έ κ·Έλλ‘ μ!
β μλ²μ λ€μ μμ² X β μλ β, νΈλν½ β
π§ μΊμκ° μ€μν μ΄μ
νλͺ© | ν¨κ³Ό |
---|---|
μλ β | μλ² μ¬μμ² μμ΄ λΉ λ₯΄κ² 보μ¬μ€ |
νΈλν½ β | μλ² λ¦¬μμ€ μ μ½ |
λ©λͺ¨λ¦¬ κ΄λ¦¬ β | μλ²μμ λμΌν λ°μ΄ν°λ₯Ό μ¬λ¬ λ² μμ±νμ§ μμ |
π¦ 2λ¨κ³. HTTP μΊμ ν€λ + GCμμ κ΄κ³
β ν΅μ¬ μΊμ ν€λ
ν€λ | μ€λͺ |
---|---|
Cache-Control |
μ΄λ»κ² μΊμν μ§ μ€μ |
Expires |
μΈμ κΉμ§ μΊμ μ ν¨νμ§ |
ETag |
νμΌμ΄ λ°λμλμ§ νμΈνλ ID |
Last-Modified |
λ§μ§λ§ μμ μκ° (λΉκ΅μ©) |
β μμ: μΊμλ₯Ό 1μκ° μ μ§νλ ν€λ
Cache-Control: public, max-age=3600
β 3600μ΄(1μκ°) λμ λΈλΌμ°μ κ° μλ‘ μμ²νμ§ μκ³ , μ μ₯λ νμΌμ κ·Έλλ‘ μ
π μλ² λ©λͺ¨λ¦¬(GC) κ΄μ μμ μ μ’μκΉ?
νλͺ© | μ€λͺ |
---|---|
μ μ νμΌ μΊμ | μλ²κ° λ§€λ² νμΌ μ½μ νμ μμ β λ©λͺ¨λ¦¬/CPU λΆλ΄ β |
λμ νμ΄μ§ μΊμ | λμΌν λ°μ΄ν° λ λλ§ κ²°κ³Όλ₯Ό μ¬μ¬μ© β GC λμ κ°μ²΄ μμ± β |
GC ν¨μ¨ | λ§€ μμ²λ§λ€ μλ‘ κ°μ²΄ μμ± μ νλ―λ‘ GC λ°μ νμ β |
βοΈ 3λ¨κ³. μ μ 리μμ€ vs λμ νμ΄μ§ μΊμ μ λ΅
β μ μ 리μμ€ (μ΄λ―Έμ§, CSS, JS λ±)
νλͺ© | νΉμ§ |
---|---|
λ°λμ§ μμ | μμ£Ό μ λ°λ (logo.png, app.css λ±) |
μΊμ μ λ΅ | μ€λ μ μ₯ν΄λ μμ (max-age=31536000 λ±) |
GC μν₯ | μΊμ μλ² or λΈλΌμ°μ μ μμ β μλ²λ λ©λͺ¨λ¦¬ μ¬μ© μ ν¨ |
π‘ μ€μ μμ (Apache / Nginx)
Cache-Control: public, max-age=31536000
β 1λ λμ λ€μ μ λ°μλ λ¨!
β λμ νμ΄μ§ (JSP, λ‘κ·ΈμΈ νλ©΄, κ²μ κ²°κ³Ό λ±)
νλͺ© | νΉμ§ |
---|---|
μμ²λ§λ€ κ²°κ³Όκ° λ€λ₯Ό μ μμ | μ¬μ©μ μνλ DBμ λ°λΌ λ€λ¦ |
μΊμ μ λ΅ | μ νκ±°λ μ§§κ² μ€μ |
GC μν₯ | λ§€ μμ²λ§λ€ κ°μ²΄ μμ± β GC μμ£Ό λ°μ |
π‘ μΊμ κΈμ§ μ€μ
Cache-Control: no-store
Pragma: no-cache
Expires: 0
β λ―Όκ° μ 보(λ‘κ·ΈμΈ, μ£Όλ¬Έ, κ²°μ λ±)λ μ λ μΊμνλ©΄ μ λ¨!
π§ μ€λ¬΄ μ λ΅ μμ½
리μμ€ μ ν | μΊμ μ λ΅ |
---|---|
μ΄λ―Έμ§, JS, CSS | μ€λ μΊμ (max-age ) |
API μλ΅ | ETag , Last-Modified νμ© |
λ‘κ·ΈμΈ/μ₯λ°κ΅¬λ | no-cache , no-store μ€μ |
κ²μ κ²°κ³Ό | μ§§μ μΊμ or μ¬μ©μλ³ Key μΊμ (μ: Redis) |
π 4λ¨κ³. λ©΄μ ν¬μΈνΈ μ΄μ 리
μ§λ¬Έ | λͺ¨λ² λ΅λ³ μμ½ |
---|---|
HTTP μΊμλ μ νμνκ°μ? | μλ β, νΈλν½ β, μλ² λ©λͺ¨λ¦¬ μ¬μ© β |
GCμ μΊμλ μ΄λ€ κ΄κ³κ° μλμ? | μΊμλ₯Ό μ°λ©΄ κ°μ²΄ μμ± μ€μ΄λ€μ΄ GC νμλ β |
μ μ 리μμ€λ μ μ€λ μΊμνλμ? | λ°λμ§ μκΈ° λλ¬Έμ λ€μ λ°μ νμ μμ |
λμ νμ΄μ§λ μ μΊμνλ©΄ μ λλμ? | μ¬μ©μλ§λ€ κ²°κ³Όκ° λ€λ₯΄κΈ° λλ¬Έμ 보μ μν μμ |
ETagλ λκ°μ? | 리μμ€ λ³κ²½ μ¬λΆ νμΈμ© κ³ μ ID (λ³κ²½ μ μ μμ² νμ©) |
β λ§λ¬΄λ¦¬ μμ½ν
νλͺ© | μ€λͺ | λ©λͺ¨λ¦¬ ν¨κ³Ό |
---|---|---|
Cache-Control | μΊμ μ¬λΆ/μκ°μ μ§μ νλ HTTP ν€λ | μ¬μμ² λ°©μ§λ‘ λ©λͺ¨λ¦¬ β |
μ μ 리μμ€ | μΊμ μ κ·Ή μ¬μ© (max-age ) |
μλ² μμ² κ°μ, GC μ€μ΄λ¦ |
λμ νμ΄μ§ | λ―Όκ° μ 보λ no-store μ€μ |
보μ κ°ν, GC μ λ κ°λ₯ |
GC κ΄μ | μΊμλ‘ μΈν΄ μμ±λλ κ°μ²΄ β | Full GC νμ κ°μ |
β PART 4.3 보μ + λ©λͺ¨λ¦¬ κ΄μ : XSS/CSRF vs νν° μ²λ¦¬ ꡬ쑰
π’ 1λ¨κ³. νν°(Filter)λ λμΌ? μ€νμλ μ΄ν΄νλ ν΅μ¬ κ°λ
π¬ νν°(Filter)λ μΉ μμ²(Request)κ³Ό μλ΅(Response) μ¬μ΄μμ
μ€κ°μ λΌμ΄λ€μ΄μ κ²μ¬νκ±°λ κ°κ³΅νλ μλ° μ½λμΌ.
π¦ λΉμ
[μ¬μ©μ μμ²] β (π‘οΈ νν° κ²μ¬) β 컨νΈλ‘€λ¬ μ€ν β (π‘οΈ νν° λ§λ¬΄λ¦¬ μ²λ¦¬) β μλ΅
μλ₯Ό λ€μ΄:
- λκ΅°κ° λ‘κ·ΈμΈλ μ νκ³ κΈμ°κΈ° νμ΄μ§ λ€μ΄μ€λ €κ³ ν΄ β π« νν°μμ μ°¨λ¨!
- λκ° μ΄μν μ€ν¬λ¦½νΈ(XSS) λ£μΌλ €κ³ ν΄ β βοΈ νν°μμ μ κ±°!
β νν° λμ ꡬ쑰
public class MyFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// π‘ μμ² κ°λ‘μ±κΈ°
System.out.println("μμ² μ μ²λ¦¬");
chain.doFilter(request, response); // π λ€μ λ¨κ³λ‘ μ λ¬
// π‘ μλ΅ κ°λ‘μ±κΈ°
System.out.println("μλ΅ ν μ²λ¦¬");
}
}
π§ 2λ¨κ³. νν° μ²΄μΈ(Filter Chain)μ λ©λͺ¨λ¦¬ νλ¦
β FilterChainμ΄λ?
μ¬λ¬ κ°μ νν°κ° μμλλ‘ μ€νλκ² ν΄μ£Όλ νν° μ°κ²° κ³ λ¦¬
π μμ νλ¦ (3κ° νν°κ° μμ λ)
[μ¬μ©μ μμ²]
β AuthFilter
β XSSFilter
β EncodingFilter
β Controller μ€ν
β μλ΅ μ²λ¦¬
β μλ΅ μ²λ¦¬
β μλ΅ μ²λ¦¬
π§ λ©λͺ¨λ¦¬ νλ¦ μ€λͺ
νλͺ© | μ€λͺ |
---|---|
νν° κ°μ²΄ | μλ² μμ μ 1λ²λ§ μμ± (μ±κΈν€) |
Request/Response κ°μ²΄ | μμ²λ§λ€ μμ± (λ§€ μμ²λ§λ€ μ κ°μ²΄) |
νν° μ²΄μΈ μ€ν μ | κ° νν°κ° request/response κ°μ²΄λ₯Ό μ°Έμ‘°νκ±°λ κ°μΈμ μ λ¬ |
β μμ²μ΄ λ§μμ§λ©΄ νν°κ° κ³μ requestλ₯Ό μ‘°μνλ―λ‘ λ©λͺ¨λ¦¬ μ¬μ©λ μ¦κ° κ°λ₯
π 3λ¨κ³. XSS/CSRF 보μ νν° κ΅¬ν ꡬ쑰
β XSS (Cross Site Scripting)λ?
π₯ μ¬μ©μκ° μ λ ₯ν κ°μ
λ€λ₯Έ μ¬μ©μμ λΈλΌμ°μ μμ μ€νλκ² νλ 곡격
μμ 곡격 μ½λ:
<input value="<script>alert('ν΄νΉ!')</script>">
β
λ°©μ΄ λ°©λ²: μ
λ ₯κ°μμ <
, >
, "
λ±μ νν°λ‘ μ°¨λ¨
public class XSSFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// β
κ°μΌ request κ°μ²΄λ₯Ό μ λ¬
chain.doFilter(new XSSRequestWrapper((HttpServletRequest)request), response);
}
}
β XSSRequestWrapper μμ
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
return sanitize(value);
}
private String sanitize(String input) {
return input.replaceAll("<", "<").replaceAll(">", ">");
}
}
β λ©λͺ¨λ¦¬ μΈ‘λ©΄ ν΅μ¬
νλͺ© | μ€λͺ |
---|---|
Wrapper κ°μ²΄ | μμ²λ§λ€ μλ‘ μμ±λ¨ (XSSRequestWrapper ) |
λ©λͺ¨λ¦¬ μ¦κ° | μμ² μκ° λ§μμλ‘ Wrapper κ°μ²΄λ λ§μμ§ |
GC μν₯ | μλ΅ ν GC λμμ΄ λμ§λ§, μλ΅ μ€ μ€λ₯ λ°μ μ λμ κ°λ₯μ± μ‘΄μ¬ |
β CSRF (Cross Site Request Forgery)λ?
π₯ μ¬μ©μκ° λͺ¨λ₯΄κ² λ€λ₯Έ μ¬μ΄νΈμμ μμ‘°λ μμ²μ 보λ
μ: λ‘κ·ΈμΈ μνμμ 곡격μκ° μλ μμ²μ λ³΄λ΄ λ°μ΄ν° μμ
β λ°©μ΄ λ°©λ²: CSRF ν ν°μ λ°κΈνκ³ , μμ² μ κ²μ¦
String token = UUID.randomUUID().toString();
session.setAttribute("CSRF_TOKEN", token);
- μμ²ν λ
<input type="hidden" name="csrf_token" value="...">
- μλ² νν°μμ ν ν° λΉκ΅ν΄μ λ§μΌλ©΄ ν΅κ³Ό, μλλ©΄ μ°¨λ¨
π§ νν°μμ 보μ κ²μ¬ μ μ£Όμν λ©λͺ¨λ¦¬ ν¬μΈνΈ
νλͺ© | μ€λͺ |
---|---|
XSS νν° | λ§€ μμ²λ§λ€ request λνΌ κ°μ²΄ μμ± β GC λΆλ΄ μ£Όμ |
CSRF νν° | μΈμ μ ν ν° μ μ₯ β μΈμ λ©λͺ¨λ¦¬ λλΉ λ°©μ§ νμ |
λ€λ¨κ³ νν° κ΅¬μ‘° | FilterChainμ΄ κΉμμλ‘ μλ΅ μλ/λ©λͺ¨λ¦¬ μλΉβ |
π 4λ¨κ³. λ©΄μ ν¬μΈνΈ μ 리
μ§λ¬Έ | λͺ¨λ² λ΅λ³ ν¬μΈνΈ |
---|---|
νν°λ λ©λͺ¨λ¦¬μ μΌλ‘ μ΄λ€ ꡬ쑰μΈκ°μ? | νν° μ체λ μ±κΈν€, request/responseλ μμ²λ§λ€ μλ‘ μμ±λ¨ |
XSS νν°λ μ΄λ»κ² λμνλμ? | requestλ₯Ό κ°μΈλ Wrapper κ°μ²΄λ₯Ό λ§λ€μ΄ input κ°μ μ λ¦¬ν¨ |
νν° μ²΄μΈμ μ΄λ»κ² μλνλμ? | μ¬λ¬ νν°κ° μμλλ‘ μ°κ²°λμ΄ νλμ© μμ²μ μ²λ¦¬νκ³ λκΉ |
νν°κ° λ§μμ§λ©΄ μ΄λ€ λ¬Έμ κ° μκΈ°λμ? | μ²λ¦¬ μκ° μ¦κ° + μμ² κ°μ²΄κ° κ³μ κ°μΈμ§λ―λ‘ λ©λͺ¨λ¦¬ λΆνβ |
보μ νν°λ₯Ό λ§λ€ λ μ£Όμν μ μ? | μ°λ λ μΈμ΄ννκ² μ€κ³νκ³ , Wrapper κ°μ²΄ μλͺ μ£ΌκΈ° κ³ λ € |
β λ§λ¬΄λ¦¬ μμ½ν
νλͺ© | μ€λͺ | λ©λͺ¨λ¦¬ μν₯ |
---|---|---|
Filter | μμ² μ /νμ μ€νλλ κ²μ¬κΈ° | κ°μ²΄ κ°μΈκΈ° λ§μμ§λ©΄ λ©λͺ¨λ¦¬ μ¬μ© β |
FilterChain | μμ°¨ μ°κ²° ꡬ쑰 | νν° λ§μμλ‘ μ€ν κΉμ΄ β |
XSS Wrapper | μμ²λ§λ€ μμ± | μ 리 μ νλ©΄ λμ κ°λ₯ |
CSRF ν ν° | μΈμ μ μ μ₯ | μ ν¨ μκ° μ ν μ€μ νμ |